Rilascio del kernel Linux 6.11

Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.11. Tra le modifiche più significative: supporto per operazioni di scrittura atomica a livello di blocco, supporto per le operazioni bind() e listen() in io_uring, un nuovo meccanismo di blocco per i gestori di interruzioni, la possibilità di scrivere in file eseguibili mappati in memoria, supporto per la scrittura di driver per dispositivi a blocchi in linguaggio Rust, ottimizzazione della chiamata a getrandom() e una nuova implementazione di AES-GCM.

Nella nuova versione sono stati accettati 15130 bugfix da 2078 sviluppatori, la dimensione della patch è di 85 MB (le modifiche hanno interessato 13282 file, sono state aggiunte 985857 righe di codice, rimosse 268915 righe). Nell'uscita precedente c'erano 14564 bugfix da 1989 sviluppatori, la dimensione della patch era di 41 MB (la metà della patch per il kernel 6.11). Circa il 46% di tutti i cambiamenti presentati in 6.11 riguardano i driver di dispositivo, circa il 17% riguarda 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 disco, I/O e file system
    • È stato implementato il supporto per operazioni di scrittura atomica a livello di blocco, in cui viene scritto sul supporto o l'intero insieme di blocchi specificato, oppure nessuno di essi, il che protegge da situazioni in cui, dopo un guasto hardware, solo parte dei blocchi viene scritta, mentre l'altra parte conserva informazioni obsolete. Per attivare la modalità di scrittura atomica nella chiamata di sistema pwritev(), è stato aggiunto il flag RWF_ATOMIC. Le informazioni sul supporto per la scrittura atomica (atomic_write_unit_min, atomic_write_unit_max e atomic_write_segments_max) in relazione a file specifici possono essere ottenute tramite la funzione statx().
    • È stato fornito il supporto per la scrittura in file eseguibili associati a processi in esecuzione. In precedenza, come in altri sistemi Unix-like, il kernel generava un errore quando si tentava di scrivere in un file eseguibile di un processo in esecuzione. Questa restrizione è stata rimossa, poiché non ha senso pratico.
    • È stata implementata la possibilità di sviluppare driver per dispositivi a blocchi in linguaggio Rust. Come esempio, nel kernel è stato aggiunto un driver rnull, che è l'equivalente del driver null_blk, scritto in Rust.
    • Nel file system Btrfs, nelle opzioni di montaggio 'rescue=', è stato implementato il supporto per le nuove modalità 'ignoremetacsums' e 'ignoresuperflags', che possono essere utilizzate per spostare alcune verifiche nello spazio utente durante il recupero del file system dopo un guasto. L'implementazione dell'operazione di restituzione dinamica dei gruppi di blocchi è stata rielaborata per escludere la possibilità di esaurire lo spazio libero in condizioni di riempimento incompleto del file system.
    • Nel file system ntfs3 è stato implementato il supporto per gli attributi 'compressed' e 'immutable', che definiscono file compressi e immutabili.
    • Nel file system F2FS e Ext4, la gestione dei nomi dei file senza distinzione tra maiuscole e minuscole (casefold) è stata semplificata tramite la memorizzazione dei nomi in forma di stringhe qstr senza inutili conversioni di maiuscole.
    • Nel file system Ext4, l'implementazione della funzione jbd2_transaction_committed è stata ottimizzata per migliorare le prestazioni su supporti molto veloci (nei test è stato registrato un aumento delle operazioni elaborate al secondo, fino al 20%).
    • Nella chiamata di sistema statx() è consentito passare un puntatore NULL invece di una stringa vuota con un percorso di file, se è impostato il flag AT_EMPTY_PATH.
    • Nella chiamata di sistema open_by_handle_at() sono state allentate le verifiche sui diritti di accesso al file, in assenza dei diritti CAP_DAC_READ_SEARCH per la ricerca nello spazio dei nomi iniziale. In precedenza, la necessità di avere i diritti CAP_DAC_READ_SEARCH nello spazio dei nomi iniziale impediva l'uso della chiamata di sistema open_by_handle_at() nei contenitori.
    • Le funzionalità delle chiamate di sistema listmount() e statmount() sono state ampliate. In listmount() è stato aggiunto il flag LISTMOUNT_REVERSE per visualizzare il contenuto della tabella dei punti di montaggio in ordine inverso (le ultime voci in cima). In statmount() è stata implementata la visualizzazione delle opzioni impostate durante il montaggio del file system. In entrambe le chiamate di sistema è consentito operare senza accesso allo spazio dei nomi iniziale (quando si ha solo accesso allo spazio dei nomi locale o esterno).
    • Nel file system Bcachefs è stato implementato il supporto per il ripristino automatico e trasparente di dati problematici, utilizzando codici di recupero degli errori: se si verifica un errore di input/output durante la lettura o si calcola una discrepanza nella somma di controllo, il blocco di dati problematico viene automaticamente sovrascritto se è disponibile ridondanza per il suo recupero.
  • Memoria e servizi di sistema
    • Sono stati integrati dei patch con un nuovo meccanismo di blocco per i gestori di interruzione (BH, bottom-half), che garantisce il blocco delle strutture dati utilizzate, senza però impedire l'esecuzione parallela di codice non correlato. Si osserva che questa modifica ha non solo ridotto i ritardi per i core operanti in modalità realtime, ma ha anche aumentato le prestazioni dei core normali (ad esempio, per alcune tipologie di carico si registra un miglioramento della prestazione del sottosistema di rete del 14,5%).
    • Nella sottosistema di input/output asincrono io_uring è stata aggiunta la supporto per le operazioni per implementare le funzioni bind() e listen(), utilizzate per la creazione di socket di rete in ascolto.
    • È stato aggiunto un set di operazioni ioctl per il pseudo-FS NSFS (NameSpace FS), utilizzato per lavorare con gli spazi dei nomi. I nuovi ioctl consentono la trasformazione degli 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 permettono, basandosi sugli identificatori pidfd, di determinare i descrittori di file dei processi in spazi dei nomi distinti, nel pseudo-FS pidfd.
    • Per i programmi BPF è stato aggiunto un nuovo iteratore per lavorare con le maschere di bit, che può essere utilizzato, ad esempio, per scorrere singoli bit in aree di memoria, come cpumask. È stato implementato un meccanismo per inviare notifiche ai processi nello spazio utente riguardo la disconnessione (detach/unregister) di un 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 per la Split BTF (BPF Type Format), utilizzato per la verifica dei tipi nel pseudocodice BPF.
    • È stata aggiunta una sottosistema che consente di organizzare 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 di chip wireless su piattaforme Qualcomm).
    • È stato aggiunto il modulo 'Sloppy logic analyzer', che consente di creare semplici analizzatori logici di segnale, utilizzando GPIO e funzionando su un core CPU separato.
    • È stata aggiunta la supporto per runtime-constant, che possono essere utilizzate al posto di variabili inizializzate una sola volta. Ad esempio, le runtime-constant possono essere impiegate invece di variabili che memorizzano un puntatore e una dimensione per la cache dentry. Queste variabili vengono impostate durante il bootstrap e non cambiano mai più. L'idea è di sostituire i valori di tali variabili direttamente nelle istruzioni del codice, eliminando il sovraccarico legato alle manovre con i puntatori.
    • Continua il trasferimento delle modifiche dalla branch Rust-for-Linux, relative all'uso del linguaggio Rust come secondo linguaggio per la scrittura di driver e moduli del kernel (il supporto per Rust non è attivo per impostazione predefinita e non comporta l'inclusione di Rust come dipendenza di compilazione obbligatoria per il kernel). È stato aggiunto il supporto per il rilascio di Rust 1.80 (la versione minima supportata rimane Rust 1.78). Oltre agli strumenti già menzionati per lo sviluppo di driver per dispositivi a blocchi, la nuova versione include astrazioni per il caricamento di firmware, l'accesso allo spazio utente (uaccess) e l'interazione con la struttura 'page'.
    • Per i sistemi x86-64 è stata implementata una nuova chiamata di sistema uretprobe(), che ottimizza il funzionamento del meccanismo di tracciamento uretprobe, permettendo di monitorare i valori restituiti dalle funzioni nelle applicazioni dello spazio utente.
    • Sono stati aggiunti parametri alla linea di comando del kernel: 'reserve_mem' per riservare un'area di memoria nominata durante l'avvio e 'ramoops.mem_name' per l'utilizzo nell'area di memoria pstore creata tramite reserve_mem.
    • Nel controller della memoria basato su cgroup è stato aggiunto nel file memory.reclaim, che definisce le impostazioni di rilascio della memoria, un parametro 'swappiness' che consente di modificare l'equilibrio tra il rilascio delle pagine di memoria anonima nella swap e il rilascio delle pagine di memoria utilizzate per la cache di file.
    • È stato aggiunto un'interfaccia ioctl PROCMAP_QUERY per una ricerca più efficiente delle aree di memoria virtuale (Virtual Memory Area) in /proc/PID/maps.
    • Nella chiamata di sistema mmap() è stato aggiunto un flag MAP_DROPPABLE per richiedere memoria che non sarà mai scaricata nella swap, e in caso di scarsità di memoria può essere rimossa.
    • Per l'architettura ARM64 è stata implementata la supporto per il hotplug (il passaggio a modalità online/offline) di CPU fisiche e virtuali su sistemi con ACPI.
    • Per l'architettura RISC-V è stata aggiunta la supporto per il collegamento hot della memoria e integrato il plugin GCC STACKLEAK (che inizializza tutte le variabili memorizzate nello stack per prevenire perdite di informazioni dal kernel attraverso variabili non inizializzate, che possono contenere residui di dati precedentemente salvati nello stack).
    • Eliminato il meccanismo di mappatura della memoria EFI (fake EFI memory map) durante la fase di avvio. Questo meccanismo non è mai stato utilizzato in pratica ed ostacolava gli sviluppi nel campo dell'esecuzione riservata. di macchine virtuali.
    • Interrotta la supporto per la piattaforma PowerPC 40x.
    • Aumentate le esigenze per la versione di GNU Make: per compilare il kernel è richiesta almeno la versione di GNU Make pubblicata nel 2013.
  • Virtualizzazione e sicurezza
    • Integrati patch che accelera significativamente (fino a 15 volte) il recupero di numeri casuali tramite la chiamata di sistema getrandom(). L'ottimizzazione si basa sull'utilizzo del meccanismo vDSO (virtual dynamic shared object), che consente di spostare il gestore della chiamata di sistema dallo spazio del kernel nello spazio utente e di evitare cambi di contesto. Il caricamento dell'implementazione della chiamata di sistema nell'indirizzo di spazio del processo è diretto dal kernel.
    • Per i sistemi x86-64 è stata inclusa una nuova implementazione dell'algoritmo di crittografia AES-GCM, che supporta l'uso di istruzioni vettoriali VAES, VPCLMULQDQ e AVX512/AVX10 per accelerare i calcoli. Nei test condotti, il guadagno di 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, delle dimensioni e della documentazione esaustiva del codice.
    • Realizzata la possibilità di eseguire il kernel come sistema guest in ambienti virtualizzati che utilizzano l'estensione del processore AMD SEV-SNP (Secure Nested Paging), progettata per garantire un lavoro sicuro con le tabelle delle pagine di memoria annidate. Per un'ulteriore isolamento dell'accesso alle risorse delle macchine virtuali, può essere utilizzato il modulo SVSM (Linux Secure VM Service Module). Nel hypervisor. KVM aggiunta la supporto iniziale per l'avvio dei sistemi guest protetti tramite AMD SEV-SNP.
    • Aggiunto un allocatore bucket slab separato, attivabile tramite il parametro CONFIG_SLAB_BUCKETS, che offre protezione contro attacchi utilizzando la tecnica 'heap spraying'.
    • Nel hypervisor KVM è stata aggiunta una chiamata ioctl per l'allocazione preventiva di memoria per il sistema guest prima del suo effettivo avvio.
  • Sottosistema di rete
    • Aggiunto il parametro sysctl net.tcp_rto_min_us, tramite il quale è possibile configurare il timeout minimo di ritrasmissione (retransmission timeout) per i socket TCP.
    • Nell'utilità ethtool è stata aggiunta la possibilità di ottimizzare la configurazione dei gestori delle interruzioni per le interfacce di rete che utilizzano l'interfaccia Net DIM.
  • Attrezzature
    • Nel driver AMDGPU è stata inclusa la supporto iniziale per la GPU AMD RDNA4 ('GFX12'). Aggiunta la supporto per le tecnologie DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 e MMHUB 4.1.
    • Proseguono i lavori sul driver drm (Direct Rendering Manager) Xe per GPU basate sull'architettura Intel Xe, utilizzata nelle schede grafiche Intel della famiglia Arc e grafica integrata, a partire dai processori Tiger Lake. Migliorata la supporto per GPU basate sulle microarchitetture Battlemage, Arrow Lake e Lunar Lake.
    • Nella sottosistema DRM (Direct Rendering Manager) è stata riscritta la gestione dei parametri EDID (Extended Display Identification Data) esposti dal monitor.
    • Nel driver i915 è stata aggiunta la supporto per la GPU Battlemage Xe2 e attivato di default il modo CMRR (Content Match Refresh Rate).
    • Nel driver DRM msm (GPU Qualcomm Adreno) è stata aggiunta la supporto per la piattaforma SM7150 e la GPU X185 e a505.
    • Aggiunta la 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.
    • Nel sottosistema audio è stata aggiunta la 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.
    • Effettuato l'ultimo gruppo di modifiche per garantire il supporto per l'ARM SoC Snapdragon X Elite, che utilizza il proprio CPU Qualcomm Oryon a 12 nuclei e GPU Qualcomm Adreno. Il chip è destinato all'uso in laptop e PC e supera in molti test di prestazioni i chip Apple M3 e Intel Core Ultra 155H. Le modifiche aggiunte al kernel 6.11 riguardano il supporto per la GPU Adreno X1-85 e la gestione del consumo energetico. Tra i dispositivi basati sull'SoC Snapdragon X Elite sono stati annunciati i laptop ASUS Vivobook S15 e Lenovo Yoga Slim7x.

Allo stesso tempo, il Fondo Latinoamericano per il Software Libero ha creato una versione completamente libera del kernel 6.11 — Linux-libre 6.10-gnu, priva di elementi di firmware e driver contenenti componenti o parti di codice non liberi, la cui applicabilità è limitata dal produttore. Nella versione 6.11 è stato aggiornato il codice di pulizia dei blob nei driver mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth e tas2781. È stata effettuata la pulizia di nuovi driver amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 e pcie-rcar-gen4. È stata completata la pulizia dei nomi dei blob nei file dts (devicetree) per l'architettura Aarch64. È stata aggiunta una versione dei primitivi per il caricamento dei firmware senza avvisi e richieste (nowait-nowarn). È stato aggiunto codice per la determinazione dei primitivi di caricamento dei firmware nel codice in linguaggio Rust.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster