Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.11. Tra le modifiche più notevoli ci sono: supporto per gli enclave Intel SGX, un nuovo meccanismo di intercezione delle chiamate di sistema, un bus virtuale ausiliario, divieto di costruzione di moduli senza MODULE_LICENSE(), modalità di filtraggio rapido delle chiamate di sistema in seccomp, cessazione del supporto per l'architettura ia64, trasferimento della tecnologia WiMAX nel ramo "staging", possibilità di incapsulamento SCTP in UDP.
Nella nuova versione sono stati accettati 15480 aggiornamenti da 1991 sviluppatori, la dimensione della patch è di 72 MB (le modifiche hanno interessato 12090 file, sono state aggiunte 868025 righe di codice, rimosse 261456 righe). Circa il 46% di tutte le modifiche presentate in 5.11 riguarda i driver dei dispositivi, circa il 16% delle modifiche è relativo all'aggiornamento del codice specifico per le architetture hardware, il 13% riguarda lo stack di rete, il 3% ai file system e il 4% ai sistemi interni del kernel.
Novità principali:
- Sottosistema disco, I/O e file system
- In Btrfs sono state aggiunte diverse opzioni di montaggio utilizzabili per il ripristino dei dati da un file system danneggiato: "rescue=ignorebadroots" per montare nonostante i danni a determinati alberi radice (extent, uuid, data reloc, device, csum, spazio libero), "rescue=ignoredatacsums" per disabilitare il controllo delle somme di controllo per i dati e "rescue=all" per attivare simultaneamente le modalità ‘ignorebadroots’, ‘ignoredatacsums’ e ‘nologreplay’. È stata interrotta la supporto per l'opzione di montaggio "inode_cache", che era stata precedentemente dichiarata obsoleta. È stata effettuata una preparazione del codice per implementare il supporto per blocchi di metadati e dati di dimensioni inferiori alla pagina (PAGE_SIZE), oltre al supporto per la modalità di allocazione zonata. Le richieste non bufferizzate (Direct IO) sono state migrate all'infrastruttura iomap. Sono state ottimizzate le prestazioni di varie operazioni, in alcuni casi il miglioramento può raggiungere decine di percentuale.
- In XFS è stato implementato un flag "needsrepair" che segnala la necessità di ripristino. Una volta impostato questo flag, il file system non può essere montato fino a quando il flag non viene resettato utilizzando l'utilità xfs_repair.
- In Ext4 sono state apportate solo correzioni di bug e ottimizzazioni, oltre a una pulizia del codice.
- Consente l'esportazione ripetuta dei file system montati sopra NFS (ovvero le partizioni montate tramite NFS possono ora essere esportate tramite NFS e utilizzate come cache intermedia).
- Nella chiamata di sistema close_range(), che consente a un processo di chiudere un intero intervallo di descrittori di file aperti, è stata aggiunta l'opzione CLOSE_RANGE_CLOEXEC per chiudere i descrittori in modalità close-on-exec.
- Nel file system F2FS sono state aggiunte nuove chiamate ioctl(), che consentono di controllare dallo spazio utente quali file vengono salvati in formato compresso. È stata aggiunta un'opzione di montaggio «compress_mode=» per scegliere se gestire il compressore lato kernel o nello spazio utente.
- È stata introdotta la possibilità di montare Overlayfs da processi non privilegiati, utilizzando uno spazio separato di identificatori utente (user namespace). È stata condotta un'audit completa del codice per verificare la conformità all'implementazione del modello di sicurezza. In Overlayfs è stata inoltre aggiunta la possibilità di avviarlo utilizzando copie delle immagini del file system, con l'opzione di disabilitare il controllo UUID.
- Nel file system Ceph è stata aggiunta la supporto per il protocollo msgr2.1, che consente di utilizzare l'algoritmo AES-GCM per la trasmissione di dati in forma crittografata.
- Nel modulo dm-multipath è stata implementata la possibilità di considerare il legame con la CPU (‘IO affinity’) nella selezione del percorso per le richieste di input/output.
- Memoria e servizi di sistema
- È stato aggiunto un nuovo meccanismo di intercettazione delle chiamate di sistema basato su prctl(), che consente di generare eccezioni dallo spazio utente quando si accede a una specifica chiamata di sistema e di emularne l'esecuzione. Questa funzionalità è molto richiesta in Wine e Proton per emulare le chiamate di sistema di Windows, necessaria per garantire la compatibilità con giochi e programmi che eseguono direttamente chiamate di sistema bypassando l'API di Windows (ad esempio, per proteggere da utilizzi non autorizzati).
- Nella chiamata di sistema userfaultfd(), progettata per gestire i page faults (accesso a pagine di memoria non allocate) nello spazio utente, è stata aggiunta la possibilità di disabilitare la gestione delle eccezioni a livello di kernel, per complicare l'exploitation di alcune vulnerabilità.
- Nella sottosistema BPF è stata aggiunta la supporto per lo storage locale per il task (task-local storage), che fornisce il collegamento dei dati a un specifico handler BPF.
- È stato completamente ristrutturato il tracciamento dell'uso della memoria da parte dei programmi BPF — per gestire l'uso della memoria negli oggetti BPF, invece di memlock rlimit è stato proposto un controller cgroup.
- Nel meccanismo BTF (BPF Type Format), che fornisce informazioni per la verifica dei tipi nel pseudocodice BPF, è stata implementata la supporto per i moduli del kernel.
- Nell'interfaccia di input/output asincrono io_uring è stata aggiunta la supporto per le chiamate di sistema shutdown(), renameat2() e unlinkat(). Durante la chiamata a io_uring_enter() è stata introdotta la possibilità di specificare un timeout (è possibile verificare il supporto per l'argomento di timeout con il flag IORING_FEAT_EXT_ARG).
- L'architettura ia64, utilizzata nei processori Intel Itanium, è stata classificata come non più supportata («orphaned»), il che implica la cessazione dei test. Hewlett Packard Enterprise ha interrotto l'accettazione degli ordini per nuove attrezzature Itanium, mentre Intel lo ha fatto già l'anno scorso.
- È stata interrotta la supporto per i sistemi basati sull'architettura MicroBlaze privi di un'unità di gestione della memoria (MMU). Sistemi di questo tipo non sono più comuni.
- Per l'architettura MIPS è stata aggiunta la supporto per il test di copertura del codice (coverage testing) mediante l'utilizzo dell'utility gcov.
- È stata aggiunta la supporto per il bus ausiliario virtuale per interagire con dispositivi multifunzionali che combinano funzionalità che richiedono driver diversi (ad esempio, schede di rete con supporto Ethernet e RDMA). Il bus può essere utilizzato per assegnare un driver principale e secondario a un dispositivo, in situazioni in cui l'uso del sottosistema MFD (Multi-Function Devices) è problematico.
- Per l'architettura RISC-V è stata aggiunta la supporto per il sistema di allocazione della memoria CMA (Contiguous Memory Allocator), ottimizzato per l'allocazione di grandi aree di memoria contigue utilizzando la tecnica di spostamento delle pagine di memoria. Per RISC-V sono stati implementati anche strumenti per limitare l'accesso a /dev/mem e per la contabilità del tempo di gestione delle interruzioni.
- Per i sistemi ARM a 32 bit è stata aggiunta la supporto per lo strumento di debug KASan (Kernel address sanitizer), che consente di rilevare errori nella gestione della memoria. Per ARM a 64 bit, l'implementazione di KASan è stata adattata all'uso dei tag MTE (MemTag).
- È stata aggiunta la chiamata di sistema epoll_pwait2(), che consente di utilizzare timeout con precisione al nanosecondo (la chiamata epoll_wait gestisce i millisecondi).
- Nel sistema di assemblaggio è stata implementata l'uscita di errore quando si tenta di assemblare i moduli del kernel caricati, nei quali non è definita la licenza del codice attraverso il macro MODULE_LICENSE(). Anche l'uso del macro EXPORT_SYMBOL() per le funzioni statiche genererà un errore durante l'assemblaggio.
- Aggiunta la supporto per il mapping degli oggetti GEM dalla memoria utilizzata per input/output, che ha permesso di velocizzare le operazioni con il framebuffer su alcune architetture.
- Nel Kconfig è stata interrotta la supporto per Qt4 (mantenuta la supporto per Qt5, GTK e Ncurses).
- Virtualizzazione e sicurezza
- Nel sistema di chiamate seccomp() è stata aggiunta la supporto per la modalità di risposta rapida, che consente di determinare molto rapidamente se una specifica chiamata di sistema è consentita o vietata, basandosi sulla tabella dei diritti associata al processo (constant-action bitmap), senza necessità di avviare un gestore BPF.
- Integrati componenti del kernel per la creazione e gestione di enclavi basate sulla tecnologia Intel SGX (Software Guard eXtensions), che consente alle applicazioni di eseguire codice in aree di memoria isolate e crittografate, limitando l'accesso del resto del sistema.
- Nell'ambito dell'iniziativa per limitare l'accesso degli utenti ai registri MSR (model-specific register), è vietata la scrittura nel registro MSR_IA32_ENERGY_PERF_BIAS, che consente di modificare la modalità di efficienza energetica del processore ("normal", "performance", "powersave").
- Dalla branch kernel-rt per i sistemi in tempo reale è stata trasferita la possibilità di disattivare la migrazione di attività ad alta priorità tra le CPU.
- Per i sistemi ARM64 è stata aggiunta la possibilità di utilizzare i tag MTE (MemTag, Memory Tagging Extension) per gli indirizzi di memoria dei gestori di segnali. L'uso di MTE è attivato specificando l'opzione SA_EXPOSE_TAGBITS in sigaction() e consente di organizzare il controllo della correttezza dell'uso dei puntatori per bloccare l'esecuzione di vulnerabilità causate dall'accesso a blocchi di memoria già liberati, da buffer overflow, accessi prima dell'inizializzazione e utilizzo al di fuori del contesto attuale.
- È stata aggiunta la variabile «DM_VERITY_VERIFY_ROOTHASH_SIG_SECONDARY_KEYRING», che consente al sottosistema dm-verity di verificare le firme hash dei certificati memorizzati nel secondo insieme di chiavi (keyring). In pratica, questa impostazione permette di verificare non solo i certificati integrati nel kernel, ma anche quelli caricati durante il runtime, consentendo così di aggiornare i certificati senza dover aggiornare l'intero kernel.
- Nel User-mode Linux è stata aggiunta la supporto per la modalità suspend-to-idle, che consente di sospendere l'ambiente e utilizzare il segnale SIGUSR1 per uscire dallo stato di sospensione.
- Nel meccanismo virtio-mem, che consente il collegamento e lo scollegamento della memoria a caldo alle macchine virtuali, è stato aggiunto il supporto per la modalità a grande blocco (BBM, Big Block Mode), che permette di trasferire o ritirare memoria in blocchi di dimensioni superiori a quelle del blocco di memoria del kernel, necessario per ottimizzare il VFIO in QEMU.
- Nell'implementazione del TLS a livello di kernel è stato aggiunto il supporto per il cifrario CHACHA20-POLY1305.
- Sottosistema di rete
- Per 802.1Q (VLAN) è stato implementato un meccanismo di gestione dei guasti di connessione (CFM, Connectivity Fault Management) che consente di rilevare, verificare e isolare i guasti nelle reti con ponti virtuali (Virtual Bridged Networks). Ad esempio, il CFM può essere utilizzato per localizzare problemi in reti che coinvolgono più organizzazioni indipendenti, i cui dipendenti hanno accesso solo alle proprie attrezzature.
- È stata aggiunta la supporto per l'incapsulamento dei pacchetti del protocollo SCTP in pacchetti UDP (RFC 6951), consentendo così l'uso di SCTP in reti con traduttori di indirizzi obsoleti che non supportano direttamente SCTP, e implementando SCTP su sistemi che non forniscono accesso diretto al livello IP.
- L'implementazione della tecnologia WiMAX è stata spostata nella fase di staging e in futuro è prevista per la rimozione, se non verranno trovati utenti che ne hanno bisogno. WiMAX non è più utilizzato nelle reti pubbliche e nel core l'unico driver con cui è possibile utilizzare WiMAX rimane il datore di lavoro obsoleto Intel 2400m. Nella configurazione di rete NetworkManager il supporto per WiMAX è stato interrotto nel 2015. Attualmente WiMAX è praticamente completamente sostituito da tecnologie come LTE, HSPA+ e Wi-Fi 802.11n.
- È stato effettuato un lavoro di ottimizzazione delle prestazioni nel trattamento del traffico TCP in ingresso in modalità zerocopy, cioè senza ulteriori copie in nuovi buffer. Per traffico di dimensioni medie, che va da decine a qualche centinaio di kilobyte di dati, l'applicazione di zerocopy invece di recvmsg() è notevolmente più efficace. Ad esempio, le modifiche implementate hanno permesso di aumentare l'efficienza nel trattamento del traffico in stile RPC con messaggi di 32 KB utilizzando zerocopy del 60-70%.
- Sono state aggiunte nuove chiamate ioctl() per la creazione di bridge di rete che coprono più canali PPP. La funzionalità proposta consente ai frame di muoversi da un canale all'altro, ad esempio da PPPoE a una sessione PPPoL2TP.
- È proseguita l'integrazione nel kernel di MPTCP (MultiPath TCP), un'estensione del protocollo TCP per organizzare il funzionamento della connessione TCP con la consegna dei pacchetti contemporaneamente su più percorsi attraverso diverse interfacce di rete, legate a differenti indirizzi IP. Nella nuova versione è stato implementato il supporto per l'opzione ADD_ADDR per l'annuncio degli indirizzi disponibili IP addresses a cui è possibile connettersi quando si aggiungono nuovi flussi a una connessione MPTCP esistente.
- È stata aggiunta la possibilità di configurare le azioni in caso di superamento del budget per il polling delle connessioni (busy-polling). In precedenza, la modalità SO_BUSY_POLL implicava il passaggio a softirq al termine del budget. Per le applicazioni che devono continuare a utilizzare il polling, è stata proposta una nuova opzione SO_PREFER_BUSY_POLL.
- In IPv6 è stata implementata la supporto per le modalità SRv6 End.DT4 e End.DT6, utilizzate per creare L3 IPv4 multiutente. VPN e dispositivi VRF (Virtual Routing and Forwarding).
- In Netfilter è stata unificata l'implementazione delle espressioni set, consentendo di specificare più espressioni per ciascun elemento delle liste set.
- Nel stack wireless 802.11 sono stati aggiunti API per configurare i limiti di potenza SAR, così come i parametri AE PWE e HE MCS. Nel driver Intel iwlwifi è stata aggiunta la supporto per la banda 6GHz (Ultra High Band). Nel driver Qualcomm Ath11k è stata aggiunta la supporto per la tecnologia di configurazione rapida della connessione FILS (Fast Initial Link Setup, standardizzata come IEEE 802.11ai), consentendo di eliminare i ritardi durante il roaming durante la migrazione da un punto di accesso all'altro.
- Attrezzature
- Il driver amdgpu supporta APU AMD "Green Sardine" (Ryzen 5000) e GPU "Dimgrey Cavefish" (Navi 2), oltre a fornire un supporto iniziale per APU AMD Van Gogh con core Zen 2 e GPU RDNA 2 (Navi 2). È stata aggiunta la supporto per i nuovi identificatori APU Renoir (basati su CPU Zen 2 e GPU Vega).
- Nel driver i915 per schede grafiche Intel è stato implementato il supporto della tecnologia IS (Integer scaling) con un filtro per l'ingrandimento che tiene conto dello stato dei pixel adiacenti (interpolazione Nearest-neighbor) per determinare il colore dei pixel mancanti. È stato ampliato il supporto per le schede discrete Intel DG1. È stato implementato il supporto per la tecnologia "Big Joiner", presente a partire dai chip Ice Lake / Gen11, che consente di utilizzare un unico transcoder per gestire due flussi, ad esempio per l'uscita su schermo 8K tramite un DisplayPort. È stata aggiunta una modalità di commutazione asincrona tra due buffer nella memoria video (async flip).
- Nel driver nouveau è stato aggiunto un supporto iniziale per GPU NVIDIA basate sull'architettura "Ampere" (GA100, GeForce RTX 30xx), attualmente limitato a funzionalità di gestione delle modalità video.
- È stata aggiunta la compatibilità con il protocollo 3WIRE, utilizzato nei pannelli LCD. È stata aggiunta la compatibilità con i pannelli novatek nt36672a, TDO tl070wsh30, Innolux N125HCE-GN1 e ABT Y030XX067A 3.0. Si segnala inoltre il supporto per i pannelli degli smartphone OnePlus 6 e 6T, che ha permesso di organizzare il boot su dispositivi con kernel non modificato.
- È stata aggiunta la compatibilità con il primo controller host USB4 discreto Intel Maple Ridge.
- È stato aggiunto il supporto per i codec audio Allwinner H6 I2S, Analog Devices ADAU1372, Intel Alderlake-S, GMediatek MT8192, NXP i.MX HDMI e XCVR, Realtek RT715 e Qualcomm SM8250.
- È stato aggiunto il supporto per piattaforme, dispositivi e architetture ARM: Galaxy Note 10.1, Microsoft Lumia 950 XL, NanoPi R1, FriendlyArm ZeroPi, Elimo Initium SBC, Broadcom BCM4908, Mediatek MT8192/MT6779/MT8167, MStar Infinity2M, Nuvoton NPCM730, Marvell Armada 382, Mikrotik basato su Marvell Prestera 98DX3236, server con Nuvoton NPCM750 BMC, Kontron i.MX8M Mini, Espressobin Ultra, Chromebook "Trogdor", Kobol Helios64, Engicam PX30.Core.
- È stato integrato il supporto per la console di gioco Ouya basata su NVIDIA Tegra 3.
Nel frattempo, la Fondazione del Software Libero Latinoamericana ha creato una variante completamente libera del kernel 5.11 — Linux-libre 5.11-gnu, priva di elementi di firmware e driver contenenti componenti o porzioni di codice non libere, la cui applicazione è limitata dal produttore. In questo nuovo rilascio, sono stati ripuliti i driver per qat_4xxx (crypto), lt9611uxcm (ponte dsi/hdmi), ccs/smia++ (sensore), ath11k_pci, trasmettitore audio nxp e controller pci mhi. È stato aggiornato il codice di pulizia dei blob nei driver e sottosistemi amdgpu, btqca, btrtl, btusb, i915 csr. Sono stati disattivati nuovi blob in m3 rproc, idt82p33 ptp clock e qualcomm arm64.
Fonte: opennet.ru
