Dopo due mesi di sviluppo, Linus Torvalds ha presentato rilascio del kernel Linux 6.19. Tra le modifiche più significative: il sottosistema Live Update Orchestrator, supporto per PCIe Link Encryption, la chiamata di sistema listns, la modalità Zero-Copy Receive in io_uring, supporto per l'estensione ARM MPAM, klp-build per generare live patch, supporto per l'architettura LoongArch32, QoS per s2idle, ottimizzazione del sottosistema di auditing, Intel LASS per proteggere da Spectre, supporto per gli hash SHA-3 e BLAKE2b, meccanismo Confidential VMBus, ottimizzazioni TX nel sottosistema di rete, protocollo CAN XL, API per accelerazione hardware dell'output HDR.
Nell'annuncio della nuova versione, Linus ha comunicato che al prossimo rilascio del kernel verrà assegnato il numero 7.0, poiché nella serie 6.x si sono accumulati sufficienti rilascio per cambiare il primo numero nella versione (il rilascio 6.0 era stato creato subito dopo 5.19). Il cambiamento della numerazione è effettuato per motivi estetici ed è un passo formale che elimina il disagio dovuto all'accumulo di un gran numero di rilasci nella serie. Linus ha scherzato sul fatto che i grandi numeri lo confondono, poiché non ha abbastanza dita nelle mani e nei piedi. Tuttavia, formalmente ci sono motivi significativi per il cambiamento del numero di versione, poiché a partire da il prossimo rilascio il supporto per Rust è stato deciso verrà spostato da esperimentale a funzioni principali del kernel.
Nella nuova versione sono stati accettati 15657 correzioni da 2237 sviluppatori, la dimensione della patch è di 52 MB (le modifiche hanno interessato 13682 file, aggiungendo 794649 righe di codice, rimuovendo 335498 righe). Nella precedente versione erano state 15035 correzioni da 2217 sviluppatori, la dimensione della patch era di 45 MB. Circa il 40% di tutte le modifiche presentate in 6.19 riguardano i driver dei dispositivi, circa il 13% delle modifiche riguardano l'aggiornamento del codice specifico per le architetture hardware, il 12% riguarda lo stack di rete, il 5% ai file system e il 3% ai sottosistemi interni del kernel.
Le principali novità nel kernel 6.19 (1, 2, 3):
- Sottosistema di disco, input/output e file system
- In Btrfs i processi di verifica del FS (scrub) e di sostituzione dei dispositivi non bloccano più il passaggio del sistema in modalità sleep (prima di andare in sleep viene salvato lo stato della verifica scrub; dopo il risveglio, la verifica scrub continua e l'operazione di sostituzione dei dispositivi viene avviata nuovamente). Nella realizzazione di RAID56 è stato aggiunto il supporto per blocchi di dimensioni superiori a quelle delle pagine di memoria. È stata effettuata la preparazione per il supporto di fscrypt. Le prestazioni nella gestione dei blocchi durante le operazioni relative alla riserva di spazio sono state migliorate. È stata aggiunta supporto dell'operazione ioctl di shutdown, che consente di portare il file system in uno stato in cui si cerca di completare le operazioni già avviate, ma si bloccano tutte le nuove operazioni.
- Nel file system Ext4 attivata supporto per blocchi le cui dimensioni superano quelle di una pagina di memoria (>4KB sui sistemi x86). L'uso di blocchi grandi consente aumenta la performance delle operazioni di scrittura bufferizzate in media del 50%, ma riduce le prestazioni delle operazioni di input/output diretto a causa dell'aumento del tempo di calcolo dei checksum. Nella nuova versione anche aggiunti ottimizzazioni che aumentano la larghezza di banda durante l'esecuzione della deframmentazione online.
- Nel sottosistema FUSE migliorato il supporto per la lettura bufferizzata utilizzando grandi di fogli di memoria (large folios). Attraverso iomap è stata implementata la possibilità di monitorare folios parzialmente aggiornati per caricare solo i dati non presenti nel buffer.
- In VFS aggiunta supporto per la delega di directory richiamabile (recallable directory delegation), che consente di NFS trasferire la gestione della directory dal server al client, in modo che il client NFS possa monitorare autonomamente lo stato della directory basandosi sulla cache locale senza contattare il server NFS. Se un altro client NFS apporta modifiche relative a questa directory, la delega della gestione sarà revocata al primo client.
- Per NFS è stata aggiunta supporto alla lettura in modalità di input/output diretto (direct I/O). Implementato le impostazioni /sys/kernel/debug/nfsd/io_cache_read e /sys/kernel/debug/nfsd/io_cache_write per gestire l'attivazione della cache e delle operazioni di input/output diretto, la manipolazione di queste impostazioni consente di ridurre i costi al lato del client NFS durante l'esecuzione di grandi operazioni di input/output.
- In NTFS implementata la supporto dell'operazione ioctl di shutdown, sono inclusi per impostazione predefinita le opzioni di montaggio acl e prealloc, aggiunto supporto per un tempo fino al 1 gennaio 1970.
- Per dispositivi a blocchi e file system inclusa per impostazione predefinita la cache degli oggetti "bio" (Block I/O) è separata per ogni CPU, definendo le operazioni attive di input/output.
- Memoria e servizi di sistema
-
Nel kernel attivata sottosistema Live Update Orchestrator (LUO), che consente di riavviare e aggiornare completamente il kernel senza fermare il funzionamento e senza perdere lo stato del sistema, dei dispositivi e dei processi. Il sottosistema LUO si basa su un meccanismo precedentemente aggiunto al kernel. KHO (Kexec HandOver) e oltre alla funzionalità di avviare un nuovo kernel da uno esistente senza perdere lo stato del sistema, affronta problemi come la conservazione dello stato dei dispositivi e della memoria operativa, nonché l'assicurazione della continuità delle operazioni relative al DMA e alla gestione delle interruzioni. Lo stato viene mantenuto fino al passaggio al nuovo kernel e ripristinato dopo l'attivazione del nuovo kernel senza interrompere le operazioni continue con i dispositivi effettuate dal sistema e dalle applicazioni nello spazio utente.
-
Aggiunto la chiamata di sistema listns() per visualizzare l'elenco degli spazi dei nomi esistenti nel sistema senza la necessità di esaminare /proc//ns/ per tutti i processi.
Il sistema di input/output asincrono io_uring ha aggiunto il supporto per la gestione di elementi di dimensioni diverse nella coda di invio (SQE, Submission Queue Entry), analogamente a quanto consentito nella precedente versione per la miscelazione delle dimensioni dei contenuti nella coda dei risultati (CQE, Completion Queue Event). Prima di questo, tutti gli elementi nella coda dovevano avere una dimensione uniforme, il che portava a un consumo eccessivo di memoria a causa della necessità di utilizzare la dimensione massima per tutti gli elementi della coda.
In io_uring è stata aggiunta anche la supporto per il meccanismo zcrx (Zero-Copy Receive) per ricevere dati senza copia tra il kernel e lo spazio utente. È stato implementato il supporto per le richieste di layout della memoria per le code SQ (Submission Queue) e CQ (Completion Queue), consentendo di ottenere informazioni sulla dimensione del buffer circolare necessarie per l'allocazione della memoria da parte dell'utente utilizzando i flag IORING_SETUP_NO_MMAP e IORING_MEM_REGION_TYPE_USER.
Per una rapida tracciatura dello stack tramite strumenti come perf, è stato aggiunto il supporto per il formato SFrame con informazioni sul disassemblaggio dello stack delle chiamate (unwind). SFrame è già supportato in GCC e binutils, non riduce le prestazioni e, a differenza del formato DWARF, contiene solo un insieme minimo di informazioni necessarie per la tracciatura dello stack.
-
nello strumento perf è stata aggiunta supporto per una descrizione unificata delle metriche e degli eventi nel formato JSON, nonché per il disassemblaggio rinviato (deferred unwinding) dello stack delle chiamate nello spazio utente.
Per dei processori AMD è stato implementato un meccanismo per la sostituzione dei dati nella cache, che consente ai dispositivi di input/output di inserire direttamente i dati nella cache L3 della CPU senza prima collocarli nella RAM.
È stata aggiunta la supporto per MPAM (Memory System Resource Partitioning and Monitoring), estensioni dell'architettura del set di istruzioni ARMv8-A per contrassegnare ogni accesso alla memoria con un identificatore di sezione (PARTID, Partition ID) e un identificatore di gruppo di monitoraggio (PMG, Monitoring Group ID). In relazione al PARTID, è possibile limitare il consumo di risorse, come la larghezza di banda della memoria o la dimensione della cache, in modo che un certo gruppo di attività non occupi tutte le risorse. Nel contesto del monitoraggio, la combinazione di PMG e PARTID può essere utilizzata per tracciare il consumo di risorse di memoria in determinate condizioni di carico.
In caso di terminazione anomala del processo dopo aver ricevuto un segnale, un altro processo, che possiede il pidfd del processo terminato, può ora determinare il numero del segnale che ha causato la terminazione del processo.
Rielaborata l'implementazione delle sequenze riavviabili (restartable sequences), che consentono alle applicazioni di organizzare un'esecuzione pseudo-atomica non interrotta di un gruppo di istruzioni (in caso di interruzione da un altro thread, viene ripetuta l'esecuzione della sequenza). La nuova implementazione offre prestazioni superiori.
-
Per Programmi BPF sono state implementate istruzioni BPF_JMP, BPF_X e BPF_JA per effettuare salti indiretti a una posizione specificata nella tabella dei salti. È stata aggiunta la concetto di puntatori dinamici (dynptr), che consentono la lettura di dati da file strutturati. È stata aggiunta la possibilità di allegare a pacchetti di rete diversi byte di metadati.
Moduli in linguaggio Python, utilizzati per la gestione della documentazione del kernel, sono stati spostati in directory separate tools/lib/python.
-
Funzione aggiunta mempool_alloc_bulk() per l'allocazione sicura di elementi da un pool di memoria per più oggetti.
-
Proseguito trasferimento delle modifiche dal ramo Rust-for-Linux, correlati all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel (il supporto per Rust non è attivato di default e non porta all'inclusione di Rust tra le dipendenze di compilazione obbligatorie del kernel). Nella nuova versione, nel kernel è integrata la biblioteca «syn» con un parser del codice Rust, che semplifica la scrittura di macro complesse. Sono state ampliate le capacità delle librerie kernel, pin-init e rbtree. È stata aggiunta la libreria num con un trait Integer per la manipolazione di numeri interi. Nella macro module! è stato aggiunto il supporto per i parametri interi. È stata implementata la possibilità di specificare parametri durante il caricamento di moduli del kernel scritti in Rust. Sono state realizzate astrazioni per i sottosistemi I2C e PWM (Modulazione di larghezza d'impulso).
-
Aggiunto Macro at_least (per esempio, param[at_least 7]), che informa sulla dimensione minima consentita per l'array passato alla funzione. Se viene passato un array con un numero di elementi inferiore, il compilatore emetterà un avviso.
-
Fanno parte è attivato Lo script klp-build per la generazione di moduli del kernel che apportano modifiche al kernel in esecuzione (livepatch), basato su un file patch. Nella utility objtool sono state apportate modifiche necessarie per la creazione di live-patch.
-
In Linux in modalità utente (esecuzione del kernel come processo utente) ha aggiunto un supporto limitato per la multiprocessualità, ma i thread all'interno di un processo non possono ancora essere eseguiti simultaneamente. Iniziato Porting di Linux in modalità utente alla libreria nolibc.
-
È stata aggiunta supporto per l'architettura LoongArch32 (LA32R, LA32S) in aggiunta a LoongArch64.
-
È stata aggiunta Possibilità di impostare limiti QoS sull'intensità di risveglio del processore in modalità risparmio energetico s2idle (Suspend-To-Idle), che congela l'esecuzione dei processi nello spazio utente, lasciando attivi alcuni gestori nel kernel.
-
È stata aggiunta Supporto per la gestione delle tabelle delle pagine di memoria per i controller IOMMU (Unità di gestione della memoria input-output), che eseguono la traduzione degli indirizzi virtuali visibili all'hardware in indirizzi fisici, con la possibilità di filtrare le operazioni DMA per indirizzi virtuali, nonché limitare e isolare le operazioni di input-output.
Negli eventi di tracciamento delle chiamate di sistema è stata implementata la possibilità di leggere i buffer dallo spazio utente e di includere il loro contenuto (ad esempio, i nomi dei file) nel risultato della tracciatura.
-
**Pagine di guardia della memoria ( (guard page), a cui l'accesso provoca un'eccezione e un'uscita anomala del processo (SIGSEGV), ora sono contrassegnate con un'etichetta speciale nel file /proc/PID/smaps.
-
È stata aggiunta Possibilità di gestire grandi pagine di memoria (pagina enorme trasparente) nella memoria privata di dispositivi zonati.
-
Nel dispositivo zram, utilizzato per la memorizzazione compressa della partizione di swap in memoria, è stata implementata supporto per il flush di più strutture 'bio' (Block I/O) in modalità batch (writeback batching).
È stato incluso il carattere «Terminus 10×18», che migliora la leggibilità delle informazioni dalla console su schermi di laptop con risoluzione media (1440×900).
-
Significativamente ottimizzate funzionamento le sottosistemi di auditing — si osserva una riduzione delle spese generali del doppio.
-
- Virtualizzazione e sicurezza
- Aggiunto il supporto fornito dai processori Intel per l'assegnazione separazione dello spazio degli indirizzi (LASS, separazione dello spazio di indirizzi lineare), che consente di separare fisicamente i range di indirizzi dello spazio utente e del nucleo per aumentare la sicurezza. Lo spazio degli indirizzi è suddiviso secondo il bit più significativo dell'indirizzo: la metà superiore dello spazio degli indirizzi con il bit più significativo impostato è utilizzata per il nucleo, mentre la parte inferiore è destinata allo spazio utente. In una fase iniziale dell'esecuzione delle istruzioni (nella fase precedente all'esecuzione speculativa), viene effettuato un controllo della validità dell'accesso dello spazio utente agli indirizzi con il bit più significativo impostato e viceversa. Questa separazione consente di bloccare le perdite di memoria del nucleo nello spazio utente tramite canali esterni anche durante l'esecuzione speculativa delle istruzioni, permettendo così di applicare LASS per proteggere da attacchi di tipo Meltdown e Spectre senza comportare elevati sovraccarichi.
- Aggiunta la possibilità di attivare estensioni aumento della sicurezza del bus PCI Express – PCIe Link Encryption e PCIe Device Authentication, che consentono di autenticare e criptare il canale di comunicazione tra un dispositivo PCIe e una macchina virtuale, protetta tramite meccanismi Intel TDX (Trusted Domain Extensions) e AMD SEV-SNP (Secure Nested Paging). Le tecnologie implementate non consentono di intercettare, analizzare e sostituire dati nel traffico DMA in presenza di accesso al sistema host o ad altri dispositivi.
- Nella libreria crittografica integrata è stata aggiunta supporto per gli algoritmi SHA-3 (SHA3-224, SHA3-256, SHA3-384, SHA3-512) SHAKE128, SHAKE256 e BLAKE2b.
- Per i moduli LSM (Linux Security Modules) e, in particolare, per SELinux, è stata implementata la possibilità di monitorare la creazione di descrittori memfd per applicare politiche di sicurezza agli oggetti correlati.
- Nel modulo LSM IPE (Integrity Policy Enforcement), che definisce la politica generale di integrità per l'intero sistema, è stato aggiunto il supporto per il flag AT_EXECVE_CHECK nella funzione execveat(), che include un controllo dell'integrità dello script prima della sua esecuzione da parte dell'interprete.
- Aggiunti i primitivi scoped_user_read_access(), scoped_user_write_access e scoped_user_rw_access() per un accesso limitato ai dati nello spazio utente con protezione attacchi speculativi.
- È stata aggiunta supporto per il meccanismo Confidential VMBus, utilizzato nel hypervisor HyperV per un'interazione protetta contro l'interferenza tra il sistema ospite, eseguito in modalità riservata (con crittografia della memoria e isolamento dei registri basato su tecnologie AMD SNP e Intel TDX), e il paravisor responsabile dell'accesso ai dispositivi che trattano dati riservati.
- È stata aggiunta la possibilità di trasmettere informazioni su un processo terminato in modo anomalo (per generare un coredump) tramite il meccanismo pidfd. L'identificativo PIDFD è associato a un processo specifico e non cambia, mentre il PID può essere associato a un altro processo dopo la conclusione dell'attuale processo associato a quel PID. L'uso di pidfd consente di bloccare l'esecuzione attacchi per sostituire un processo suid terminato in modo anomalo con un altro processo, creando una condizione di race nel momento successivo all'inizio dell'elaborazione del kernel dell'errore fatale, ma prima della verifica da parte dell'handler nello spazio utente dei parametri del processo.
- Sottosistema di rete
- Nel sottosistema di rete sono stati apportati ottimizzazioni per aumentare l'efficienza del trasferimento dati (TX). Eliminando la funzione __dev_queue_xmit() dal lock spin e utilizzando una struttura llist che funziona senza lock ha permesso di aumentare le prestazioni di 4 volte sotto carichi elevati e raddoppiare l'intensità di invio dei pacchetti riducendo la carico sulla CPU della metà.
- È stata fornita la possibilità disabilitazione per singoli socket di rete i limiti di sistema sull'uso della memoria (in questo caso verranno utilizzati i limiti di memoria condivisi impostati per singoli contenitori). Per gestire la disattivazione dei limiti è stato proposto sysctl net.core.bypass_prot_mem e il flag SK_BPF_BYPASS_PROT_MEM nella funzione bpf_setsockopt.
- È stata aggiunta supporto per l'estensione RFC 5837, che aggiunge nei messaggi ICMP Time Exceeded, restituiti quando scade il tempo di vita (TTL) di un pacchetto, dati sulle interfacce di rete in ingresso per ottenere informazioni più dettagliate durante il tracciamento dei percorsi con l'utility traceroute.
- È stata aggiunta supporto per pollattivo continuo (busy polling) in un thread separato del kernel con l'obiettivo di estrarre i descrittori dalle code RX/TX per le applicazioni che richiedono ritardi minimi.
- Supporto aggiunto per il protocollo CAN XL (Controller Area Network eXtended Length), in cui la dimensione del campo dati è aumentata a 2048 byte per garantire integrazione con le reti TCP/IP, è stata implementata la possibilità di tunnelizzare i frame Ethernet e aggiunto supporto per modulazione a larghezza di impulso, che ha permesso il trasferimento di dati a velocità di 20 Mbit/s e oltre.
- È stata aggiunta supporto per la struttura sockaddr_unsized, variante della struttura sockaddr che utilizza un array con elementi flessibili invece di un array di dimensione fissa (sa_data[] invece di sa_data[14], che era essenzialmente utilizzato per riferimenti ad altre strutture di dimensioni maggiori).
- È stata aggiunta la possibilità di utilizzare la funzionalità getsockname e getpeername tramite il sottosistema io_uring.
- Aggiunti sysctl net.ipv4.tcp_rcvbuf_low_rtt e net.ipv4.tcp_comp_sack_rtt_percent per ottimizzare TCP.
- È stata aggiunta supporto per collegamenti con larghezza di banda di 1600 Gbps (1.6T).
- Apparecchiatura
- Nella sottosistema DRM (Direct Rendering Manager) è stata aggiunta un'API per sfruttare le capacità hardware di conversione colore, consentendo di evitare tali conversioni attraverso shader o esecuzione di codice sulla CPU. Per la visualizzazione di contenuti su un monitor HDR, le complesse conversioni di colore possono ora essere eseguite dal controller del display nelle fasi precedenti e successive alla miscelazione dei livelli (blending), invece di un compositing software nel buffer finale di visualizzazione. Oltre a ridurre il sovraccarico e il consumo energetico nella gestione dell'output HDR, la funzionalità proposta può essere utilizzata per una corretta riproduzione dei colori in editor video o di immagini.
- Aggiunto driver ethosu per NPU Arm Ethos U65 e U85, progettati per l'accelerazione hardware dell'esecuzione di modelli AI.
- Nel driver i915 per GPU Lunar Lake e versioni successive è stata aggiunta la supporto per l'aumento hardware della nitidezza dell'immagine (Sharpening).
- Proseguita sviluppo del driver drm (Direct Rendering Manager) Xe per GPU basate sull'architettura Intel Xe, utilizzata nelle schede grafiche Intel della famiglia Arc e nella grafica integrata, a partire dai processori Tiger Lake. È stato aggiunto il supporto iniziale per l'architettura Xe3P, utilizzata nelle GPU Crescent Island e nella famiglia di processori con grafica integrata Nova Lake.
- Il driver AMDGPU ha implementato un supporto completo per le schede grafiche AMD della famiglia GCN 1.0 'Southern Island' e 1.1 'Sea Islands', per le quali era precedentemente utilizzato il driver Radeon. Il driver AMDGPU è stato portato a parità di funzionalità con il driver Radeon ed è stato attivato per le GPU indicate come predefinite. Le schede GCN 1.x sono state prodotte dal 2012 al 2019 e comprendono modelli come Radeon HD 77xx/78xx/79xx/87xx/88xx/89xx, Radeon R9 280, FirePro W4000-W9000, Radeon Sky 700/900, Radeon R9 265/270/370, Radeon R9 290/390, HD 7790/8870 e altre schede grafiche delle famiglie Radeon Rx 200/Rx 300. aumento un aumento medio delle prestazioni del 24%, il passaggio a AMDGPU ha permesso di implementare per queste GPU il supporto dell'API grafica Vulkan 1.3. Inoltre, AMDGPU ha aggiunto supporto per connettori analogici e Video Coding Engine 1.0, ed è stato inoltre attivato di default lo stack DC (Display Core) per le GPU basate sull'architettura microarchitetturale Bonaire (Radeon HD 7790).
- Nel driver Nouveau è stata implementata supporto per l'acceleratore hardware NVJPG, presente nel SoC Tegra210.
- Nel driver Panthor è stata aggiunta supporto per la GPU Mali-G1 e supporto iniziale per il chip MediaTek MT8196.
- È stata aggiunta supporto per il sottosistema audio dei chip Intel Nova Lake S, computer portatili HP con HDA CS35L41, nonché interfacce audio CIX IPBLOQ HD e Onkyo SE-300PCIE.
- Continuata l'integrazione dei componenti del driver Nova per le GPU NVIDIA dotate di firmware GSP, utilizzate a partire dalla serie NVIDIA GeForce RTX 2000 basata sull'architettura Turing. Il driver è scritto in linguaggio Rust. Nella nuova versione è iniziato il lavoro su RPC e è terminata implementazione del caricamento del coprocessore GSP (GPU System Processor).
- È stata aggiunta supporto per schede ARM, SoC e dispositivi: Bananapi r4 pro, LinkEase EasePi R1, Qualcomm MSM8937 (Snapdragon 430), Renesas R-Car X5H, FriendlyElec NanoPi R76S, TI AM62L, Black Sesame Technologies C1200, Aspeed AST2600, Genio 1200 EVK, grinn geniosbc-510/700, Tanix TX9 Pro, Radxa Dragon Q6A, Tinker Board 3/3S, Aquila AM69, phyBOARD-Segin-i.MX91, i.MX 95 Verdin Evaluation Kit, Toradex SMARC iMX95, VIDIA Jetson Nano 2GB, Renesas rz/g3s, Indiedroid Nova, 24 varianti di schede Enclustra Mercury.
- È stato aggiunto il supporto per smartphone e tablet basati su SoC Mediatek MT6582 (Alcatel yarisxl), Nvidia Tegra124 (Xiaomi Mi Pad) e Qualcomm MSM8939 (ASUS ZenFone 2). È stato aggiunto il supporto per laptop su SoC Qualcomm sdm850, come Huawei MateBook E 2019.
- aggiunto il supporto per SoC e schede basate sull'architettura RISC-V: OrangePi R2S, OrangePi RV, Anlogic dr1v90, Tenstorrent Blackhole.
Contemporaneamente, il Fondo latinoamericano per il software libero ha creato una versione nucleo completamente libero 6.19 — Linux-libre 6.19-gnu, pulito da elementi di firmware e driver contenenti componenti non liberi o sezioni di codice la cui applicazione è limitata dal produttore. Nella release 6.19 è stato rimosso dal sottosistema audio SDCA il codice per il caricamento dei firmware binari. È stato aggiornato il codice di pulizia dei blob nei driver Intel XE, Nova-Core, Qualcomm Iris, Venus e Q6V5, TI PRUeth, Intel iwlwifi, Marvell mwifiex, FourSemi fs210x, Realtek rt1320 e codec audio TI tas2783. È stata eseguita la pulizia dei nomi dei blob nei file dts (device tree) per i chip ARM. È cessata la pulizia del driver STM C8SECTPFE DVB, rimosso dal kernel.
Fonte: linux.org.ru
