Rilascio del kernel Linux 6.1

Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.1. Tra i cambiamenti più notevoli: supporto per lo sviluppo di driver e moduli nel linguaggio Rust, modernizzazione del meccanismo per determinare le pagine di memoria utilizzate, uno speciale gestore di memoria per programmi BPF, un sistema per diagnosticare problemi di memoria KMSAN, il KCFI (Kernelk Control -Flow Integrity), meccanismo di protezione, l'introduzione della struttura ad albero di Maple.

La nuova versione include 15115 correzioni da 2139 sviluppatori, la dimensione della patch è di 51 MB, ovvero circa 2 volte inferiore alla dimensione delle patch dei kernel 6.0 e 5.19. Le modifiche hanno interessato 13165 file, sono state aggiunte 716247 righe di codice e sono state eliminate 304560 righe. Circa il 45% di tutte le modifiche introdotte nella versione 6.1 sono legate ai driver di dispositivo, circa il 14% delle modifiche sono legate all'aggiornamento del codice specifico delle architetture hardware, il 14% sono legate allo stack di rete, il 3% sono legate ai file system e il 3% sono legati ai sottosistemi interni del kernel.

Principali innovazioni nel kernel 6.1:

  • Servizi di memoria e di sistema
    • Aggiunta la possibilità di utilizzare Rust come secondo linguaggio per sviluppare driver e moduli del kernel. Il motivo principale per supportare Rust è rendere più semplice la scrittura di driver di dispositivo sicuri e di alta qualità riducendo la probabilità di commettere errori quando si lavora con la memoria. Il supporto Rust è disabilitato per impostazione predefinita e non comporta l'inclusione di Rust come dipendenza richiesta per la compilazione del kernel. Il kernel ha adottato finora una versione minimale e ridotta delle patch, che è stata ridotta da 40 a 13mila righe di codice e fornisce solo il minimo necessario, sufficiente per costruire un semplice modulo del kernel scritto in linguaggio Rust. In futuro, si prevede di aumentare gradualmente le funzionalità esistenti, trasferendo altre modifiche dal ramo Rust-for-Linux. Parallelamente si stanno sviluppando progetti per utilizzare l'infrastruttura proposta per sviluppare driver per unità NVMe, protocollo di rete 9p e GPU Apple M1 in linguaggio Rust.
    • Per i sistemi basati su architetture AArch64, RISC-V e LoongArch con EFI, è stata implementata la possibilità di caricare direttamente immagini del kernel compresse. Aggiunti gestori per caricare, eseguire e scaricare le immagini del kernel, chiamati direttamente da EFI zboot. Sono stati aggiunti anche i gestori per l'installazione e l'eliminazione dei protocolli dal database dei protocolli EFI. In precedenza, la decompressione veniva eseguita da un bootloader separato, ma ora può essere eseguita da un gestore nel kernel stesso: l'immagine del kernel è formata come un'applicazione EFI.
    • La composizione prevede parte delle patch con l'implementazione di un modello di gestione della memoria multilivello, che consente di separare banchi di memoria con caratteristiche prestazionali diverse. Ad esempio, le pagine utilizzate più frequentemente potrebbero essere archiviate nella memoria più veloce, mentre le pagine utilizzate più raramente potrebbero essere archiviate in una memoria relativamente lenta. Il kernel 6.1 introduce un meccanismo per determinare dove si trovano le pagine molto utilizzate nella memoria lenta in modo che possano essere promosse alla memoria veloce, e introduce anche un concetto generale di livelli di memoria e le relative prestazioni.
    • Include il meccanismo MGLRU (Multi-Generational LRU), che sostituisce la vecchia implementazione LRU (Least Recently Used) basata su due code con una struttura multi-stage che determina meglio quali pagine di memoria sono effettivamente in uso e quali possono essere inviate a la partizione di swap.
    • Aggiunto il supporto per la struttura dati "albero d'acero" proposta dagli ingegneri Oracle, che si posiziona come un sostituto più efficace della struttura "albero rosso-nero". Maple tree è una variante del B-tree che supporta l'indicizzazione del range ed è progettata per utilizzare in modo efficiente la cache dei processori moderni. Alcuni sottosistemi di gestione della memoria sono già stati trasferiti su Maple Tree, il che ha avuto un effetto positivo sulle loro prestazioni. In futuro, l'albero di acero potrà essere utilizzato per implementare il blocco del raggio d'azione.
    • Al sottosistema BPF è stata aggiunta la possibilità di creare programmi BPF “distruttivi” appositamente progettati per avviare un arresto di emergenza tramite la chiamata crash_kexec(). Tali programmi BPF potrebbero essere necessari a fini di debug per avviare la creazione di un crash dump in un determinato momento. Per accedere alle operazioni distruttive durante il caricamento di un programma BPF, è necessario specificare il flag BPF_F_DESTRUCTIVE, attivare sysctl kernel.destructiva_bpf_enabled e disporre dei diritti CAP_SYS_BOOT.
    • Per i programmi BPF, è possibile enumerare gli elementi cgroup, nonché le risorse (file, vma, processi, ecc.) di un thread o un'attività specifica. È stato implementato un nuovo tipo di mappa per creare buffer di anello utente.
    • Aggiunta una chiamata speciale per l'allocazione della memoria nei programmi BPF (allocatore di memoria), che fornisce un'allocazione della memoria più sicura nel contesto BPF rispetto allo standard kmalloc().
    • La prima parte delle modifiche è stata integrata, fornendo la possibilità di creare driver per dispositivi di input con interfaccia HID (Human Interface Device), implementati sotto forma di programmi BPF.
    • Il kernel ha completamente rimosso il codice per supportare il formato di file eseguibile a.out, che era deprecato nella versione 5.1 ed è stato disabilitato per le principali architetture a partire dalle versioni 5.18 e 5.19. Il formato a.out è stato a lungo deprecato sui sistemi Linux e la generazione di file a.out non è supportata dagli strumenti moderni nelle configurazioni Linux predefinite. Il caricatore per i file a.out può essere implementato interamente nello spazio utente.
    • Per i sistemi basati sull'architettura del set di istruzioni LoongArch utilizzata nei processori Loongson 3 5000 e che implementano il nuovo RISC ISA, simile a MIPS e RISC-V, viene implementato il supporto per eventi di misurazione delle prestazioni (eventi perf), kexec, kdump e compilazione JIT BPF .
    • L'interfaccia I/O asincrona io_uring offre una nuova modalità, IORING_SETUP_DEFER_TASKRUN, che consente di rinviare temporaneamente il lavoro relativo al ring buffer fino a quando non viene effettuata una richiesta di applicazione, che può essere utilizzata per lavorare in batch ed evitare problemi di latenza dovuti alla prelazione. momento sbagliato.
    • Ai processi nello spazio utente viene data la capacità di avviare la conversione di un intervallo di normali pagine di memoria in un insieme di pagine di memoria di grandi dimensioni (Transparent Huge-Pages).
    • Aggiunta l'implementazione del dispositivo /dev/userfaultfd, che consente l'accesso alla funzionalità della chiamata di sistema userfaultfd() utilizzando i diritti di accesso nel FS. La funzionalità userfaultfd consente di creare gestori per l'accesso alle pagine di memoria non allocate (page fault) nello spazio utente.
    • I requisiti per la versione dell'utility GNU Make sono stati aumentati: per compilare il kernel ora è necessaria almeno la versione 3.82.
  • Sottosistema disco, I/O e file system
    • Sono state apportate significative ottimizzazioni delle prestazioni al file system Btrfs; tra le altre cose, le prestazioni della chiamata ioctl FIEMAP sono state aumentate di ordini di grandezza. Aggiunto il supporto per le scritture asincrone nel buffer per le applicazioni che utilizzano io_uring. Aggiunto il supporto per i file protetti con fs-verity all'operazione di “invio”.
    • Il file system ext4 ha aggiunto ottimizzazioni delle prestazioni relative alla manutenzione del journal e al funzionamento di sola lettura.
    • Il file system EROFS (Enhanced Read-Only File System), progettato per l'uso su partizioni accessibili in modalità di sola lettura, implementa la capacità di condividere dati duplicati in diversi file system.
    • È stata aggiunta la chiamata di sistema statx() per visualizzare informazioni sulla possibilità di applicare l'I/O diretto a un file.
    • Il supporto per la creazione di file temporanei con il flag O_TMPFILE è stato aggiunto al sottosistema FUSE (Filesystem in User Space).
  • Virtualizzazione e sicurezza
    • È stata sostituita l'implementazione del meccanismo di protezione CFI (Control Flow Integrity), aggiungendo controlli prima di ogni chiamata indiretta di una funzione per rilevare alcune forme di comportamento non definito che potrebbero potenzialmente portare ad una violazione del normale ordine di esecuzione (control flow) come risultato dell'uso di exploit che modificano i puntatori alle funzioni archiviate in memoria. L'implementazione standard di CFI del progetto LLVM è stata sostituita da un'opzione basata anch'essa sull'uso di Clang, ma appositamente adattata per proteggere i sottosistemi di basso livello e i kernel del sistema operativo. In LLVM, una nuova implementazione verrà offerta nella versione Clang 16 e sarà abilitata con l'opzione "-fsanitize=kcfi". La differenza fondamentale con la nuova implementazione è che non è legata alle ottimizzazioni del tempo di collegamento (LTO) e non comporta la sostituzione dei puntatori a funzione con collegamenti nella tabella di salto.
    • Per i moduli LSM (Linux Security Module), è possibile creare gestori che intercettano le operazioni per creare namespace.
    • Vengono forniti strumenti per verificare le firme digitali PKCS#7 nei programmi BPF.
    • La possibilità di aprire in modalità non bloccante (O_NONBLOCK), che era stata inavvertitamente rimossa nel kernel 5.6, è stata restituita a /dev/random.
    • Sui sistemi con architettura x86 è stato aggiunto un avviso in caso di mappatura di pagine di memoria da parte di sottosistemi del kernel che consentono contemporaneamente esecuzione e scrittura. In futuro si sta valutando la possibilità di vietare completamente tale mappatura della memoria.
    • Aggiunto il meccanismo di debug KMSAN (Kernel Memory Sanitizer) per rilevare l'utilizzo della memoria non inizializzata nel kernel, nonché perdite di memoria non inizializzata tra lo spazio utente e i dispositivi.
    • Sono stati apportati miglioramenti al generatore di numeri pseudocasuali CRNG cripto-sicuro utilizzato nella chiamata getrandom. Le modifiche sono state preparate da Jason A. Donenfeld, autore di VPN WireGuard, e mirano a migliorare la sicurezza dell'estrazione di numeri interi pseudo-casuali.
  • Sottosistema di rete
    • Lo stack TCP offre la possibilità (disabilitata per impostazione predefinita) di utilizzare tabelle hash socket separatamente per ogni spazio dei nomi, migliorando le prestazioni sui sistemi con un numero elevato di spazi dei nomi.
    • Codice rimosso per supportare il protocollo DECnet legacy. Gli stub API dello spazio utente vengono lasciati al loro posto per consentire la compilazione delle applicazioni che utilizzano DECnet, ma queste applicazioni non saranno in grado di connettersi alla rete.
    • Il protocollo netlink è documentato.
  • Attrezzatura
    • Il driver amdgpu ha aggiunto il supporto per l'inoltro DSC (Display Stream Compression) per la compressione dei dati senza perdita di dati durante lo scambio di informazioni con schermi che supportano risoluzioni molto elevate. Il lavoro continua per fornire supporto per le piattaforme AMD RDNA3 (RX 7000) e CDNA (Instinct). Aggiunto supporto per componenti IP DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x e GMC 11.x. Il driver amdkfd (per GPU AMD discrete come Polaris) fornisce supporto per GFX 11.0.3.
    • Il driver i915 (Intel) include il supporto per la GPU Meteor Lake. Meteor Lake e le GPU più recenti supportano l'interfaccia DP 2.0 (DisplayPort). Aggiunti identificatori per le schede video basate sulla microarchitettura Alder Lake S.
    • Aggiunto il supporto per i sottosistemi audio implementati nei processori Apple Silicon, Intel SkyLake e Intel KabyLake. Il driver audio HDA ​​CS35L41 supporta la modalità di sospensione. Aggiunto supporto ASoC (ALSA System on Chip) per chip audio integrati Apple Silicon, DSP AMD Rembrant, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake e Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSP, Qualcomm SC8280XP, SM8250, SM8450 e Texas Instruments SRC4392
    • Aggiunto supporto per pannelli LCD Samsung LTL101AL01, B120XAN01.0, R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120ACA-EA1, AUO B116XAK01.6, BOE NT116WH M-N21, IN X N116BCA- EA2, INX N116BCN-EA1, Tecnologia Multi-Inno MI0800FT-9.
    • Aggiunto supporto per i controller SATA AHCI utilizzati nel SoC Baikal-T1.
    • Aggiunto supporto per chip Bluetooth MediaTek MT7921, Intel Magnetor (CNVi, connettività integrata), Realtek RTL8852C, RTW8852AE e RTL8761BUV (Edimax BT-8500).
    • Il driver ath11k per i moduli wireless Qualcomm ha aggiunto il supporto per la scansione spettrale nella gamma di 160 MHz, implementato NAPI multi-thread e migliorato il supporto per i chip Wi-Fi Qualcomm WCN6750.
    • Aggiunti driver per tastiera PinePhone, touchpad InterTouch (ThinkPad P1 G3), X-Box Adaptive Controller, PhoenixRC Flight Controller, VRC-2 Car Controller, DualSense Edge Controller, IBM Operation Panel, telecomandi XBOX One Elite, tablet XP-PEN Deco Pro S e Intuos Pro Small (PTH-460).
    • Aggiunto driver per acceleratori crittografici Aspeed HACE (Hash e Crypto Engine).
    • Aggiunto il supporto per i controller integrati Thunderbolt/USB4 Intel Meteor Lake.
    • Aggiunto supporto per gli smartphone Sony Xperia 1 IV, Samsung Galaxy E5, E7 e Grand Max, Pine64 Pinephone Pro.
    • Aggiunto supporto per SoC e schede ARM: AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 e RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, IPQ8062, IPQ8065, Kontron SL/ BL i.MX8MM OSM-S, MT8195 (Acer Tomato), Radxa ROCK 4C+, NanoPi R4S Enterprise Edition, JetHome JetHub D1p. Driver aggiornati per SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom e NXP.

Allo stesso tempo, la Latin American Free Software Foundation ha formato una versione del kernel 6.1 completamente libera - Linux-libre 6.1-gnu, ripulita da elementi di firmware e driver contenenti componenti o sezioni di codice non liberi, il cui scopo è limitato dal produttore. La nuova versione pulisce il nuovo driver rtw8852b e i file DTS per vari SoC Qualcomm e MediaTek con processori basati sull'architettura AArch64. Codice di pulizia blob aggiornato nei driver e sottosistemi amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI. La pulizia dei driver obsoleti delle schede TV tm6000, cpia2 v4l, sp8870, av7110 è stata corretta.

Fonte: opennet.ru

Aggiungi un commento