Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.3. Tra le modifiche più significative: la pulizia delle piattaforme ARM obsolete e dei driver grafici, la continuazione dell'integrazione del supporto per il linguaggio Rust, l'utilità hwnoise, il supporto per strutture ad albero red-black nel BPF, la modalità BIG TCP per IPv4, un test di performance Dhrystone integrato, la possibilità di vietare l'esecuzione in memfd, il supporto alla creazione di driver HID utilizzando BPF, e modifiche in Btrfs per ridurre la frammentazione dei gruppi di blocchi.
Nella nuova versione sono stati accettati 15637 patch da 2055 sviluppatori; la dimensione del patch è di 76 MB (le modifiche hanno riguardato 14296 file, sono state aggiunte 1023183 righe di codice e ne sono state rimosse 883103). A titolo di confronto, nella versione precedente erano state proposte 16843 patch da 2178 sviluppatori; la dimensione del patch era di 62 MB. Circa il 39% di tutte le modifiche nel kernel 6.3 riguarda i driver di dispositivo, circa il 15% delle modifiche è relativo all'aggiornamento del codice specifico per architetture hardware, il 10% è connesso allo stack di rete, il 5% ai file system e il 3% ai sottosistemi interni del kernel.
Le principali novità del kernel 6.3:
- Memoria e servizi di sistema
- È stata effettuata una significativa pulizia del codice relativo alle vecchie e non utilizzate piattaforme ARM, riducendo la dimensione del codice sorgente del kernel di 150.000 righe. Sono state rimosse oltre 40 vecchie piattaforme ARM.
- È stata implementata la possibilità di creare driver per dispositivi di input con interfaccia HID (Human Interface Device), realizzati sotto forma di programmi BPF.
- È proseguito il trasferimento dalla branch Rust-for-Linux di funzionalità aggiuntive relative all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Il supporto per Rust non è attivo di default e non porta all'inclusione di Rust tra le dipendenze di compilazione necessarie per il kernel. La funzionalità proposta nelle versioni precedenti è stata ampliata con il supporto per i tipi Arc (implementazione di puntatori con contatore di riferimenti), ScopeGuard (pulizia eseguita al di fuori dello scopo) e ForeignOwnable (che consente il trasferimento di puntatori tra codice C e Rust). Dal pacchetto 'alloc' è stato rimosso il modulo 'borrow' (tipo 'Cow' e interfaccia 'ToOwned'). Si segnala che lo stato del supporto per Rust nel kernel è già vicino a quello necessario per iniziare ad accettare i primi moduli scritti in Rust.
- In User-mode Linux (esecuzione del kernel come processo utente) sui sistemi x86-64 è stato implementato il supporto per il codice scritto in Rust. È stato aggiunto il supporto alla costruzione di User-mode Linux utilizzando clang con l'inclusione di ottimizzazioni durante il linking (LTO).
- È stata aggiunta l'utilità hwnoise per monitorare i ritardi causati da particolarità del funzionamento dell'hardware. Vengono determinati scostamenti nei tempi di esecuzione delle operazioni (jitter) superiori a un microsecondo per 10 minuti di elaborazione.
- È stato aggiunto un modulo del kernel con l'implementazione del test di performance Dhrystone, che può essere utilizzato per valutare le prestazioni della CPU in configurazioni prive di componenti di spazio utente (ad esempio, nella fase di porting per nuovi SoC, dove è presente solo il caricamento del kernel).
- È stata aggiunta un'opzione della linea di comando del kernel 'cgroup.memory=nobpf', che disabilita il monitoraggio del consumo di memoria per i programmi BPF, utile per sistemi con contenitori isolati.
- Per i programmi BPF è stata proposta l'implementazione di una struttura dati albero rosso-nero, che utilizza kfunc + kptr (bpf_rbtree_add, bpf_rbtree_remove, bpf_rbtree_first) anziché aggiungere un nuovo tipo di mappatura.
- Nel meccanismo delle sequenze riavviabili (rseq, restartable sequences) è stata aggiunta la possibilità di trasmettere ai processi identificatori di esecuzione parallela (memory-map concurrency ID), identificabili con il numero della CPU. Rseq fornisce mezzi per l'esecuzione atomica rapida delle operazioni, che in caso di interruzione da un altro thread vengono ripulite e si tenta nuovamente l'esecuzione.
- Sui processori ARM è stato garantito il supporto per le istruzioni SME 2 (Scalable Matrix Extension).
- Per le architetture s390x e RISC-V RV64 è stato implementato il supporto per il meccanismo 'BPF trampoline', che consente di minimizzare l'overhead durante la trasmissione di chiamate tra il kernel e i programmi BPF.
- Nei sistemi con processori basati sull'architettura RISC-V è stato implementato l'uso delle istruzioni 'ZBB' per accelerare le operazioni sulle stringhe.
- Per i sistemi basati sull'architettura del set di istruzioni LoongArch (utilizzata nei processori Loongson 3 5000 e che implementa un nuovo RISC ISA, simile a MIPS e RISC-V) è stato implementato il supporto per la randomizzazione dello spazio degli indirizzi del kernel (KASLR), la modifica della posizione del kernel in memoria (relocation), i punti di interruzione hardware e il meccanismo kprobe.
- Nel meccanismo DAMOS (Data Access Monitoring-based Operation Schemes), che consente di liberare memoria tenendo conto della frequenza di accesso alla memoria, è stata implementata la supporto per filtri per escludere dalla gestione in DAMOS determinate aree di memoria.
- Nella libreria standard C minimale Nolibc è stato implementato il supporto per l'architettura s390 e il set di istruzioni Arm Thumb1 (oltre al supporto per ARM, AArch64, i386, x86_64, RISC-V e MIPS).
- È stata effettuata un'ottimizzazione di objtool per accelerare la compilazione del kernel e ridurre il picco di consumo di memoria durante la compilazione (nella compilazione del kernel in modalità 'allyesconfig' ora non si verificano problemi di terminazione forzata dei processi su sistemi con 32 GB di RAM).
- È stata interrotta la supporto per la compilazione del kernel con il compilatore Intel ICC, che era già da tempo non funzionante e nessuno si era mostrato disposto a ripararlo.
- Sottosistema disco, I/O e file system
- In tmpfs è stato implementato il supporto per il mapping degli identificatori degli utenti dei file system montati, utilizzato per associare i file di un determinato utente su una partizione montata di un altro utente nel sistema corrente.
- In Btrfs, per ridurre la frammentazione dei gruppi di blocchi, è stato garantito il partizionamento degli extent in base alla dimensione durante l'allocazione dei blocchi, cioè ogni gruppo di blocchi ora è limitato a extent piccoli (fino a 128KB), medi (fino a 8MB) e grandi. È stata effettuata una ristrutturazione dell'implementazione raid56. È stato rivisitato il codice per il controllo delle somme di controllo. Sono state apportate ottimizzazioni delle prestazioni che hanno permesso di accelerare l'operazione send fino a 10 volte grazie alla memorizzazione nella cache utime per le directory e all'esecuzione di comandi solo quando necessario. Le operazioni fiemap sono state accelerate di tre volte evitando i controlli delle referenze inverse per i dati condivisi (snapshot). Le operazioni con i metadati sono state accelerate del 10% grazie all'ottimizzazione della ricerca delle chiavi nelle strutture b-tree.
- È stata aumentata la performance del file system ext4 grazie alla possibilità di eseguire simultaneamente operazioni di input/output diretto da più processi sui blocchi pre-allocati, utilizzando blocchi condivisi inode invece di blocchi esclusivi.
- In f2fs è stato lavorato per migliorare la leggibilità del codice. Sono stati risolti problemi importanti legati alla scrittura atomica e alla nuova cache degli extent.
- Nel file system EROFS (Enhanced Read-Only File System), progettato per essere utilizzato in partizioni accessibili solo in modalità di sola lettura, è stata implementata la possibilità di associare alle CPU le operazioni di decompressione del contenuto compresso dei file per ridurre i ritardi nell'accesso ai dati.
- Nel pianificatore di input/output BFQ è stata aggiunta la supporto per i dischi avanzati, ad esempio quelli che utilizzano più attuatori di teste gestiti separatamente (Multi Actuator).
- Nella realizzazione del client e server NFS è stata aggiunta la supporto per la crittografia dei dati utilizzando l'algoritmo AES-SHA2.
- Nel sottosistema FUSE (Filesystems In User Space) è stata aggiunta la supporto per il meccanismo di estensione delle richieste, che consente di includere ulteriori informazioni nella richiesta. Basato su questa funzionalità, è stata implementata l'aggiunta di identificatori di gruppo alla richiesta FS, necessari per il controllo dei diritti di accesso durante la creazione di oggetti nel FS (create, mkdir, symlink, mknod).
- Virtualizzazione e sicurezza
- Nel hypervisor KVM per sistemi x86 è stata aggiunta la supporto per le chiamate ipervisitore avanzate Hyper-V e la loro trasmissione al gestore, che opera nell'ambiente host nello spazio utente. Questa modifica ha consentito di implementare il supporto per l'esecuzione annidata dell'ipervisitore Hyper-V.
- In KVM è stata semplificata la limitazione dell'accesso del sistema ospite agli eventi PMU (Performance Monitor Unit) relativi alla misurazione delle prestazioni.
- Nel meccanismo memfd, che consente di identificare un'area di memoria tramite un descrittore di file passato tra i processi, è stata aggiunta la possibilità di creare aree in cui l'esecuzione del codice è vietata (memfd non eseguibili) e non è possibile in futuro impostare i diritti di esecuzione.
- È stata aggiunta una nuova operazione prctl PR_SET_MDWE, che blocca i tentativi di attivare i diritti di accesso alla memoria, che consentono contemporaneamente scrittura ed esecuzione.
- È stata aggiunta e attivata per impostazione predefinita la protezione contro gli attacchi di tipo Spectre, realizzata sulla base della modalità automatica IBRS (Enhanced Indirect Branch Restricted Speculation) proposta nei processori AMD Zen 4, che consente di autorizzare e vietare in modo adattivo l'esecuzione speculativa delle istruzioni durante la gestione delle interruzioni, delle chiamate di sistema e dei cambi di contesto. La protezione proposta comporta minori costi rispetto alla protezione Retpoline.
- È stata rimossa una vulnerabilità che consentiva di eludere la protezione contro gli attacchi Spectre v2 durante l'uso della tecnologia di multithreading simultaneo (SMT o Hyper-Threading) e causata dalla disattivazione del meccanismo STIBP (Single Thread Indirect Branch Predictors) nella selezione della modalità di protezione IBRS.
- Per i sistemi basati sull'architettura ARM64 è stata aggiunta una nuova destinazione di compilazione «virtconfig», che attiva solo il set minimo di componenti del kernel necessari per il boot nei sistemi di virtualizzazione.
- Per l'architettura m68k è stato aggiunto il supporto per il filtraggio delle chiamate di sistema tramite il meccanismo seccomp.
- Aggiunto il supporto per i dispositivi CRB TPM2 (Command Response Buffer) integrati nei processori AMD Ryzen, basati sulla tecnologia Microsoft Pluton.
- Sottosistema di rete
- È stata aggiunta un'interfaccia netlink per la configurazione del sottolivello di prevenzione delle collisioni PLCA (Physical Layer Collision Avoidance), definito nella specifica IEEE 802.3cg-2019 e utilizzato nelle reti Ethernet 802.3cg (10Base-T1S), ottimizzate per il collegamento di dispositivi IoT e sistemi industriali. L'uso di PLCA consente di migliorare le prestazioni nelle reti Ethernet a media condivisa.
- Interrotta la supporto per l'API «wireless extensions» per la gestione delle interfacce wireless WiFi 7 (802.11be) poiché questa API non copre tutte le impostazioni necessarie. Durante il tentativo di utilizzo dell'API «wireless extensions», che continua a essere supportata come strato emulativo, verrà ora mostrato un avviso per la maggior parte dei dispositivi attuali.
- È stata preparata una documentazione dettagliata per l'API netlink (per sviluppatori del kernel e per sviluppatori applicativi nello spazio utente). Implementato lo strumento ynl-gen-c per generare codice C basato sulle specifiche YAML del protocollo Netlink.
- Nei socket di rete è stato aggiunto il supporto per l'opzione IP_LOCAL_PORT_RANGE per semplificare la configurazione delle connessioni in uscita attraverso traduttori di indirizzi senza utilizzo di SNAT. Usando uno Indirizzi IP su più host, IP_LOCAL_PORT_RANGE consente di utilizzare un intervallo diverso di porte di rete in uscita su ciascun host, mentre sul gateway si può reindirizzare i pacchetti in base ai numeri di porta.
- Per MPTCP (MultiPath TCP) è stata implementata la possibilità di gestire flussi misti, in cui vengono utilizzati i protocolli IPv4 e IPv6. MPTCP rappresenta un'estensione del protocollo TCP per l'organizzazione di connessioni TCP che consegnano pacchetti simultaneamente su più percorsi attraverso interfacce di rete diverse associate a indirizzi IP differenti.
- Per IPv4 è stata implementata la possibilità di utilizzare l'estensione BIG TCP, che consente di aumentare la dimensione massima del pacchetto TCP fino a 4 GB per ottimizzare il funzionamento delle reti interne a alta velocità nei data center. Tale aumento delle dimensioni del pacchetto con un'intestazione a 16 bit viene raggiunto attraverso l'implementazione di pacchetti «jumbo», la cui dimensione nell'intestazione IP è impostata a 0, mentre la dimensione effettiva è fornita in un campo a 32 bit separato in un'intestazione attaccata.
- È stato aggiunto un nuovo parametro sysctl default_rps_mask, attraverso il quale è possibile impostare la configurazione RPS (Receive Packet Steering) predefinita, responsabile della distribuzione della gestione del traffico in entrata sui core CPU a livello di gestori delle interruzioni.
- Interrotta la supporto per le discipline di gestione delle code per limitare il traffico CBQ (class-based queuing), ATM (circuiti virtuali ATM), dsmark (differentiated service marker), tcindex (traffic-control index) e RSVP (resource reservation protocol). Queste discipline sono rimaste trascurate per lungo tempo e non ci sono stati volontari per continuare il loro supporto.
- Attrezzature
- Rimossi tutti i driver grafici basati su DRI1: i810 (vecchie schede grafiche integrate Intel 8xx), mga (GPU Matrox), r128 (ATI Rage 128 GPU, comprese le schede Rage Fury, XPERT 99 e XPERT 128), savage (GPU S3 Savage), sis (GPU Crusty SiS), tdfx (3dfx Voodoo) e via (VIA IGP), che erano stati dichiarati obsoleti nel 2016 e non sono più supportati in Mesa dal 2012.
- Rimossi i driver obsoleti del frame buffer (fbdev) omap1, s3c2410, tmiofb e w100fb.
- Aggiunto il driver DRM per i blocchi VPU (Versatile Processing Unit) integrati nei CPU Intel Meteor Lake (14a generazione), destinati ad accelerare le operazioni relative alla visione artificiale e all'apprendimento automatico. Il driver è stato implementato utilizzando la sottosistema «accel», mirata a garantire il supporto per acceleratori di calcolo, che possono essere forniti sia come ASIC separati sia come blocchi IP all'interno di SoC e GPU.
- Nel driver i915 (Intel) è stato ampliato il supporto per le schede grafiche discrete Intel Arc (DG2/Alchemist), è stata implementata una supporto preliminare per il GPU Meteor Lake, è stato incluso il supporto per il GPU Intel Xe HP 4tile.
- Nel driver amdgpu è stato aggiunto il supporto per la tecnologia AdaptiveSync e la possibilità di utilizzare modalità di protezione contro l'intercettazione dei dati visualizzati su più schermi (Secure Display). Aggiornato il supporto per DCN 3.2 (Display Core Next), SR-IOV RAS, VCN RAS, SMU 13.x e DP 2.1.
- Nel driver msm (GPU Qualcomm Adreno) è stato aggiunto il supporto per le piattaforme SM8350, SM8450, SM8550, SDM845 e SC8280XP.
- Nel driver Nouveau è stata interrotta la supporto per le vecchie chiamate ioctl.
- Nel driver etnaviv è stato aggiunto il supporto sperimentale per NPU VerSilicon (VeriSilicon Neural Network Processor).
- È stato implementato il driver pata_parport per i dispositivi IDE collegati tramite porta parallela. Il driver aggiunto ha permesso di rimuovere il vecchio driver PARIDE dal kernel e di modernizzare il sottosistema ATA. Una limitazione del nuovo driver è l'impossibilità di collegare contemporaneamente una stampante e un disco tramite porta parallela.
- È stato aggiunto il driver ath12k per le schede wireless basate su chip Qualcomm con supporto per Wi-Fi 7. È stato aggiunto il supporto per le schede wireless basate su chip RealTek RTL8188EU.
- È stato aggiunto il supporto per 46 schede con processori basati sull'architettura ARM64, tra cui Samsung Galaxy Tab A (2015), Samsung Galaxy S5, BananaPi R3, Debix Model A, EmbedFire LubanCat 1/2, Facebook Greatlakes, Orange Pi R1 Plus, Tesla FSD, e dispositivi basati su SoC Qualcomm MSM8953 (Snapdragon 610), SM8550 (Snapdragon 8 Gen 2), SDM450 e SDM632, Rockchips RK3128 TV box, RV1126 Vision, RK3588, RK3568, RK3566, RK3588 e RK3328, TI K3 (AM642/AM654/AM68/AM69).
Nel frattempo, la Fondazione Latinoamericana per il Software Libero ha creato una versione completamente libera del kernel 6.3 — Linux-libre 6.3-gnu, liberata da elementi di firmware e driver contenenti componenti o sezioni di codice non libere, il cui utilizzo è limitato dal produttore. Nella versione 6.3 è stata effettuata la pulizia dei blob nei nuovi driver ath12k, aw88395 e peb2466, così come nei nuovi file devicetree per i dispositivi qcom basati sull'architettura AArch64. È stato aggiornato il codice di pulizia dei blob nei driver e nei sottosistemi amdgpu, xhci-rcar, qcom-q6v5-pas, sp8870, av7110, così come nei driver per schede DVB con decodifica software e nei file BPF precompilati. È stata interrotta la pulizia nei driver mga, r128, tm6000, cpia2 e r8188eu, poiché sono stati rimossi dal kernel. È stata migliorata la pulizia dai blob nel driver i915.
Fonte: opennet.ru
