关注了就能看到更多这么棒的文章哦~
The rest of the 6.2 merge window
By Jonathan Corbet
December 27, 2022
DeepL assisted translation
https://lwn.net/Articles/918146/
今年,世界收到了从 Linus Torvalds 来的一份特殊的圣诞礼物:6.2-rc1 kernel prepatch。在合并窗口关闭之时,已经有 13,687 个 non-merge changeset 被拉入 6.2 版本 mainline。这是自 2021 年中期的 5.13(带来了 14.231 个 changeset)以来最繁忙的一个合并窗口,比 6.1 要繁忙得多,但跟 5.x 后期的版本相当。这些 changeset 中有不到 4000 个是在上半部分总结写完后合入的,从这些晚到的 patch 中可以发现相当多的重大改动。
在 6.2 合并窗口的后半部分,最重要的变化包括:
Architecture-specific
内核现在可以对返回堆栈缓冲区进行填充(return stack buffer stuffing),从而缓解在某几代的英特尔处理器上的 Retbleed 投机执行漏洞,性能损失更小。
x86 架构也支持了名为 FineIBT 的控制流完整性(control-flow integrity)机制。
PowerPC 架构新实现了 qspinlock;应该能提供更好的性能,并修复一些极端情况下的死锁问题。
LoongArch 已经支持了 ftrace、suspend、休眠(hibernation)和堆栈保护(stack protection)。
Core kernel
zram 设备现在可以对数据流进行重新压缩,从而达到更好的压缩率;详情请参见文档 commit。
共享的匿名内存区域(shared anonymous memory areas)现在可以有名字了;这项功能扩展了当前的 memory-naming 功能,以前它只能用于 private memory。
新增 trace_trigger= 这个命令行选项,可以在启动时就启用 tracing trigger。
Filesystems and block I/O
新增一组 sysfs 开关,可以用来微调系统的 page cache 中有多少可以用于那些主动会被写到特定设备的 page。详细情况请参见 strict_limit、max_bytes、min_bytes、max_ratio_fine 和 min_ratio_fine 的文档提交。
F2FS 文件系统新增了一个 "atomic replace "的 ioctl() 操作,可以使用一个原子操作就完成向文件写入数据并进行 truncate(截断)。F2FS 还增加了一个 block-based extent cache,可以用来确定哪些数据是热的(频繁被使用的),哪些是冷的;相关 commit 中包含了一些信息。
ntfs3 文件系统有一些新的 mount 参数,首先是目前还没有文档记录的 nocase,它似乎是为了控制是否在 lookup 中忽略大小写。windows_name 参数是用来防止创建 Windows 不允许的文件名,hide_dot_files 控制文件名以". "开头的文件是否被标记为隐藏。
Hardware support
Industrial I/O。Analog Devices MAX11410 和 AD4130 模数转换器、MediaTek MT6370 模数转换器、Kionix KX022A 三轴数字加速度计、Maxim MAX30208 数字温度传感器、Analog Devices AD74115H I/O 控制器以及 Analog Devices ADF4377 微波宽频合成器。
Miscellaneous。微软 Azure 网络适配器、Baikal-T1 PCIe 控制器、Ampere Computing SMPro 错误监视器、Lattice sysCONFIG SPI FPGA 管理器、研华嵌入式控制器看门狗定时器、瑞萨 R-Car S4-8 以太网 SERDES PHY、TI TPS65219 电源管理 IC 和 Xilinx R5 远程处理器。
还有:"iommufd "是一个新的用户空间 API,用于控制 I/O 内存管理单元;详见 Documentation/userspace-api/iommufd.rst。
Miscellaneous
和往常一样,perf 工具获得了很多改进;详情请见 merge message 以及一封引起了 Torvalds 的愉快回应的邮件。
copyleft-next license 已被认定给内核贡献时可以使用的有效许可证 —— 但是必须要同时采用一个 GPL 兼容的 license 进行双重许可。
Security-related
内核现在可以设置有多少次 OOPS 或 warning (上限默认为 10000 次)之后才会 panic 并且 reboot。
TIOCSTI ioctl() 操作会把数据送到 terminal device 上,然后这些数据将被读取到,就像用户刚刚输入的一样。正如人们可以想象得到的,这个操作恶意攻击者会很有用。不过,似乎目前几乎还没有人这样做。在 6.2 中,内核新增了一个配置选项和 sysctl 开关可以完全禁用这个功能。
Internal kernel changes
新增 struct encoded_page 类型,用来把那些利用指针变量的低几个 bit 来获取一些相关信息的做法封装起来。这个类型是由 Torvalds 创建的,用来增加类型安全,并防止在没有去除掉这些额外 bit 的情况下就意外地对这个指针进行引用。没有文档,但这个提交很容易都懂。
可敬的 container_of()宏获得了一个新的变种,叫做 container_of_const(),它保留了所传入指针的 const 的特性。在 merge message 里,Greg Kroah-Hartman 这样解释这个宏:
推动这些都是来自 Rust 内核开发者讨论的,如何正确地将 driver core 和 kobject 对象标记为 "non-mutable"。这次的 pull request 中对 kobject 和 driver core 的修改就是为了这个原因来的,因为有很多路径上的 kobject 和 device 指针根本没有被修改过,所以将它们标记为 "const" 就可以由编译器来确保这一点。
所以,Rust 开发工作的一个正面的副作用就是已经帮助对驱动核心代码进行清理,使其更加符合面向对象的规则。
构建内核所需的 binutils 的最低版本已经提高到 2.25。
这次没有成功实现的一个工作就是对线性地址进行屏蔽(linear address masking),这是英特尔的一项功能,允许在指针值中存储额外的数据。Torvalds 抱怨了该功能的实现方式,并拒绝合入这个 patch。因此,这个功能似乎至少要再等一个周期才会出现在 mainline 上。
同时,我们要给 Christian Brauner 颁发一个"广泛的更新日志 "奖,因为他的一个 patch 有 520 行的解释(不包括其中的 stack trace),仅仅是为了一行代码 fix。
通常情况下,6.2 开发周期有望在 2 月 12 日或 19 日结束。Torvalds 认为假期可能会稍微放慢这个发布周期;让我们拭目以待吧。同时,现在是时候开始寻找和修复 bug 了。当然,还是要等内核开发者欢渡假期之后了。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~