Linux 6.2 内核版本

经过两个月的开发,Linus Torvalds 发布了 Linux 内核 6.2。 最显着的变化包括:允许接受 Copyleft-Next 许可证下的代码、改进 Btrfs 中 RAID5/6 的实现、继续集成对 Rust 语言的支持、减少防止 Retbleed 攻击的开销、添加了在写回期间调节内存消耗的能力,添加了 TCP 平衡 PLB(保护性负载平衡)的机制,添加了混合命令流保护机制(FineIBT),BPF 现在能够定义自己的对象和数据结构,包含了 rv(运行时验证)实用程序,降低了实现 RCU 锁的功耗。

新版本包含来自 16843 名开发人员的 2178 个修复,补丁大小为 62 MB(更改影响了 14108 个文件,添加了 730195 行代码,删除了 409485 行代码)。 42 中引入的所有更改中大约 6.2% 与设备驱动程序相关,大约 16% 的更改与更新特定于硬件架构的代码相关,12% 与网络堆栈相关,4% 与文件系统相关,3% 与文件系统相关。与内部内核子系统相关。

内核6.2的主要创新:

  • 内存和系统服务
    • 允许包含在 Copyleft-Next 0.3.1 许可证下提供的内核代码和更改中。 Copyleft-Next 许可证由 GPLv3 的作者之一创建,与 GPLv2 许可证完全兼容,经 SUSE 和 Red Hat 律师确认。 与 GPLv2 相比,Copyleft-Next 许可证更加紧凑且更易于理解(介绍性部分和过时妥协的提及已被删除),定义了消除违规行为的时间范围和程序,并自动删除过时软件的 Copyleft 要求已超过 15 岁。

      Copyleft-Next 还包含专有技术授予条款,与 GPLv2 不同,该条款使该许可证与 Apache 2.0 许可证兼容。 为了确保与 GPLv2 完全兼容,Copyleft-Next 明确指出,除了原始 Copyleft-Next 许可证之外,还可以在 GPL 许可证下提供衍生作品。

    • 该结构包括“rv”实用程序,它提供了用户空间与 RV(运行时验证)子系统处理程序进行交互的接口,旨在检查高度可靠的系统上的正确操作,以保证不出现故障。 验证是在运行时通过将处理程序附加到跟踪点来执行的,这些跟踪点根据定义系统预期行为的机器的预定参考确定性模型检查实际执行进度。
    • zRAM设备允许交换分区以压缩形式存储在内存中(在内存中创建一个块设备,通过压缩对其进行交换),实现了使用替代算法重新打包页面的能力,以达到更高的水平的压缩。 主要思想是提供几种算法(lzo、lzo-rle、lz4、lz4hc、zstd)之间的选择,在压缩/解压缩速度和压缩级别之间提供自己的折衷方案,或者在特殊情况下进行优化(例如,用于压缩大数据)内存页)。
    • 添加了“iommufd”API,用于从用户空间管理 I/O 内存管理系统 - IOMMU(I/O 内存管理单元)。 新的 API 使得使用文件描述符管理 I/O 内存页表成为可能。
    • BPF 提供了创建类型、定义自己的对象、构建自己的对象层次结构以及灵活创建自己的数据结构(例如链表)的能力。 对于进入睡眠模式 (BPF_F_SLEEPABLE) 的 BPF 程序,添加了对 bpf_rcu_read_{,un}lock() 锁的支持。 实现了对保存 task_struct 对象的支持。 添加了映射类型 BPF_MAP_TYPE_CGRP_STORAGE,为 cgroup 提供本地存储。
    • 对于 RCU(读取-复制-更新)阻塞机制,实现了一种可选的“惰性”回调调用机制,其中使用批处理模式下的计时器一次处理多个回调调用。 通过应用所提出的优化,我们可以通过在系统空闲时间或低负载期间推迟 RCU 请求,将 Android 和 ChromeOS 设备的功耗降低 5-10%。
    • 添加了 sysctl split_lock_mitigate 以控制系统在检测到由于执行原子指令时数据跨越两个 CPU 缓存线而访问内存中未对齐数据时发生的拆分锁时的反应。 这种阻塞会导致性能显着下降。 将 split_lock_mitigate 设置为 0 仅发出存在问题的警告,而将 split_lock_mitigate 设置为 1 还会导致导致锁定的进程减慢,以保留系统其余部分的性能。
    • 为PowerPC架构提出了qspinlock的新实现,它展示了更高的性能并解决了异常情况下出现的一些锁定问题。
    • MSI(消息信号中断)中断处理代码已经过重新设计,消除了累积的架构问题,并添加了对将各个处理程序绑定到不同设备的支持。
    • 对于基于龙芯3 5000处理器采用的LoongArch指令集架构并实现新的RISC ISA的系统,类似于MIPS和RISC-V,实现了对ftrace、堆栈保护、睡眠和待机模式的支持。
    • 提供了为共享匿名内存区域分配名称的功能(以前名称只能分配给分配给特定进程的私有匿名内存)。
    • 添加了新的内核命令行参数“trace_trigger”,旨在激活跟踪触发器,用于绑定触发控制检查时调用的条件命令(例如,trace_trigger=”sched_switch.stacktrace if prev_state == 2”)。
    • 对 binutils 软件包版本的要求已提高。 现在构建内核至少需要 binutils 2.25。
    • 调用 exec() 时,添加了将进程放置在时间命名空间中的功能,其中时间与系统时间不同。
    • 我们已经开始从 Rust-for-Linux 分支转移与使用 Rust 语言作为开发驱动程序和内核模块的第二语言相关的附加功能。 默认情况下,Rust 支持处于禁用状态,并且不会导致 Rust 被包含为必需的内核构建依赖项。 上一版本中提供的基本功能已扩展为支持低级代码,例如 Vec 类型和宏 pr_debug!()、pr_cont!() 和 pr_alert!(),以及过程宏“#[vtable” ]”,它简化了函数指针表的使用。 预计在未来的版本中将在内核子系统上添加高级 Rust 绑定,这将允许在 Rust 中创建成熟的驱动程序。
    • 对于所有体系结构,内核中使用的“char”类型现在默认声明为无符号。
    • 专为内存量较小的系统设计的slab内存分配机制——SLOB(slab分配器)已被宣告过时。 一般情况下建议使用SLUB或SLAB来代替SLOB。 对于内存量较小的系统,建议使用SLUB_TINY模式的SLUB。
  • 磁盘子系统、I/O 和文件系统
    • 对 Btrfs 进行了改进,旨在修复 RAID 5/6 实现中的“写入漏洞”问题(如果在写入过程中发生崩溃并且无法了解 RAID 设备上的哪个块被正确写入,则尝试恢复 RAID,这可能导致块破坏,对应于被覆盖的块)。 此外,SSD 现在会在可能的情况下自动默认启用异步丢弃操作,由于将丢弃操作有效分组到队列中并由后台处理器处理队列,因此可以提高性能。 改进了发送和 lseek 操作以及 FIEMAP ioctl 的性能。
    • 管理块设备延迟写入(写回、更改数据的后台保存)的功能已得到扩展。 在某些情况下,例如使用网络块设备或 USB 驱动器时,延迟写入可能会导致大量 RAM 消耗。 为了控制延迟写入的行为并将页面缓存大小保持在一定限制内,sysfs (/sys/class/bdi/) 中引入了新参数 strict_limit、min_bytes、max_bytes、min_ratio_fine 和 max_ratio_fine。
    • F2FS 文件系统实现原子替换 ioctl 操作,允许您在单个原子操作中将数据写入文件。 F2FS 还添加了块扩展缓存,以帮助识别活跃使用的数据或长时间未访问的数据。
    • 在 ext4 FS 中仅记录了错误更正。
    • ntfs3 文件系统提供了几个新的挂载选项:“nocase”用于控制文件和目录名称的大小写敏感性; windows_name 禁止创建包含对 Windows 无效的字符的文件名; hide_dot_files 控制以点开头的文件的隐藏文件标签的分配。
    • Squashfs 文件系统实现了“threads=”挂载选项,该选项允许您定义并行解压操作的线程数。 Squashfs 还引入了映射已安装文件系统的用户 ID 的功能,用于将已安装外部分区上的特定用户的文件与当前系统上的另一个用户进行匹配。
    • POSIX 访问控制列表 (POSIX ACL) 的实现已重新设计。 新的实现消除了架构问题,简化了代码库维护,并引入了更安全的数据类型。
    • 用于文件和目录透明加密的fscrypt子系统增加了对SM4加密算法(中国标准GB/T 32907-2016)的支持。
    • 已经提供了在不支持 NFSv2 的情况下构建内核的能力(将来他们计划完全停止支持 NFSv2)。
    • 检查 NVMe 设备访问权限的组织已更改。 如果写入进程有权访问设备的专用文件(以前该进程必须具有 CAP_SYS_ADMIN 权限),则提供读取和写入 NVMe 设备的能力。
    • 删除了 CD/DVD 软件包驱动程序,该驱动程序已于 2016 年弃用。
  • 虚拟化和安全
    • Intel 和 AMD CPU 中采用了一种新的针对 Retbleed 漏洞的防护方法,即使用调用深度跟踪,该方法不会像之前针对 Retbleed 的防护那样减慢工作速度。 为了启用新模式,提出了内核命令行参数“retbleed=stuff”。
    • 新增混合FineIBT指令流保护机制,结合使用硬件Intel IBT(间接分支跟踪)指令和软件保护kCFI(内核控制流完整性)来阻止由于使用而违反正常执行顺序(控制流)修改存储在函数内存中的指针的漏洞。 FineIBT 仅在跳转到位于函数最开头的 ENDBR 指令的情况下才允许通过间接跳转执行。 此外,与 kCFI 机制类比,然后检查哈希值以保证指针的不变性。
    • 添加了限制,以阻止操纵“oops”状态生成的攻击,之后有问题的任务完成并在不停止系统的情况下恢复状态。 当大量调用“oops”状态时,会发生引用计数器溢出(refcount),从而允许利用 NULL 指针取消引用引起的漏洞。 为了防止此类攻击,内核中添加了“oops”触发器最大数量的限制,超过该数量后,内核将启动转换到“panic”状态,然后重新启动,这将不允许实现溢出引用计数所需的迭代次数。 默认情况下,限制设置为 10 个“oops”,但如果需要,可以通过 oops_limit 参数进行更改。
    • 添加了配置参数 LEGACY_TIOCSTI 和 sysctl Legacy_tiocsti,以禁用使用 ioctl TIOCSTI 将数据放入终端的功能,因为此功能可用于将任意字符替换到终端输入缓冲区并模拟用户输入。
    • 提出了一种新型内部结构encoded_pa​​ge,其中指针的低位用于存储附加信息,用于防止意外取消引用指针(如果确实需要取消引用,则必须首先清除这些附加位) 。
    • 在 ARM64 平台上,在启动阶段,可以启用或禁用 Shadow Stack 机制的软件实现,该机制用于防止在堆栈上发生缓冲区溢出时覆盖函数的返回地址(保护的本质是在控制权转移到函数后将返回地址保存在单独的“影子”堆栈中,并在退出函数之前检索给定的地址)。 在一个内核程序集中支持 Shadow Stack 的硬件和软件实现,使您可以在不同的 ARM 系统上使用同一个内核,无论它们是否支持指针身份验证指令。 软件实现的包含是通过在加载期间替换代码中的必要指令来实现的。
    • 添加了对在 Intel 处理器上使用异步退出通知机制的支持,该机制允许检测对 SGX enclave 中执行的代码的单步攻击。
    • 提出了一组操作,允许虚拟机管理程序支持来自 Intel TDX(可信域扩展)客户系统的请求。
    • 内核构建设置 RANDOM_TRUST_BOOTLOADER 和 RANDOM_TRUST_CPU 已被删除,取而代之的是相应的命令行选项 random.trust_bootloader 和 random.trust_cpu。
    • Landlock机制允许您限制一组进程与外部环境的交互,增加了对LANDLOCK_ACCESS_FS_TRUNCATE标志的支持,这使得控制文件截断操作的执行成为可能。
  • 网络子系统
    • 对于IPv6,增加了对PLB(保护性负载平衡)的支持,这是一种网络链路之间的负载平衡机制,旨在减少数据中心交换机上的过载点。 PLB通过改变IPv6流标签,随机改变报文路径,以平衡交换机端口的负载。 为了减少数据包重新排序,此操作尽可能在空闲期后执行。 Google 数据中心使用 PLB 后,交换机端口的负载不平衡平均降低了 60%,丢包率降低了 33%,延迟降低了 20%。
    • 添加了支持 Wi-Fi 7 (802.11be) 的 MediaTek 设备的驱动程序。
    • 添加了对 800 Gb 链路的支持。
    • 添加了在不停止工作的情况下动态重命名网络接口的功能。
    • 有关 SYN 洪水的日志消息中已添加了数据包到达的 IP 地址的提及。
    • 对于UDP,已经实现了针对不同的网络命名空间使用单独的哈希表的能力。
    • 对于网桥,已经实现了对MAB(MAC Authentication Bypass)认证方法的支持。
    • 对于 CAN 协议 (CAN_RAW),已实现对 SO_MARK 套接字模式的支持,以附加基于 fwmark 的流量过滤器。
    • ipset 实现了一个新的位掩码参数,允许您根据 IP 地址中的任意位设置掩码(例如,“ipset create set1 hash:ip bitmask 255.128.255.0”)。
    • 添加了对处理隧道数据包内的内部标头到 nf_tables 的支持。
  • Оборудование
    • 添加了“accel”子系统,实现了计算加速器框架,该框架可以以单独 ASIC 的形式提供,也可以以 SoC 和 GPU 内部 IP 块的形式提供。 这些加速器主要旨在加速机器学习问题的解决。
    • amdgpu 驱动程序包括对 GC、PSP、SMU 和 NBIO IP 组件的支持。 对于ARM64系统,实现了对DCN(Display Core Next)的支持。 受保护屏幕输出的实现已从使用 DCN10 转移到 DCN21,现在可以在连接多个屏幕时使用。
    • i915 (Intel) 驱动程序稳定了对独立 Intel Arc (DG2/Alchemist) 显卡的支持。
    • Nouveau 驱动程序支持基于 Ampere 架构的 NVIDIA GA102 (RTX 30) GPU。 对于 nva3 (GT215) 卡,添加了控制背光的功能。
    • 添加了对基于 Realtek 8852BE、Realtek 8821CU、8822BU、8822CU、8723DU (USB) 和 MediaTek MT7996 芯片的无线适配器、Broadcom BCM4377/4378/4387 蓝牙接口以及 Motorcomm yt8521、NVIDIA Tegra GE 以太网控制器的支持。
    • 添加了对内置声音芯片 HP Stream 8、Advantech MICA-071、Dell SKU 0C11、Intel ALC5682I-VD、Xiaomi Redmi Book Pro 14 2022、i.MX93、Armada 38x、RK3588 的 ASoC(ALSA 片上系统)支持。 添加了对 Focusrite Saffire Pro 40 音频接口的支持。添加了 Realtek RT1318 音频编解码器。
    • 添加了对索尼智能手机和平板电脑(Xperia 10 IV、5 IV、X 和 X Compact、OnePlus One、3、3T 和 Nord N100、小米 Poco F1 和 Mi6、华为 Watch、Google Pixel 3a、三星 Galaxy Tab 4 10.1)的支持。
    • 添加了对 ARM SoC 和 Apple T6000 (M1 Pro)、T6001 (M1 Max)、T6002 (M1 Ultra)、Qualcomm MSM8996 Pro (Snapdragon 821)、SM6115 (Snapdragon 662)、SM4250 (Snapdragon 460)、SM6375 (Snapdragon 695) 的支持板、SDM670 (Snapdragon 670)、MSM8976 (Snapdragon 652)、MSM8956 (Snapdragon 650)、RK3326 Odroid-Go/rg351、Zyxel NSA310S、InnoComm i.MX8MM、Odroid Go Ultra。

与此同时,拉丁美洲自由软件基金会形成了完全免费的6.2内核版本——Linux-libre 6.2-gnu,清除了包含非自由组件或代码部分的固件和驱动程序的元素,其范围受到限制由制造商。 新版本清理了 nouveau 驱动程序中的新斑点。 mt7622、mt7996 wifi 和 bcm4377 蓝牙驱动程序中禁用了 Blob 加载。 清理了 Aarch64 架构的 dts 文件中的 blob 名称。 更新了各种驱动程序和子系统中的斑点清理代码。 停止清理 s5k4ecgx 驱动程序,因为它已从内核中删除。

来源: opennet.ru

添加评论