经过两个月的开发,Linus Torvalds 发布了内核。 Linux 6.9. 其中最值得注意的变化包括:用于块设备去重和压缩的 dm-vdo 模块、FUSE 中的直接文件访问模式、支持为单个线程创建 pidfd、BPF 令牌机制、支持 ARM64 系统上的 Rust、弃用 Ext2 文件系统、移除旧的 NTFS 驱动程序以及支持 Intel FRED 机制。
新版本包含来自 15680 名开发人员的 2106 个修复,补丁大小为 54 MB(更改影响了 11825 个文件,添加了 687954 行代码,删除了 225344 行代码)。最新版本有来自 15641 名开发人员的 2018 个修复,补丁大小为 44 MB。 42 中引入的所有更改中大约 6.9% 与设备驱动程序相关,大约 17% 的更改与更新特定于硬件架构的代码相关,13% 与网络堆栈相关,7% 与文件系统相关,4% 与文件系统相关。与内部内核子系统相关。
内核6.9的主要创新:
- 磁盘子系统、I/O 和文件系统
- Device Mapper (DM)中添加了新的dm-vdo(虚拟数据优化器)处理程序,它允许您基于现有块设备实现虚拟块设备,具有重复数据去重、数据压缩、消除等功能空块并根据需要增加块设备的大小(精简配置)。这些功能是在块设备级别实现的,不依赖于所使用的文件系统(例如,使用 dm-vdo,您可以自动合并重复数据并以压缩形式存储任何文件系统的信息)。支持使用 dm-vdo 实现最大 256TB 的物理存储以及创建最大 4PB 的逻辑卷。推荐使用lvm来管理vdo分区。 VDO技术由Permabit开发,2017年被红帽收购后开放。
- 在用于在用户空间实现文件系统的FUSE子系统中,添加了“passthrough”模式的初始实现,该模式允许绕过在用户空间运行的进程,直接在内核级别获取文件数据,这可以在某些情况下显着提高性能。例如,以只读模式运行并限制对文件的访问的文件系统的 FUSE 实现可以提供来自源文件系统的文件内容,而无需将它们传输到 FUSE 进程。
- 实现 Ext2 文件系统的驱动程序已移至已弃用的类别。给出的原因是驱动程序仅支持32位inode时间计数器,该计数器将在19年2038月2日溢出。建议使用 ext4 驱动程序来代替 ext2 驱动程序,该驱动程序支持使用 Ext2 文件系统并与其完全兼容,但如果文件系统是,则可以在不受 2038 问题影响的 ext255 分区中使用时间戳。使用大于 2 字节的 inode 创建(在 ext32 驱动程序中,无论 inode 大小如何,都使用 XNUMX 位时间计数器)。
- 从 5.15 版开始,旧的 NTFS 文件系统驱动程序已被删除,并被新的 NTFS3 驱动程序取代。考虑到旧驱动程序已经多年没有更新、处于令人遗憾的状态并且只能在读取模式下工作,因此在内核中提供两个具有 NTFS 实现的驱动程序被认为是不合适的。
- zonefs 和 Hugetlbfs 文件系统中添加了对已挂载文件系统的用户 ID 映射的支持,用于将已挂载的外部分区上的特定用户的文件与当前系统上的另一个用户进行匹配。
- NFSv4 为管理员提供了清除文件打开和锁定状态的能力。
- 对于 Ext4 文件系统,仅记录了错误修复和 kunit 测试更新。
- Btrfs 继续将功能转换为使用页面作品集。
- 在 XFS 文件系统中,我们正在继续努力实现使用 fsck 实用程序在线检查和更正已识别问题的功能,而无需卸载文件系统。
- 在 pwritev2() 系统调用中添加了 RWF_NOAPPEND 标志,允许您指定写入偏移量,即使文件是在仅追加模式下打开的。
- 添加了新的 ioctl 命令: FS_IOC_GETUUID - 返回指定文件系统的 UUID 标识符,FS_IOC_GETFSSYSFSPATH - 确定指定挂载文件系统在 /sys/fs 中的位置。
- efs、qnx4 和 coda 文件系统已转换为使用新的分区安装 API。
- 改进了在不区分大小写模式下执行的文件操作的实现。通过首先执行区分大小写的比较并回退到不区分大小写的搜索来提高性能。在设置为不区分大小写的目录上安装 Overlayfs 的问题已得到解决。
- 内存和系统服务
- 与当前使用的 IDT(中断描述符表)机制相比,已实现对 Intel FRED(灵活返回和事件传递)机制的支持,该机制旨在提高传递低级事件信息的效率和可靠性。通过 IRET 处理器指令返回事件而不是通过 IDT 表传递事件,从而提高了性能并减少了延迟。由于在内核和用户上下文中单独处理事件到达、防止嵌套 NMI 执行以及将所有与异常相关的 CPU 寄存器存储在扩展堆栈帧中,因此提高了可靠性。
- 添加了通过在内核代码中使用命名地址空间来优化对各个 CPU 内核数据的访问的能力,该功能以 GNU C 扩展的形式在 GCC 中实现。
- PIDFD_THREAD 标志已添加到 pidfd_open() 函数中,允许为各个线程创建 pidfd,而不仅仅是在线程组领导者的上下文中使用 pidfd。还提出了一种通过虚拟文件系统访问 pidfd 的伪 FS 的实现。与使用pid识别进程不同,pidfd与特定进程相关联并且不会改变,而PID可以在当前进程终止后与另一个进程相关联。
- BPF 子系统中添加了 BPF 令牌机制,允许您有选择地将特权 BPF 操作的访问权限委托给程序;例如,您可以向非特权应用程序授予对各个 BPF 子系统的访问权限,而无需授予完整的 CAP_BPF 权限。
- BPF 子系统中添加了新的共享内存类型 bpf_arena,它定义了可以在用户空间中的 BPF 程序和进程之间共享的区域。添加了 may_goto 指令,允许您组织可由验证程序中断的循环工作。添加了从 BPF 程序生成任意 TCP SYN cookie 并创建 BPF 处理程序以对抗 SYN 泛洪的功能。
- 继续从 Rust-for- 分支迁移更改Linux与使用 Rust 作为第二语言开发驱动程序和内核模块相关的功能(Rust 支持默认未启用,也不会将 Rust 包含在所需的内核构建依赖项中)。新增了对在 64 位 ARM 处理器上使用 Rust 的支持。已过渡到 Rust 1.76 版本。新增了 `container_of!` 宏。不稳定的 `ptr_metadata` 功能已替换为稳定的 `byte_sub` 方法。新增了包含 `msecs_to_jiffies()` 时间转换函数的 `time` 模块。
- io_uring 子系统中添加了截断文件的功能 (ftruncate_file)。
- 添加了一种新型工作队列 WQ_BH(工作队列下半部),用于在软件中断上下文中执行异步代码,旨在使用而不是过时的微线程。
- 定时器子系统经过了显着的重新设计,其中选择活动CPU核心来执行触发定时器的逻辑得到了改进,以免将不活动核心从睡眠模式中唤醒。
- 已经实现了在运行期间更新核心能耗模型(EM,Energy Model)的能力,例如可以用来考虑运行温度对CPU能效的影响。 em_cpu_energy() 函数的性能得到了显着提升,在固定系统上的测试中速度提高了 1.43 倍,在 RockPi 4B 板上的测试速度提高了 1.69 倍。
- 添加了对基于 ARM64 架构的 LPA2 模式运行系统的支持,具有 52 位虚拟地址空间。
- 对于ARM64系统,已经实现了对连续PTE(页表条目)条目的支持,这通过提高使用TLB(转换后备缓冲区)的效率来提高性能。
- 已采用补丁通过减少 vmalloc() 中并发锁的发生来提高内存管理子系统的性能。
- LoongArch架构实现了内核热补丁机制(live patching),无需重启即可将补丁应用到内核。
- 对于 RISC-V 系统,已实现对 membarrier() 系统调用的支持,这确保为系统中运行的线程安装内存屏障。
- 对可用于构建内核的 LLVM/Clang 版本的要求已提高。现在构建至少需要 LLVM 13.0.1 版本(之前支持 LLVM 11+ 中的构建)。
- “用户跟踪事件”机制允许您从用户进程创建跟踪事件以跟踪用户空间中的活动,并添加了对以各种格式 (USER_EVENT_REG_MULTI_FORMAT) 导出事件信息的支持。
- 函数调用跟踪机制中添加了在跟踪函数退出时跟踪传入函数参数状态的功能。 return 语句的值现在可以与函数调用中使用的参数相匹配。
- perf 实用程序添加了对“集群”输出聚合模式(“perf stat -a —per-cluster”)的支持,用于组合共享资源的统计信息。使用 libcapstone 库反汇编处理器指令的功能(“perf script -F disasm”)已实现。执行“perf report”和“perf annotate”命令时的内存消耗已得到优化。
- 虚拟化和安全
- 增加了针对 Intel Atom 处理器中的 RFDS(寄存器文件数据采样)漏洞的防护,该漏洞允许您从处理器的寄存器文件(RF,Register File)中提取残留信息,这些寄存器用于共同存储所有寄存器的内容同一CPU核心上的任务。阻止该漏洞需要更新微代码,并在从内核返回到用户空间时使用 VERW 指令清除微架构缓冲区的内容。要在加载内核时启用保护,您可以指定“reg_file_data_sampling=on”标志。有关漏洞和保护所需的微代码是否存在的信息可以在文件“/sys/devices/system/cpu/vulnerability/reg_file_data_sampling”中进行评估。
- 增加了对使用 AMD SEV-SNP(安全嵌套分页)扩展的客户系统保护的基本支持,该扩展可安全地处理嵌套内存页表,并防止 AMD EPYC 处理器上的“undeSErVed”和“SEVerity”攻击,这些攻击允许绕过 AMD SEV(安全加密虚拟化)保护机制。 KVM 使用 SNP 所需的更改计划在 6.10 分支中添加。
- 实现了IMA(完整性测量架构)和EVM(扩展验证模块)技术的模块已转移到使用LSM框架(Linux 安全模块),在不损失功能的前提下,显著简化了代码,整合了重复功能,并利用了 LSM 提供的标准功能。IMA 模块旨在利用数字签名和哈希值验证操作系统组件的完整性。EVM 模块保护扩展文件属性 (xattrs) 免受旨在破坏其完整性的攻击(EVM 可防止离线攻击,例如,攻击者可以通过从驱动器启动来修改元数据)。
- 用于列出已加载的 LSM 模块的 lsm_list_modules()、lsm_get_self_attr() 和 lsm_set_self_attr() 系统调用已重写,以更好地兼容 32 位环境 (Linux 安全模块)以及获取/设置 LSM 模块属性。此更改会破坏向后兼容性,但由于新的系统调用是在之前的内核版本中添加的,并且尚未在应用程序中使用,因此 Linus Torvalds 认为此更改可以接受。
- 已尝试恢复使用 UBSAN(未定义行为清理程序)机制。问题的关键在于编译器以不同的方式处理有符号和无符号类型的整数溢出。有符号和指针溢出被归类为未定义行为,而无符号溢出会被截断模 2n,仅保留结果的低位(“环绕”)并且不受未定义行为的影响。为了消除发生未定义行为的情况,内核是使用“-fno-strict-overflow”选项构建的,这会导致对所有整数溢出使用“wrap-around”。使用 -fno-strict-overflow 标志时,GCC 和 Clang 无法正确诊断某些问题,而包含 UBSAN 的目的是与编译器开发人员合作,消除误报并在没有显式检查的地方识别整数溢出。
为了检查可能的溢出,内核使用“var + offset < var”之类的结构(例如,“if (pgoff + (size > PAGE_SHIFT) < pgoff){..}”),这些结构与带有“ -fno-strict“标志-overflow”,并且不覆盖所有可能溢出的代码。问题是,在使用UBSAN时,此类检查导致大量错误警告,因此必须在2021.更新的实现建议使用特殊注释 __signed_wrap 和 __unsigned_wrap,以及带有 add_would_overflow(a, b) 和 add_wrap(a, b) 检查的现成宏,这允许您区分开发人员对整数溢出的预期用途通过引入额外的类型定义来对内核进行更广泛的修改的提议被 Linus Torvalds 拒绝了。
- 网络子系统
- 在网络子系统中,已经做了一些工作来减少竞争锁的发生(“锁争用”,试图获取另一个线程持有的锁)。减少 RTNL 锁的使用。
- 添加了在单个 epoll 调用的上下文中启用对活动套接字轮询的支持的功能。池大小和预算参数可以与系统默认参数分开设置。
- 实现了net_hotdata结构来提高缓存最常用的网络配置变量的效率。
- MPTCP 添加了对设置套接字的 TCP_NOTSENT_LOWAT 选项的支持,该选项允许您限制发送缓冲区的大小。 MCTP 套接字的 API 添加了对网络 ID 的支持,从而可以在一台主机上使用多个不重叠的 MCTP 网络。
- IPSec 添加了对重定向 ICMP 错误消息 (RFC 4301) 的支持。
- 加速了对过期路由的扫描过程。
- 通过更积极地避免大量内存分配来提高 XDP 性能。
- 添加了将元数据附加到 netconsole 消息的功能。
- Netfilter 允许从用户空间定义表,这些表绑定到控制后台进程,并且在用户应用程序终止时不会自动删除。
- 在 nftables 中,向具有合并范围的集合添加元素的速度已经加快。
- Оборудование
- 在 i915 驱动程序中,继续努力实现对 Intel LunarLake (Xe 2) 芯片的支持。为基于 Intel Arrow Lake 和 Alder Lake N 芯片的设备添加了新的 PCI 标识符,并为 Displayport 添加了对 DP 隧道和带宽分配的支持。所有平台均启用快速启动模式。添加了对与各个设备相关的调试输出的支持。
- AMDGPU驱动程序已准备好支持AMD RDNA3.5和RDNA4 GPU。添加了对 ATHUB 4.1、LSDMA 7.0、JPEG DPG、IH 7.0、HDP 7.0、VCN 5.0、SMU 13.0.6、NBIO 7.11、SDMA 6.1、MMHUB 3.3、DCN 3.5.1、NBIF 6.3.1、VPE 6.1.1 和框架 RAS ACA。内核模块中添加了 freesync_video 参数,以启用对使用 FreeSync 自适应同步技术优化视频模式切换的实验支持。
- 在Nouveau驱动程序中,屏幕控制代码已转换为使用kmemdup()函数。
- 基于 Intel Xe 架构的 GPU 的 Xe drm 驱动程序(直接渲染管理器)的工作仍在继续,该驱动程序用于 Intel Arc 系列显卡和集成显卡,从 Tiger Lake 处理器开始。
- 添加了 Mediatek MT8188 VDOSYS1 芯片的 DRM 驱动程序。
- 与视频子系统相关的内核设置已移至 CONFIG_VIDEO 部分。
- 添加了对 ARM64 SoC 的支持:Mediatek MT7981B (Filogic 820)、MT7988A (Filogic 880)、NXP i.MX8DXP、Renesas R8A779G2 (R-Car V4H ES2.0)、R8A779H0 (R-Car V4M)、TI J722S。
- 新增对ARM开发板和设备的支持: Android- 基于 Tegra30 芯片的手机,基于联发科 MT8186 的 Chromebook 机型,基于瑞芯微 RK35xx 的 NAS、平板电脑和游戏机,基于瑞萨 SoC 的 White Hawk 板,基于高通 SM8550(骁龙 8 Gen 2)的板,Apalis 评估板,Sielaff i.MX6 Solo 板,三星 Galaxy Tab 4 10.1 LTE。
- ALSA 音频子系统代码已被重构。添加了对 Microchip SAM9x7、NXP i.MX95 和 Qualcomm WCD939x 声音系统的支持。 SoundWire 驱动程序增加了对采用 AMD ACP 6.3 音频协处理器的 ASoC 的支持,并且已为 Intel 系统实现了 DSPless 模式。添加了对其他 Cirrus HD 音频编解码器的支持。 virtio 驱动程序改进了音频设备管理。
- 添加了对 Marvell Octeon PCI Endpoint NIC VF 和 Intel E825-C 100G 以太网控制器的支持。
与此同时,拉丁美洲自由软件基金会创建了一个完全自由的内核 6.9 版本—— Linux-libre 6.9-gnu 版本已清理固件和驱动程序中包含非自由组件或受限范围代码段的元素。6.9 版本更新了 amdgpu、ath12k、adreno、btusb 和 r8169 驱动程序中的 blob 清理代码。新的 ptp_fc3 驱动程序也已清理。Aarch64 架构的 dts 文件(设备树)中的 blob 名称已清理。修复了 i915 驱动程序清理过程中导致初始化挂起的问题。此外,还对以十六进制转储形式提供的 blob 的处理方式进行了更改。
来源: opennet.ru
