Linux 7.2 合并窗口已随着 7.1 内核的发布正式开启。截至目前,已有超过 7,000 个非合并变更集(non-merge changesets)被拉取到主线中。随着大多数核心子系统(Subsystems)的合并完成,7.2 版本的技术轮廓已经清晰。
本届合并窗口的关键词非常明确:消除技术债、打破多核并发瓶颈、以及推进向 Rust 语言和现代硬化安全的演进。
以下是本次合并窗口中最显著的变化,以及每个变化背后的技术背景与原因解释:
一、 特定架构相关(Architecture-specific)
1. 移除了更多 i486 特定支持与 1.3 万行 FPU 模拟代码
- 解释与原因: 现代 x86 处理器早已全线标配硬件浮点运算单元(FPU)。i486 时代缺乏 FPU 的老旧芯片在如今的 Linux 运行场景中已几近绝迹。移除这 1.3 万行复杂的软件模拟代码,不仅减轻了内核体积,还消除了维护这些古董代码带来的测试负担。此外,曾用于 OLPC XO-1 电脑的 AMD Geode 处理器也因无人维护被标记为孤儿(orphaned)。
2. Intel TDX(可信域扩展)支持热更新
- 解释与原因: TDX 是 Intel 提供的硬件级机密计算技术。在 7.2 中,内核引入了全新的设备类型来管理该模块,并支持在不重启系统的情况下热更换该模块。原因在于: 处于运行状态的云服务器和数据中心对高可用性要求极高,支持热更新意味着可以在不中断业务的前提下,随时为机密计算环境修补严重的安全漏洞。
3. s390 架构正式获得 Rust 支持
- 解释与原因: s390(IBM Z 系列大型机)架构是企业级关键业务的基石。继 x86_64 和 arm64 之后,s390 成为又一个迎来 Rust 语言的重型架构,这标志着 Linux 内核利用 Rust 提升底层安全性的战略正在加速向企业级核心硬件推进。
4. arm64 数据区域隔离(暂被回退)
- 解释与原因: 该改动旨在将 arm64 内核的数据区域从"全内存线性映射"中剥离。原因是为了防御硬件漏洞或内存溢出攻击(一旦被隔离,黑客就无法通过猜测线性地址来直接篡改内核数据)。但由于该改动引发了 KVM 虚拟化的性能衰退(regression),本着"不能破坏既有功能"的原则,目前暂时将其回退,等待完善后再行合并。
5. 移除了 PowerPC 的硬件优化 MD5 哈希实现
- 解释与原因: PowerPC 是内核中唯一为 MD5 提供硬件级加速的架构。原因在于: 现代密码学早已证实 MD5 存在严重的安全缺陷(易受到碰撞攻击),内核各处正在逐步停用 MD5。保留硬件加速代码没有实际意义,因此予以清理。
二、 BPF 技术的演进与突破
1. 允许附加到 tracepoints 的 BPF 程序发生故障(Fault)
- 解释与原因: 过去,跟踪点(tracepoints)上的 BPF 程序在尝试访问用户空间内存时,如果发生页面错误(page fault)会导致内核异常。现在允许其发生故障,原因是为了让可观测性工具能够更可靠、更大胆地抓取用户空间的数据,而不用担心把内核搞崩溃。
2. bpf() 系统调用扩展"通用属性"支持与参数限制解除
- 解释与原因: 扩展通用属性初期用于控制子命令的日志记录;同时,BPF 函数和 kfuncs 最多 5 个参数的硬性限制被解除(多余参数允许压入栈中)。原因在于: 随着 BPF 承载的业务越来越复杂,开发者急需更强大的调试手段(更细粒度的日志)和更灵活的编程能力。
3. 安全访问 BPF 内存池(Arenas)与可调大小的哈希映射
- 解释与原因: 内核代码现在可以安全访问 BPF arenas 而不必担心页面错误;同时 BPF 哈希映射打破了创建时固定桶数量的限制,支持动态调整大小。原因是为了显著提升 BPF 在高并发、大吞吐网络或安全过滤场景下的运行效率和内存灵活性。
三、 核心内核与调度器重构
1. /proc/interrupts 性能重构
- 底层原因剖析: 每一个 CPU 核心在处理网卡收包或硬盘读写时都会产生中断,Linux 会记录这些中断次数。在旧实现中,由于各个 CPU 的计数器在内存中挨得太近,在超多核服务器上会导致计算机体系结构中经典的 伪共享(False Sharing) 问题------即多个核心频繁为了更新自己的计数器而导致彼此的 CPU 缓存行(Cache line)频繁失效。过去开发者对其做过无数次微优化,但底层不改,瓶颈就在。这次重构彻底调整了内存布局,收割了这块"低垂的果实",大幅提升了超多核系统下的并发性能。
2. 合并缓存感知负载均衡(Cache-aware load-balancing)
- 解释与原因: 调度器现在会尝试将共享某些硬件资源(如 L3 缓存)的进程归类到同一个缓存域中。原因在于: 在 NUMA 架构或多核 CPU 中,如果互相关联的进程在不同的 CPU 核心间反复跳跃,会导致缓存命中率暴跌;让它们"抱团"留在同一个缓存域内,能带来显著的性能飞跃。
四、 文件系统与块 I/O
1. 支持通过 file_getattr() 导出文件系统大小写敏感度
- 解释与原因: 引入了
FS_XFLAG_CASEFOLD(大小写折叠)和FS_XFLAG_CASENONPRESERVING(大小写不保留)两个新标志。原因主要是为了完美支持 Windows NFS 客户端。Windows 系统习惯了不区分大小写的传统,而 Linux 默认严格区分,此项优化能让跨平台的文件共享更加平滑。
2. openat2() 系统调用引入 O_EMPTYPATH 与 OPENAT2_REGULAR 标志
- 解释与原因:
O_EMPTYPATH允许通过空路径重新打开一个O_PATH文件描述符;OPENAT2_REGULAR则规定如果目标不是普通文件(例如是个软链接或设备文件)则直接报错EFTYPE。这是非常关键的安全硬化特性,能够彻底防止某些恶意程序通过制造"符号链接陷阱"来诱骗高权限服务打开本不该打开的特殊文件。
3. Btrfs 默认使用大页(Large Folios)并实验性支持 2MB 巨型页
- 解释与原因: Folio 是 Linux 内存管理的新一代抽象。Btrfs 默认开启大页,原因是为了减少内存页表管理的开销(TLB 缓存未命中),从而极大提高大文件连续读写的吞吐量。
五、 网络子系统优化
1. TCP 认证选项(TCP-AO)重构引入 libcrypto
- 底层原因剖析: TCP-AO 是用于保护 BGP 等核心路由协议免受欺骗攻击的安全机制。早期的实现直接对接了内核复杂的旧加密子系统,代码为了兼容各种古老、现代网络根本用不到的加密算法而变得非常臃肿。近年来内核一直在推进轻量级加密库
libcrypto的建设,这次切换不仅精简了代码、消除了历史包袱,更提升了执行效率。
2. 多路径 TCP(MPTCP)子流数量上限提升至 64
- 解释与原因: 最大子流(Subflows)数量从 8 个猛增至 64 个。原因是为了应对现代复杂的多链路网络环境(如 5G + Wi-Fi + 卫星等),允许更细粒度的流量聚合与容灾切换。
3. 持续推进网络栈去锁工作(减少 rtnl_lock)
- 底层原因剖析:
rtnl_lock是 Linux 网络路由和链路配置的"大粗锁"。在早期的单核或少核时代,修改网络配置先拿这把锁没有问题。但在如今动辄拥有几十万个容器、数万虚拟网卡的现代云原生环境下,无数进程同时配置网络时,大家都去抢同一把大锁,导致多核处理器的并发优势瞬间归零,网络控制面延迟暴增。社区持续将这把大锁拆解为针对特定网卡或表项的"细粒度锁",以彻底释放多核并行的威力。
4. 彻底移除老旧协议与设备支持(AppleTalk, ATM, ISA/PCMCIA 等)
- 底层原因剖析: 内核开发者常说"删代码比写代码更快乐"。移除 AppleTalk(苹果 80 年代的老局域网协议)、ATM、ISA 和 PCMCIA 驱动,根本原因在于硬件早已绝迹,且维护成本极高。每次核心架构升级(如上述的去锁工作),开发者都不得不小心翼翼地去兼容这些几十年没人碰的古董代码。此外,这些长期无人维护的代码往往潜藏着缓冲区溢出等安全隐患,将它们"扫地出门"是最彻底的安全硬化手段。
六、 安全与内核内部变更
1. Slab 分配器引入 Clang 分配令牌(Allocation Tokens)
- 解释与原因: 该机制允许内核利用编译器的令牌隔离不同类型对象的内存放置。原因是为了防御堆溢出漏洞的利用(Exploit):在过去,黑客可以通过溢出 A 类型对象去精准覆盖紧随其后的 B 类型对象;实施隔离后,不同类型的对象互不干扰,大大提高了漏洞利用的门槛。
2. 废弃并弱化 AF_ALG 机制
- 解释与原因:
AF_ALG允许用户空间直接调用内核的加密硬件加速。7.2 中移除了硬件加速支持,仅留软件实现,并计划未来彻底删除该接口。原因在于: 该接口近年来频频暴露出严重的安全漏洞,而现代用户空间(如 OpenSSL)自身的软件加密速度已经足够快,没必要为了微小的收益让内核承担巨大的安全风险。
3. 内核升级 Rust 工具链与引入 zerocopy crate
- 解释与原因: 构建内核所需的 LLVM 最低版本提高至 17.0.1;同时引入了专注于内存操作原语的 Rust
zerocopycrate,并带来了"高阶生命周期类型"。原因是为了在驱动开发中更严密地借助 Rust 编译器的生命周期检查,从根本上隔离不安全代码,杜绝驱动程序中常见的"释放后使用(Use-After-Free)"等内存安全顽疾。
总结
Linux 7.2 的合并窗口预计将一直开放至 6月28日。目前在 linux-next 分支中还有 6,000 多个变更集在排队。从已合并的内容来看,Linux 7.2 并不是一个一味堆砌新功能的变化,而是一个深挖底层性能潜力(去锁、重构中断)、勇于切除历史毒瘤(废弃老协议与危险接口)、并积极拥抱 Rust 安全未来的笃定演进版本。
