本次 Linux 7.0 合并窗口上半场已引入多项重要变更,虽无惊天动地的革新,但一系列渐进式改进正稳步提升内核的性能、安全性与可维护性。
特定架构相关
- 内核现在对提供相应功能的 Arm CPU 支持原子的 64 字节加载和存储操作。
核心内核
- Rust 支持正式脱离实验阶段。Rust 将长期存在,不过各个子系统的维护者仍有权决定是否在其子系统中引入 Rust。
- BPF 可用于过滤
io_uring 操作。这一变化提供了一种在 io_uring 操作上实施沙箱机制的潜在方法。考虑到 seccomp() 无法阻止单个 io_uring 操作,使用基于 seccomp() 沙箱的管理人员通常会完全禁用 io_uring。
- 用户现在可以选择使用非循环
io_uring 队列,以便在请求通常在提交系统调用返回前就已完成的应用中获得更好的缓存性能。在循环队列中,存储新消息的槽位会在内存中持续推进直到回环,这会导致缓存剧烈波动。而非循环队列会在队列为空时重置指针,有望将队列的起始内存保留在缓存中。
- 在 BPF 类型格式(BTF)调试信息中查找类型现在改用二分查找,这将提高加载 BPF 程序的效率。
- 正如 1 月份所报道的,BPF kfuncs 现在可以接受隐式参数。
- 调度器已更改为在大多数架构上仅支持两种抢占模式:
PREEMPT_LAZY 和 PREEMPT_FULL。只有完全不支持抢占的架构仍可配置 PREEMPT_NONE,且只有不支持延迟抢占(lazy preemption)的架构可以配置 PREEMPT_VOLUNTARY。
- 针对可重启动序列(restartable sequences)的时间片扩展提案已经被合并。这一变化允许那些在时间片结束时即将完成锁操作的进程请求一个简短的宽限期,以便完成工作并释放锁。
- 对于在工作队列(workqueue)停滞时需要触发内核恐慌(panic)的系统,管理员可以设置一个新的编译时配置选项来强制执行该行为。
- 已弃用的基于
linuxrc 的初始 RAM 磁盘(initrd)代码已被移除。其他 initrd 代码计划于 2027 年移除,届时 initramfs(在 RAM 中使用文件系统而非磁盘镜像)将成为引导内核的唯一受支持方式。
文件系统和块 I/O
- 对文件修改时间的非阻塞更新现在终于可以正常工作了。以前,它们会无条件返回
-EAGAIN;现在,只有在文件系统确实会阻塞时才会返回该错误。这使得非阻塞直接写入(direct write)在具有细粒度时间戳的文件系统上变得可行。
- 文件系统不再默认实现租约(lease),而是必须主动选择开启(opt-in)。这解决了由于在从未设计处理租约的文件系统上提供该功能而引发的一系列问题。大多数流行文件系统都实现了租约,但例如 9p 和 cephfs 则没有。
- 历史上,文件系统报告错误的方式各不相同,互不兼容。一组新的辅助函数使得文件系统能够更轻松地以一致的方式向
fsnotify 报告错误。
- 引入了一个新的文件系统——“nullfs”,用于作为 Linux 系统的根文件系统。它是不可变的且完全为空,不包含任何数据。这简化了引导过程,因为用户空间可以在其之上挂载其他文件系统,然后使用
pivot_root() 系统调用将这些文件系统设为新的根,而无需清理 initramfs 的内容并重用根文件系统。
- 为了支持用户空间检查点/恢复(CRIU),
statmount() 系统调用现在可以报告与文件描述符关联的挂载信息。
- EROFS 维护者默认启用了 LZMA 压缩,并将 DEFLATE 和 Zstandard 压缩标记为不再是实验性的。该文件系统还实现了在不同的 EROFS 文件系统之间共享相同文件的页缓存(page-cache)条目。
- 需要对数据计算校验和或奇偶校验的文件系统现在可以使用弹跳缓冲区(bounce buffer)在直接 I/O 期间存储数据副本。
- Btrfs 现在支持块大小超过系统页大小时的直接 I/O。
- XFS 的自主自愈(self-healing)支持已经合并。
硬件支持
- GPIO 和引脚控制:ROHM bd72720 GPIO 设备。
- 图形:CSW MNE007QB3-1 面板、AUO B140HAN06.4 面板、AUO B140QAX01.H EDP 面板、Sitronix ST7920 面板、Samsung LTL106HL02 面板、LG H546WF1-ED01 面板、HannStar HSD156J 面板、BOE NV130WUM-T08 面板、Innolux G150XGE-L05 面板、Anbernic RG-DS 面板、RK3368 HDMI 控制器、RK3506 芯片、Genio 510/700/1200-EVK HDMI 输出,以及 Radxa NIO-12L HDMI 输出。
- 硬件监控:MT8196 和 MT7987 Mediatek 热传感器、RZ/T2H 和 RZ/N2H Renesas 热传感器、HiTRON HAC300S 电源、Monolithic MP5926 热插拔控制器、STEF48H28 热插拔控制器、Pro WS TRX50-SAGE WIFI A 和 ROG MAXIMUS X HERO 芯片、Dell OptiPlex 7080 计算机、F81968 I/O 芯片、ASUS Pro WS WRX90E-SAGE SE 芯片、SHT85 传感器、P3T1035 温度传感器,以及 P3T2030 温度传感器。
- 媒体:TI 视频输入端口、os05b10、s5k3m5 和 s5kjn1 摄像头传感器,以及 Synopsys CSI-2 接收器。
- 杂项:Renesas RZ/V2N SoC 和 Rock Band 4 PS4 及 PS5 吉他、ATCSPI200 SPI 设备、AXIADO AX300 SPI 设备、NXP XPI SPI 设备,以及 Renesas RZ/N1 SPI 设备。
- 网络:Huawei hinic3 PF 以太网卡、Motorcomm YT6801 PCIe 以太网控制器、MaxLinear MxL862xx 交换机、RealTek RTL8127ATF 10G Fiber SFP 网卡、RZ/G3L GBETH SoC 网卡和 QCC2072 WiFi 芯片组。
- 电源:Maxim MAX776750 PMIC、Realtek RT8902 电平转换器、Samsung S2MPG11 PMIC,以及 Texas Instruments TPS65185 PMIC。
- 音频:NXP i.MX952 应用处理器、Realtek RT1320 和 RT5575 音频编解码器,以及 Sophogo CV1800B 芯片。
杂项
- vDSO 现在提供了 64 位版本的
clock_getres()。
- 在此版本中,内核支持具有并行传输的多个数据通道的 SPI 设备。
安全相关
- SELinux 现在可以控制 BPF 令牌(token)访问。BPF 令牌允许非特权进程执行某些特权 BPF 操作。
- 内核支持 ML-DSA 后量子签名(post-quantum signatures),并可以使用它们来验证内核模块。
- 使用涉及 SHA-1 哈希方案签署内核模块的选项已移除,尽管目前内核仍能加载以此方式签署的模块。
NETFILTER_PKT 审计记录现在包含源端口和目的端口号以供检查。
虚拟化和容器
- 容器运行时可以使用新的
OPEN_TREE_NAMESPACE 选项来开启一个新的挂载命名空间(mount namespace),而无需克隆现有的挂载命名空间。这有望在具有大量挂载点的系统上加快新容器的启动速度。
内核内部变化
- RCU 任务追踪(task traces)的重新实现导致
rcu_read_lock_trace() 和 rcu_read_unlock_trace() 函数被弃用。
- 内核增加了一项关于工具生成内容的官方政策。为了鼓励工具本身遵守该政策,还增加了针对大语言模型(LLM)的文档。
kmalloc_*() 系列函数(根据所需大小分配)在本次发布周期中准备被替换为 kmalloc_obj_*() 函数(根据提供的类型分配)。新函数既能减少对象长度计算错误,也为可能的基于类型的内核加固提供了支持。
- 进行了一系列 Rust 更改,以使用最近引入的
syn crate 来实现宏——讽刺的是,这些更改通过清理之前的临时宏定义,实际上减少了内核中 Rust 代码的总量。
- 移除了对 Sparse 上下文分析(用于发现锁定漏洞,尽管效果不佳)的支持,转而采用 Clang 22 中基于编译器的上下文分析。基于编译器的分析有望以更低的误报率捕获更多的锁定漏洞。
- 内核的编译配置有了新的语法糖: “depends on X if Y”,代表 “depends on X || !Y”。
- Sheaf 缓存现在全部改为 per-CPU 缓存,这一变化已酝酿近一年。此举减少了从内核 slab 分配器分配新页面时产生的跨 CPU 争用。
- s390 机器现在拥有与其他架构相同种类的毒性指针(poison pointers)(在 s390 上十六进制值为
0xdead000000000000),这使得内核能够追踪来自网络页面池(page pool)的 DMA 映射等信息。
- DRM 子系统暂时放弃了与内核调试器(kgdb)的集成。此举是因为在现代硬件上支持 kgdb 极其困难。
- 新的
__counted_by_ptr() 注解用于标记结构体中指定指针后对象长度的成员,就像 __counted_by() 对结构体中的数组所做的那样。
合并窗口尚未过半,因此按照惯例,在 2 月 22 日窗口关闭后(如果一切按计划进行),还会有一篇后续文章。不过目前看来,7.0 版本的发布延续了近期 Linux 版本的趋势:充满了渐进式的改进,而没有巨大的变革。有一项未能进入本次发布的内容是对 C 语言中可撤销驱动程序接口的支持;该补丁集可能会推迟到 7.1,或者面临更强烈的阻力。
LWN 评论概述:
讨论主要集中在内核版本号的命名逻辑、抢占模式的重大变化以及新引入的 nullfs 的实际用途上。有用户指出,主要版本号的提升往往只是为了避免次要版本号过大,但也引发了对未来版本号枯竭的担忧;同时,PREEMPT_LAZY 的引入被认为是过去二十年来发行版默认抢占模式的重要转变。此外,还有开发者对 nullfs 简化引导过程的具体机制表示了好奇,特别是关于它在 pivot_root 之后对 initramfs 清理的影响。
欢迎在 云栈社区 继续探讨关于 Linux 内核开发的更多技术细节。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
|