Linux 5.16 内核版本

经过两个月的开发,Linus Torvalds 发布了 Linux 内核 5.16。 最显着的变化包括:用于提高 Wine 中 Windows 游戏性能的 futex_waitv 系统调用、通过 fanotify 在 FS 中进行错误跟踪、内存管理系统中的 folios 概念、对 AMX 处理器指令的支持、为网络套接字,支持 netfilter“出口”阶段的数据包分类,使用 DAMON 子系统主动逐出未使用的内存区域,改进对大量写入操作的过载处理,支持多驱动器硬盘。

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

内核5.16的主要创新:

  • 磁盘子系统、I/O 和文件系统
    • fanotify 机制中添加了工具来监视文件系统的状态并跟踪错误的发生。 有关错误的信息使用一种新型事件 - FAN_FS_ERROR 进行传输,可以在监视用户空间中运行的系统时拦截该事件,以便及时通知管理员或启动恢复进程。 当一系列错误级联发生时,fanotify 确保第一条错误消息与一般问题计数器一起传递,以简化后续对故障原因的分析。 目前仅针对 Ext4 文件系统实现了错误跟踪支持。
    • 改进了对写入拥塞的处理,当写入操作量超过驱动器的吞吐量时会发生这种情况,并且系统被迫阻止进程的写入请求,直到已提交的请求完成为止。 在新版本中,用于获取有关任务发生过载和阻塞信息的内核机制已完全重新设计,因为在旧实现中存在将写过载处理与内存页移位到交换区耦合的问题当系统内存不足时。
    • Btrfs 实现了对设备分区技术(Zoned Namespace)的支持,用于硬盘或 NVMe SSD 将存储空间划分为多个区域,这些区域组成一组块或扇区,只允许顺序添加数据,更新整个组块。 此外,还对 inode 日志记录进行了小幅优化,使 dbench 测试中的吞吐量提高了 3%,延迟降低了 11%。 重新设计了目录日志记录机制,减少了树中的搜索和阻塞操作次数以提高效率。 批量模式下向 btree 结构插入元素的速度加快(批量插入元素的时间减少了 4%,删除元素的时间减少了 12%)。 添加了对写入部分页面时使用压缩的有限支持,以及对子页面进行碎片整理的功能。 已做好准备以支持“发送”命令的第二版协议。
    • XFS 文件系统通过对经常使用的项目使用单独的slab 缓存并减少一些数据结构来减少内存消耗。
    • 在Ext4文件系统中,仅注意到错误修复和Inode表的延迟初始化参数的更准确计算。
    • 在块设备级别实施了优化,显着提高了 CPU 内核链接操作的效率。
    • 添加了对具有多个独立驱动器(多执行器)的硬盘驱动器的初始支持,使得可以同时访问磁盘不同区域中的多个扇区。
    • 添加了新的 ioctl 命令 CDROM_TIMED_MEDIA_CHANGE 以检测光盘驱动器中的介质更改事件。
    • EROFS(增强型只读文件系统)文件系统增加了在多个存储设备上工作的能力。 不同的设备可以映射到单个 32 位块地址空间。 还添加了对使用 LZMA 算法的压缩的支持。
    • F2FS 文件系统中添加了挂载选项,以控制放置在存储中时的文件碎片(例如,调试使用碎片存储的优化)。
    • CEPH 默认启用异步目录创建和删除(在安装时使用“-o wsync”标志以恢复到旧行为)。 添加了跟踪外部对象复制操作的指标的维护。
    • CIFS 中添加了 tcpnodelay 挂载参数,该参数为网络套接字设置 tcp_sock_set_nodelay 模式,从而禁用等待队列填充 TCP 堆栈的功能。 添加了重新安装时对嵌套 DFS 链接(分布式文件系统)的支持。
    • 添加了对以批处理模式完成对块设备的请求的支持。 对这一更改的测试显示,Optane 驱动器的随机读取操作强度在单个 CPU 核心上从 6.1 IOPS 增加到 6.6 万 IOPS。
  • 内存和系统服务
    • 添加了一个新的系统调用 futex_waitv,它允许您使用单个系统调用同时监视多个 futex 的状态。 此功能让人想起 Windows 中可用的 WaitForMultipleObjects 功能,通过 futex_waitv 进行模拟可有助于提高在 Wine 或 Proton 下运行的 Windows 游戏的性能。 此外,同时等待 futexes 还可以用于优化 Linux 游戏本机构建的性能。
    • 页页的概念已经实现,在某些内核子系统中使用页页将加快典型工作负载下的内存管理速度。 目前,内核中的主内存管理子系统和页面缓存的实现已经转移到folios上,文件系统也计划在未来转移。 未来还计划在内核中添加对多页作品集的支持。

      书籍类似于复合页面,但改进了语义并更清晰地组织了工作。 为了管理系统内存,可用 RAM 被划分为内存页面,其大小因体系结构而异,但在 x86 系统上以千字节为单位(通常为 4096 字节)。 现代系统配备了数十 GB 的 RAM,由于需要处理大量内存页,这使得内存管理变得更加复杂。 为了减少页面数量,内核之前实现了复合页面的概念,其结构跨越多个物理内存页面。 但用于操作合并内存页面的 API 仍有很多不足之处,并导致了额外的开销。

    • 任务调度程序中添加了一个处理程序,该处理程序考虑了 CPU 上的缓存集群。 在一些处理器中,例如鲲鹏920(ARM)和Intel Jacobsville(x86),一定数量的CPU核心(通常是4个)可以组合L3或L2缓存。 考虑到这种拓扑结构可以显着提高任务调度程序中跨 CPU 核心分配任务的效率,因为在同一 CPU 集群内移动任务可以提高内存访问吞吐量并减少缓存争用。
    • 添加了对即将推出的英特尔至强可扩展服务器处理器(代号为 Sapphire Rapids)中实现的 AMX(高级矩阵扩展)指令的支持。 AMX 提供新的可配置 TMM“TILE”寄存器和用于操作这些寄存器中的数据的指令,例如用于矩阵乘法的 TMUL(平铺矩阵 MULtiply)。
    • 基于上一版本中添加的 DAMON(数据访问监控)子系统实现了一些新功能,该子系统允许您监控与用户空间中运行的选定进程相关的 RAM 中数据的访问。 例如,该子系统可以分析进程在其整个操作期间访问了哪些内存区域,以及哪些内存区域仍未被认领。
      • DAMON_RECLAIM 用于识别并逐出尚未访问的内存区域。 该机制可用于在可用内存接近耗尽时主动软逐出内存页面。
      • DAMOS(基于数据访问监控的操作方案),用于应用指定的 madvise() 操作,例如释放额外的空闲内存,来处理固定一定频率的内存访问的内存区域。 DAMOS 参数通过 debugfs 配置。
      • 能够监视内存的物理地址空间(以前只能监视虚拟地址)。
    • zstd压缩算法的实现已更新至1.4.10版本,显着提升了各种使用压缩的内核子系统的性能(例如解包内核镜像加速了35%,解包压缩数据的性能Btrfs 和 SquashFS 增加了 15%,ZRAM 增加了 30%)。 内核最初使用了 zstd 的单独实现,基于版本 1.3.1,该版本发布于三年多前,并没有包含许多重要的优化。 除了迁移到当前版本之外,添加的补丁还简化了与 zstd 上游分支的同步,允许您直接从主 zstd 存储库生成包含在内核中的代码。 未来,计划随着新版本 zstd 库的发布而更新内核中的 zstd 代码。
    • eBPF 子系统进行了大量改进。 添加了从 BPF 程序调用内核模块函数的功能。 bpf_trace_vprintk() 函数已实现,与 bpf_trace_printk() 不同,它允许您一次输出三个以上的参数。 添加了新的数据存储结构(BPF 图)布隆过滤器,它允许您使用同名的概率数据结构来确定集合中是否存在元素。 添加了新属性 BTF_KIND_TAG,可以在 BPF 程序中使用该属性将标签绑定到函数参数,例如,简化用户程序中错误的检测。 在 libbpf 中,可以创建您自己的 .rodata.*/.data.* 部分,已经实现了对 uprobe 和 kprobe 跟踪事件的支持,并且添加了一个 API 用于将所有 BTF 类型从一个对象复制到另一个对象。 AF_XDP 支持已从 libbpf 移至单独的 libxdp 库。 对于MIPS架构,已经为BPF虚拟机实现了JIT编译器。
    • 对于 ARM64 架构,已经实现了对定时器 ARMv8.6 扩展的支持,包括允许在不使用 ISB 指令的情况下自同步表示系统寄存器的扩展。
    • 对于 PA-RISC 架构,已经实现了在使用内存时使用 KFENCE 机制检测错误的能力,并添加了对 KCSAN 竞争条件检测器的支持。
    • 可以在单个用户和组级别配置对 Tracefs 的访问权限;例如,您现在可以仅允许特定组的成员访问跟踪工具。
  • 虚拟化和安全
    • io_uring 和 device-mapper 子系统实现了对生成审核事件的支持。 io_uring 提供通过 LSM 模块控制访问的能力。 添加了审核 openat2() 系统调用的功能。
    • 内核代码在 switch 中完全没有连续的 case 表达式(每个 case 块后没有 return 或 break)。 构建内核时,现在可以使用“-Wimplicit-fallthrough”模式。
    • 包括执行 memcpy() 函数时加强边界检查的更改。
    • io_uring 异步 I/O 接口实现了将 SELinux 和 Smack 模块定义的安全策略应用于 I/O 操作的能力。
    • IMA(完整性测量架构)子系统允许外部服务验证内核子系统的状态以确保其真实性,实现基于文件所属或用户所属的组标识符 (GID) 应用规则的能力访问文件所属。
    • 默认情况下禁用一些高级机制来保护 seccomp() 线程免受 Spectre 攻击,这些机制被认为是不必要的,并且不会显着提高安全性,但会对性能产生负面影响。 Retpoline 保护的使用已被修改。
    • cryptoloop 机制的实现已被删除,并于 2004 年被 dm-crypt 取代,并且如有必要,支持相同的算法。
    • 默认情况下,禁止对 eBPF 子系统进行非特权访问。 进行此更改是为了防止 BPF 程序被用来绕过针对旁路攻击的保护。 如有必要,管理员可以恢复非特权用户使用 eBPF 的能力。
    • ACRN 虚拟机管理程序专为实时任务和关键任务系统中的使用而设计,增加了对创建/删除虚拟设备和转发 MMIO 设备的支持。
    • 加密引擎中添加了对 KPP(密钥协商协议原语)定义的支持,简化了开发加密系统驱动程序的逻辑。
    • 对于Hyper-V虚拟机管理程序,已经实现了对虚拟机隔离模式的支持,这意味着内存内容的加密。
    • KVM虚拟机管理程序增加了对RISC-V架构的支持。 已经实现了在主机环境中迁移使用 AMD SEV 和 SEV-ES 扩展运行的虚拟机的功能。 添加了用于实时迁移使用 AMD SEV(安全加密虚拟化)加密的来宾系统的 API。
    • 对于 PowerPC 架构,默认启用 STRICT_KERNEL_RWX 模式,该模式会阻止同时可用于写入和执行的内存页的使用。
    • 在 32 位 x86 系统上,对内存热插拔的支持已停止,该支持已失效一年多了。
    • libblockdep 库已从内核中删除,现在将与内核分开维护。
  • 网络子系统
    • 对于套接字,实现了一个新选项 SO_RESERVE_MEM,使用该选项可以为套接字保留一定量的内存,该内存将始终可供套接字使用,并且不会被删除。 使用此选项可以通过减少网络堆栈中的内存分配和回收操作来提高性能,特别是当系统中出现内存不足的情况时。
    • 添加了对自动多播隧道 (RFC 7450) 协议的支持,该协议允许将多播流量从支持多播的网络传送到不支持多播的网络上的接收者。 该协议通过封装在 UDP 数据包中来工作。
    • 改进了传输数据包中 IOAM(现场操作、管理和维护)数据的封装。
    • ethtool netlink API 中添加了控制收发器功耗模式的功能。
    • netfilter 子系统实现了在出口级别对数据包进行分类的能力,即在驱动程序从内核网络堆栈接收数据包的阶段。 在nftables中,对相应过滤器的支持出现在1.0.1版本中。 Netfilter 添加了比较和更改传输标头之后的 UDP 和 TCP(内部标头/有效负载)的内部标头和数据的功能。
    • 添加了新的 sysctl 参数 arp_evict_nocarrier 和 ndisc_evict_nocarrier,设置后,ARP 缓存和 ndisc(邻居发现)表将在连接失败 (NOCARRIER) 时被清除。
    • fq_codel(受控延迟)网络队列管理机制中添加了低延迟、低损耗和可扩展吞吐量(L4S)模式。
  • Оборудование
    • amdgpu 驱动程序为 DP 2.0 规范 (DisplayPort 2.0) 和 USB4 上的 DisplayPort 隧道提供初始支持。 对于 Cyan Skillfish APU(配备 GPU Navi 1x),添加了对显示控制器的支持。 扩大了对 Yellow Carp APU(Ryzen 6000“Rembrandt”移动处理器)的支持。
    • i915 驱动程序稳定了对 Intel Alderlake S 芯片的支持,并实现了对 Intel PXP(受保护的 Xe 路径)技术的支持,该技术允许您在具有 Intel Xe 芯片的系统上组织受硬件保护的图形会话。
    • nouveau 驱动程序已完成修复错误和改进代码风格的工作。
    • 添加了对 x86 兼容 Vortex CPU (Vortex86MX) 的支持。 Linux 之前也曾在类似的处理器上工作过,但需要明确识别指定的 CPU 才能禁用针对 Spectre/Meltdown 攻击的保护,而这不适用于指定的芯片。
    • 为 Surface Pro 86 和 Surface Laptop Studio 添加了对 x8 平台的初始支持。
    • 添加了驱动程序以支持AMD Yellow Carp、Van Gogh APU中使用的声音芯片,还添加了对声音系统和编解码器Cirrus CS35L41、Maxim MAX98520/MAX98360A、Mediatek MT8195、Nuvoton NAU8821、NVIDIA Tegra210、NXP i.MX8ULP、Qualcomm AudioReach、Realtek的支持ALC5682I-VS、RT5682S、RT9120、瑞芯微 RV1126 和 RK3568。
    • 添加ishtp_eclite驱动程序以使用ISHTP(集成传感器集线器传输协议)访问嵌入式Intel PSE(可编程服务引擎)控制器,例如电池、温度和UCSI(USB Type-C连接器系统软件)相关信息接口)。
    • 添加了适用于支持 Switch Pro 和 Joy-Con 的 Nintendo Switch 游戏控制器的驱动程序。 添加了对 Wacom Intuos BT 平板电脑 (CTL-4100WL/CTL-6100WL) 和 Apple 2021 Magic Keyboard 的支持。 改进了对 Sony PlayStation DualSense 控制器的支持。 新增对小米鼠标侧键的支持。
    • 添加了支持 Realtek 89ax 无线芯片的 RT802.11 驱动程序,以及 Asix AX88796C-SPI 以太网适配器和 Realtek RTL8365MB-VC 交换机的驱动程序。
    • Apple M1 芯片添加了 PCI 和 PASemi i2c 驱动程序。
    • 添加了对 ARM SoС、设备和板 Raspberry Pi 计算模块 4、Fairphone 4、Snapdragon 690、LG G Watch R、Sony Xperia 10 III、Samsung Galaxy S4 Mini Value Edition、Xiaomi MSM8996(Mi 5、Mi Note 2、Mi 5s)的支持、Mi Mix、Mi 5s Plus 和小米 Mi 5)、Sony Yoshino(Sony Xperia XZ1 和 Sony Xperia XZ Premium)、F(x)tec Pro1 QX1000、Microchip LAN966、CalAmp LMU5000、Exegin Q5xR5、sama7g5、Samsung ExynosAutov9、Rockchip RK3566、RK3399 ROCK Pi 4A+、RK3399 ROCK Pi 4B+、Firefly ROC-RK3328-PC、Firefly ROC-RK3399-PC-PLUS、华硕 Chromebook 平板电脑 CT100、Pine64 Quartz64-A、Netgear GS110EMX、Globalscale MOCHAbin 7040、NXP S32G2、Ren欧洲航天局R8A779M*、Xilinx Kria、Radxa Zero、JetHub D1/H1、Netronix E70K02。

来源: opennet.ru

添加评论