Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.11. Tra le modifiche più significative: supporto per operazioni atomiche di scrittura a livello di blocco, supporto per le operazioni bind() e listen() in io_uring, un nuovo meccanismo di blocco per i gestori di interrupt, possibilità di scrivere in file eseguibili mirrorati in memoria, supporto per la scrittura di driver per dispositivi a blocchi in Rust, ottimizzazione della chiamata a getrandom(), nuova implementazione di AES-GCM.
Nella nuova versione sono state incluse 15130 correzioni da 2078 sviluppatori, la dimensione della patch è di 85 MB (le modifiche hanno interessato 13282 file, sono state aggiunte 985857 righe di codice e 268915 righe rimosse). Nell'ultima versione sono state registrate 14564 correzioni da 1989 sviluppatori, la dimensione della patch era di 41 MB (la metà rispetto alla patch per il kernel 6.11). Circa il 46% di tutte le modifiche presentate in 6.11 riguardano i driver dei dispositivi, circa il 17% delle modifiche riguardano l'aggiornamento del codice specifico per le architetture hardware, il 10% è relativo allo stack di rete, il 5% ai file system e il 3% ai sottosistemi interni del kernel.
Novità principali del kernel 6.11:
- Sottosistema di disco, input/output e file system
- È implementato il supporto per operazioni atomiche di scrittura a livello di blocco, in cui viene scritto sullo storage l'intero insieme di blocchi specificato oppure nessuno dei blocchi, il che protegge da situazioni in cui, dopo un guasto dell'hardware, viene scritta solo una parte dei blocchi mentre l'altra parte rimane con informazioni obsolete. Per abilitare la modalità di scrittura atomica nella chiamata di sistema pwritev() è stato aggiunto il flag RWF_ATOMIC. Le informazioni sul supporto della scrittura atomica (atomic_write_unit_min, atomic_write_unit_max e atomic_write_segments_max) relative a singoli file possono essere ottenute tramite la funzione statx().
- È stato fornito il supporto per la scrittura in file eseguibili associati a processi attivi. In precedenza, come nelle altre sistemazioni Unix-like, il kernel restituiva un errore quando si tentava di scrivere in un file eseguibile di un processo in esecuzione. Questa limitazione è stata rimossa poiché era priva di senso pratico.
- È stata implementata la possibilità di sviluppare driver per dispositivi a blocchi in Rust. A titolo di esempio, nel kernel è stato aggiunto il driver rnull, che è un'analogo del driver null_blk, scritto in Rust.
- Nel filesystem Btrfs, nell'opzione di montaggio «rescue=», è supportato il nuovo modo «ignoremetacsums» e «ignoresuperflags», che possono essere utilizzati per spostare alcune verifiche nello spazio utente durante il ripristino del FS dopo un crash. L'implementazione dell'operazione di restituzione dinamica dei gruppi di blocchi è stata ridisegnata per escludere la possibilità di una situazione di scarsità di spazio libero in caso di riempimento incompleto del FS.
- Nel filesystem ntfs3 è stato implementato il supporto per gli attributi «compressed» e «immutable», che definiscono file compressi e immutabili.
- Nei filesystem F2FS ed Ext4, il trattamento dei nomi dei file senza considerare il maiuscolo (casefold) è stato semplificato attraverso la memorizzazione dei nomi in forma di stringhe qstr senza conversioni di maiuscole.
- Nel filesystem Ext4, l'implementazione della funzione jbd2_transaction_committed è stata ottimizzata per migliorare le prestazioni su supporti di memorizzazione molto rapidi (nei test è stato notato un incremento delle operazioni elaborate al secondo, che raggiunge il 20%).
- Nella chiamata di sistema statx() è consentito passare un puntatore NULL invece di una stringa vuota con il percorso del file, nel caso in cui sia impostato il flag AT_EMPTY_PATH.
- Nella chiamata di sistema open_by_handle_at() sono state attenuate le verifiche dei diritti di accesso al file, nel caso in cui non siano presenti i privilegi CAP_DAC_READ_SEARCH per la ricerca nello spazio dei nomi iniziale. In precedenza, la necessità di avere i privilegi CAP_DAC_READ_SEARCH per lo spazio dei nomi iniziale impediva di utilizzare la chiamata di sistema open_by_handle_at() nei container.
- Sono state ampliate le funzionalità delle chiamate di sistema listmount() e statmount(). In listmount() è stato aggiunto il flag LISTMOUNT_REVERSE per visualizzare il contenuto della tabella dei punti di montaggio in ordine inverso (le registrazioni più recenti in cima). In statmount() è stata implementata la visualizzazione delle opzioni impostate durante il montaggio del FS. In entrambe le chiamate di sistema è consentito l'operato in assenza di accesso allo spazio dei nomi iniziale (quando si ha solo accesso allo spazio dei nomi locale o esterno).
- Nel filesystem Bcachefs è stato implementato il supporto per il ripristino automatico trasparente dei dati problematici, utilizzando codici di recupero degli errori: se durante la lettura si verifica un errore di input/output o viene calcolata un'incongruenza del checksum, il blocco di dati problematico viene automaticamente riscritto in presenza di ridondanza per il suo recupero.
- Memoria e servizi di sistema
- Sono stati inclusi nel sistema patch che implementano un nuovo meccanismo di blocco per i gestori di interruzioni del software (BH, bottom-half), che garantisce il blocco delle strutture dati utilizzate senza causare il blocco dell'esecuzione parallela di codice non correlato. Si osserva che la modifica ha permesso non solo di ridurre le latenze per i kernel operanti in modalità realtime, ma anche di migliorare le prestazioni dei kernel normali (ad esempio, per alcuni tipi di carico si osserva un aumento delle prestazioni del sottosistema di rete del 14,5%).
- Nel sottosistema di input/output asincrono io_uring è stata aggiunta la supporto per le operazioni necessarie a implementare le funzioni bind() e listen(), utilizzate per creare socket di rete per la ricezione delle connessioni.
- È stato aggiunto un insieme di operazioni ioctl per il pseudo-FS NSFS (NameSpace FS), utilizzato per lavorare con gli spazi dei nomi. I nuovi ioctl consentono di convertire gli identificatori di processi e gruppi di thread tra diversi spazi dei nomi di identificatori di processi (PID namespace). Sono stati aggiunti anche ioctl simili che consentono di determinare i descrittori di file dei processi in spazi dei nomi diversi basati su identificatori pidfd nel pseudo-FS pidfd.
- Per i programmi BPF è stato aggiunto il supporto per un nuovo iteratore per lavorare con le maschere di bit, che può essere utilizzato, ad esempio, per esaminare singoli bit in aree di memoria, come cpumask. È stato aggiunto un meccanismo per inviare ai processi nello spazio utente notifiche di disconnessione (detach/unregister) dell'oggetto struct_ops. È stata ampliata la gamma di tipi utilizzabili negli array (ad esempio, è possibile dichiarare array con elementi di tipi kptr, bpf_rb_root e bpf_list_head). È stato proposto un meccanismo più affidabile Split BTF (BPF Type Format), utilizzato per la verifica dei tipi nel pseudocodice BPF.
- È stato aggiunto un sottosistema che consente di gestire l'alimentazione dei dispositivi in un ordine specifico, nel caso in cui un dispositivo debba essere attivato prima di un altro (ad esempio, durante l'attivazione dei chip wireless su piattaforme Qualcomm).
- È stato aggiunto il modulo 'Sloppy logic analyzer', che consente di creare semplici analizzatori logici di segnali, che utilizzano GPIO e funzionano su un core CPU separato.
- Aggiunta la supporto per le costanti runtime, che possono essere utilizzate al posto delle variabili inizializzate una sola volta. Ad esempio, le costanti runtime possono essere utilizzate al posto delle variabili che memorizzano un puntatore e una dimensione per la cache dentry. Queste variabili vengono impostate al momento del caricamento e poi non cambiano mai. L'idea è di sostituire i valori di tali variabili direttamente nelle istruzioni nel codice, escludendo le spese generali legate alla manipolazione di puntatori.
- Continua il trasferimento delle modifiche dal ramo Rust-for-Linux, relative all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel (il supporto Rust non è attivo per impostazione predefinita e non porta all'inclusione di Rust tra le dipendenze di compilazione obbligatorie del kernel). Aggiunto il supporto per il rilascio di Rust 1.80 (ancora supportato Rust 1.78 come versione minima). Oltre agli strumenti precedentemente notati per lo sviluppo di driver per dispositivi a blocchi, nella nuova versione sono state aggiunte astrazioni per il caricamento di firmware, l'accesso allo spazio utente (uaccess) e la gestione della struttura "page".
- Per i sistemi x86-64 è stato implementato un nuovo chiamata di sistema uretprobe(), che ottimizza il funzionamento del meccanismo di tracciamento uretprobe, consentendo di monitorare i valori restituiti dalle funzioni nelle applicazioni dello spazio utente.
- Aggiunti parametri della riga di comando del kernel: "reserve_mem" per riservare un'area di memoria denominata durante il caricamento e "ramoops.mem_name" per l'uso nella pstore area di memoria creata tramite reserve_mem.
- Nel controller della memoria basato su cgroup, nel file memory.reclaim, attraverso il quale vengono definiti i parametri per il recupero della memoria, è stato aggiunto il parametro "swappiness", che permette di modificare l'equilibrio tra il recupero delle pagine anonime di memoria nella swap e il rilascio delle pagine di memoria occupate dal cache di file.
- Aggiunto l'interfaccia ioctl PROCMAP_QUERY per una ricerca più efficiente delle aree di memoria virtuale (Virtual Memory Area) in /proc/PID/maps.
- Aggiunta la flag MAP_DROPPABLE nella chiamata di sistema mmap() per richiedere memoria che non verrà mai scaricata nella swap, e che in caso di mancanza di memoria può essere eliminata.
- Per l'architettura ARM64 è stato implementato il supporto per il hot plugging (cambio in modalità online/offline) di CPU fisici e virtuali su sistemi con ACPI.
- Per l'architettura RISC-V è stata garantita la supporto per il collegamento a caldo della memoria ed è stato aggiunto il supporto per il plugin GCC STACKLEAK (che inizializza tutte le variabili memorizzate nello stack per prevenire la perdita di informazioni dal kernel attraverso variabili non inizializzate, che potrebbero contenere residui di dati precedentemente salvati nello stack).
- Rimosso il meccanismo di mappatura della memoria EFI fittizia (fake EFI memory map) durante la fase di avvio. Questo meccanismo non è stato utilizzato nella pratica e ostacolava lo sviluppo nel campo dell'esecuzione confidenziale. macchine virtuali.
- Cessata la supporto per la piattaforma PowerPC 40x.
- Aumentati i requisiti per la versione di GNU Make: per la compilazione del kernel è necessario almeno un rilascio di GNU Make pubblicato nel 2013.
- Virtualizzazione e sicurezza
- Integrati patch che accelerano significativamente (fino a 15 volte) l'ottenimento di numeri casuali tramite la chiamata di sistema getrandom(). L'ottimizzazione si basa sull'uso del meccanismo vDSO (virtual dynamic shared object), che consente di spostare il gestore della chiamata di sistema dal kernel allo spazio utente ed evitare passaggi di contesto. Il caricamento dell'implementazione della chiamata di sistema nell'indirizzo di spazio del processo avviene direttamente dal kernel.
- Per i sistemi x86-64 è stata inclusa una nuova implementazione dell'algoritmo di cifratura AES-GCM, che supporta l'uso delle istruzioni vettoriali VAES, VPCLMULQDQ e AVX512/AVX10 per accelerare i calcoli. Nei test condotti, l'aumento delle prestazioni dopo la transizione alla nuova implementazione raggiunge il 156%. L'implementazione in assembler dell'AES-GCM è stata completamente riscritta tenendo conto della correttezza, delle prestazioni, della dimensione e della documentazione esaustiva del codice.
- Realizzata la possibilità di avviare il kernel come sistema guest in ambienti virtualizzati che utilizzano l'estensione del processore AMD SEV-SNP (Secure Nested Paging), progettata per garantire un funzionamento sicuro con tabelle di pagine di memoria annidate. Per un'ulteriore isolamento dell'accesso alle risorse dalle macchine virtuali può essere utilizzato il modulo SVSM (Linux Secure VM Service Module). Nel hypervisor KVM è stata aggiunta una supporto iniziale per avviare sistemi guest protetti tramite AMD SEV-SNP.
- Aggiunto un allocatore di bucket slab separato, attivabile tramite il parametro CONFIG_SLAB_BUCKETS e in grado di fornire protezione contro attacchi con la tecnica 'heap spraying'.
- Nell'ipervisor KVM è stata aggiunta una chiamata ioctl per l'allocazione anticipata di memoria al sistema ospite prima del suo effettivo avvio.
- Sottosistema di rete
- È stato aggiunto il parametro sysctl net.tcp_rto_min_us, che consente di configurare il timeout minimo di ritrasmissione (retransmission timeout) per i socket TCP.
- Nell'utilità ethtool è stata aggiunta la possibilità di una configurazione avanzata dei gestori di interruzione per le interfacce di rete che utilizzano l'interfaccia Net DIM.
- Apparecchiatura
- Nel driver AMDGPU è stata abilitata la supporto iniziale per la GPU AMD RDNA4 ("GFX12"). È stata aggiunta la supporto per le tecnologie DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 e MMHUB 4.1.
- Continuano i lavori sul driver drm (Direct Rendering Manager) Xe per GPU basate sull'architettura Intel Xe, utilizzata nelle schede grafiche Intel della serie Arc e nella grafica integrata, a partire dai processori Tiger Lake. È stato migliorato il supporto per GPU basate sulle microarchitetture Battlemage, Arrow Lake e Lunar Lake.
- Nella sottosistema DRM (Direct Rendering Manager) è stato riscritto il gestore dei parametri forniti dal monitor in EDID (Extended Display Identification Data).
- Nel driver i915 è stato aggiunto il supporto per la GPU Battlemage Xe2 ed è stata abilitata per impostazione predefinita la modalità CMRR (Content Match Refresh Rate).
- Nel driver DRM msm (GPU Qualcomm Adreno) è stato aggiunto il supporto per la piattaforma SM7150 e le GPU X185 e a505.
- È stato aggiunto il supporto per i pannelli LCD Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
- Nella sottosistema audio è stato aggiunto il supporto per i chip e codec Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 e Texas Instruments PCM5242.
- È stata apportata l'ultima serie di modifiche per garantire il supporto per l'ARM SoC Snapdragon X Elite, che utilizza un proprio CPU Qualcomm Oryon a 12 core e GPU Qualcomm Adreno. Il chip è progettato per l'uso in laptop e PC, e supera in molti test di prestazioni i chip Apple M3 e Intel Core Ultra 155H. Le modifiche apportate al kernel 6.11 sono collegate al supporto della GPU Adreno X1-85 e alla gestione del consumo energetico. Sono stati dichiarati come dispositivi basati sul SoC Snapdragon X Elite i laptop ASUS Vivobook S15 e Lenovo Yoga Slim7x.
Contemporaneamente, il Fondo per il Software Libero latinoamericano ha creato una versione completamente libera del kernel 6.11 — Linux-libre 6.10-gnu, ripulita da elementi di firmware e driver che contengono componenti non liberi o porzioni di codice il cui utilizzo è limitato dal produttore. Nella release 6.11, il codice di pulizia dei blob è stato aggiornato per i driver mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth e tas2781. È stata effettuata la pulizia dei nuovi driver amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 e pcie-rcar-gen4. È stata effettuata la pulizia dei nomi dei blob nei file dts (devicetree) per l'architettura Aarch64. È stata aggiunta una versione dei primitivi per il caricamento del firmware senza messaggi di avviso e richieste (nowait-nowarn). È stato aggiunto il codice per determinare i primitivi di caricamento del firmware nel codice Rust.
Fonte: opennet.ru
