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 Tegraer210 、Qualcomm AudioReach、Realtek的支援ALC8I-VS、RT5682S、RT5682、瑞芯微 RV9120 和 RK1126。
    • 新增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 5 Mini Value Edition、Xiaomi MSM5(Mi 5、Mi Note 1、Mi 1 Mini Value Edition、Xiaomi MSM1000(Mi 966、Mi Note 5000、Mi 5 Mini Value Edition、Xiaomi MSM5(Mi 7、Mi Note 5、Mi 9 Mini Value Edition、Xiaomi MSM3566(Mi 3399、Mi Note 4、Mi 3399 Mini )的支援、Mi Mix、Mi 4s Plus 和小米Mi 3328)、Sony Yoshino(Sony Xperia XZ3399 和Sony Xperia XZ Premium)、F(x)tec Pro100 QX64、Microchip LAN64、CalAmp LMU110、Exegin7040、Microchip LAN32、CalAmp LMU2、Exegin8、Microchip LAN779、CalAmp LMU1、Exegin Q1xR70、samaa 、Rockchip RK02、RKXNUMX ROCK Pi XNUMXA+、RKXNUMX ROCK Pi XNUMXB+、Firefly ROC-RKXNUMX-PC、Firefly ROC-RKXNUMX-PC-PLUS、華碩Chromebook 平板電腦CTXNUMX SXNUMXGXNUMX 、Ren歐洲太空總署RXNUMXAXNUMXM*、Xilinx Kria、Radxa Zero、JetHub DXNUMX/HXNUMX、Netronix EXNUMXKXNUMX。

來源: opennet.ru

添加評論