Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.18. Tra le modifiche più significative: è stata effettuata una grande pulizia delle funzionalità obsolete, la FS Reiserfs è stata dichiarata obsoleta, sono stati implementati eventi di tracciamento dei processi utente, è stata aggiunta la supporto per il meccanismo di blocco degli exploit Intel IBT, è stata attivata la modalità di rilevamento del buffer overflow durante l'uso della funzione memcpy(), è stato aggiunto un meccanismo di tracciamento delle chiamate di funzione fprobe, è stata migliorata la performance dello scheduler dei task sui CPU AMD Zen, è stato incluso un driver per gestire la funzionalità dei CPU Intel (SDS), è stata integrata parte delle patch per la ristrutturazione dei file di intestazione, e l'applicazione dello standard C11 è stata approvata.
Nella nuova versione sono stati inclusi 16206 fix da 2127 sviluppatori (nell'edizione precedente c'erano 14203 fix da 1995 sviluppatori), la dimensione della patch è di 108 MB (le modifiche hanno interessato 14235 file, sono state aggiunte 1340982 righe di codice, e sono state rimosse 593836 righe). Circa il 44% di tutte le modifiche presentate in 5.18 riguarda i driver dei dispositivi, circa il 16% delle modifiche è relativo all'aggiornamento del codice specifico per le architetture hardware, l'11% è relativo allo stack di rete, il 3% ai file system e il 3% ai sottosistemi interni del kernel.
Le principali novità nel kernel 5.18:
- Sottosistema di disco, input/output e file system
- Nel file system Btrfs è stata aggiunta la supporto per il passaggio dei dati compressi durante l'esecuzione delle operazioni send e receive. In precedenza, durante l'uso di send/receive, il lato mittente decomponeva i dati memorizzati in forma compressa, mentre il lato ricevente ricomponeva nuovamente i dati prima della scrittura. Nel kernel 5.18, alle applicazioni nello spazio utente che utilizzano le chiamate send/receive è stata offerta la possibilità di trasferire dati compressi senza ripacchettizzazione. Questa funzionalità è stata implementata grazie alle nuove operazioni ioctl BTRFS_IOC_ENCODED_READ e BTRFS_IOC_ENCODED_WRITE, che consentono di leggere e scrivere direttamente informazioni negli extent.
Inoltre, in Btrfs è stata migliorata la performance di fsync. È stata aggiunta la possibilità di deduplicazione e l'esecuzione di reflink (clonazione dei metadati del file creando un collegamento ai dati già esistenti senza la loro effettiva copia) per l'intero storage, senza limitarsi ai punti di montaggio.
- In modalità di input/output diretto (Direct I/O), è possibile accedere a file crittografati utilizzando fscrypt in crittografia inline, dove le operazioni di crittografia e decrittografia vengono eseguite dal controller di archiviazione e non dal kernel. Con la crittografia tradizionale gestita dal kernel, l'accesso a file crittografati tramite Direct I/O non è possibile, poiché l'accesso ai file avviene bypassando il meccanismo di buffering nel kernel.
- Nel server NFS è abilitato di default il supporto per il protocollo NFSv3, che ora non richiede attivazione separata ed è disponibile con l'attivazione generale di NFS. NFSv3 è considerato la versione principale e sempre supportata di NFS, e il supporto per NFSv2 potrebbe essere interrotto in futuro. È stata notevolmente migliorata l'efficienza nella lettura del contenuto delle directory.
- Il file system ReiserFS è stato classificato come obsoleto e verrà rimosso nel 2025. La classificazione di ReiserFS come obsoleto consentirà di ridurre il lavoro di manutenzione delle modifiche comuni ai file system relative al supporto di una nuova API per il montaggio, iomap e volumi.
- Per il file system F2FS è stata implementata la possibilità di mappare gli identificatori degli utenti delle file system montate, utilizzata per associare i file di un determinato utente su una partizione montata a un altro utente nel sistema corrente.
- È stato rivisto il codice per il conteggio delle statistiche nei gestori del Device-mapper, consentendo di aumentare notevolmente la precisione del monitoraggio in gestori come dm-crypt.
- Per i dispositivi NVMe è stato implementato il supporto per checksum a 64 bit per il controllo dell'integrità.
- Per il file system exfat è stata proposta una nuova opzione di montaggio "keep_last_dots", che impedisce la pulizia dei punti alla fine del nome del file (in Windows, i punti alla fine del nome vengono rimossi per impostazione predefinita).
- In EXT4 è stata migliorata la performance della modalità fast_commit e aumentata la scalabilità. L'opzione di montaggio "mb_optimize_scan", che consente di migliorare le prestazioni in condizioni di elevata frammentazione del file system, è stata adattata per lavorare con file con estensioni.
- Il supporto per lo streaming di scrittura (write stream) nella sottosistema che gestisce i dispositivi a blocchi è stato interrotto. Questa funzione era stata proposta per gli SSD, ma non ha trovato diffusione e al momento non ci sono dispositivi che supportano questa modalità, ed è poco probabile che ne arrivino in futuro.
- Nel file system Btrfs è stata aggiunta la supporto per il passaggio dei dati compressi durante l'esecuzione delle operazioni send e receive. In precedenza, durante l'uso di send/receive, il lato mittente decomponeva i dati memorizzati in forma compressa, mentre il lato ricevente ricomponeva nuovamente i dati prima della scrittura. Nel kernel 5.18, alle applicazioni nello spazio utente che utilizzano le chiamate send/receive è stata offerta la possibilità di trasferire dati compressi senza ripacchettizzazione. Questa funzionalità è stata implementata grazie alle nuove operazioni ioctl BTRFS_IOC_ENCODED_READ e BTRFS_IOC_ENCODED_WRITE, che consentono di leggere e scrivere direttamente informazioni negli extent.
- Memoria e servizi di sistema
- È iniziata l'integrazione di un insieme di patch che consentono di ridurre significativamente il tempo di ricompilazione del kernel grazie alla ristrutturazione della gerarchia dei file di intestazione e alla riduzione del numero di dipendenze incrociate. Nella versione del kernel 5.18 sono incluse patch che ottimizzano la struttura dei file di intestazione del pianificatore dei processi (kernel/sched). Rispetto al rilascio precedente, il consumo di tempo della CPU durante la compilazione del codice kernel/sched è diminuito del 61%, mentre il tempo effettivo è diminuito del 3,9% (da 2,95 a 2,84 secondi).
- Nel codice del kernel è consentito l'uso dello standard C11, pubblicato nel 2011. Il codice precedentemente incluso nel kernel doveva seguire la specifica ANSI C (C89), redatto nel 1989. Negli script di compilazione del kernel 5.18, l'opzione '—std=gnu89' è stata sostituita con '—std=gnu11 -Wno-shift-negative-value'. È stata considerata la possibilità di utilizzare lo standard C17, ma in tal caso sarebbe stata necessaria una versione minima di GCC più elevata, mentre l'inclusione del supporto C11 rientra nei requisiti attuali per la versione di GCC (5.1).
- È stata migliorata la performance della pianificazione dei processi sui processori AMD con architettura Zen, nei quali per ogni nodo con canali di memoria locali vengono forniti più cache di ultimo livello (LLC, Last Level Cache). Nella nuova versione è stato corretto il disbilanciamento di LLC tra i nodi NUMA, il che ha portato a un notevole incremento delle prestazioni in alcune condizioni di carico.
- Sono stati ampliati gli strumenti per il tracciamento delle applicazioni nello spazio utente. Nella nuova versione del kernel è stata aggiunta la possibilità per i processi utente di generare eventi di tracciamento (User events) e di registrare dati nel buffer di tracciamento, che possono essere visualizzati tramite utilità di tracciamento del kernel come ftrace e perf. Gli eventi di tracciamento nello spazio utente sono isolati dagli eventi di tracciamento del kernel. Lo stato degli eventi può essere visualizzato tramite il file /sys/kernel/debug/tracing/user_events_status, mentre la registrazione di un evento e la scrittura di dati avvengono tramite il file /sys/kernel/debug/tracing/user_events_data.
- È stato aggiunto un meccanismo di tracciamento (probe) delle chiamate di funzione — fprobe. L'API fprobe si basa su ftrace, ma è limitata solo alla possibilità di attaccare gestori di callback ai punti di ingresso della funzione e di fine funzione. A differenza di kprobes e kretprobes, il nuovo meccanismo consente di utilizzare un gestore per più funzioni contemporaneamente.
- È stata interrotta la supporto per i vecchi processori ARM (ARMv4 e ARMv5), privi di unità di gestione della memoria (MMU). Il supporto per i sistemi ARMv7-M senza MMU è stato mantenuto.
- È stato interrotto il supporto per l'architettura simile a RISC NDS32, utilizzata nei processori della società Andes Technologies. Il codice è stato rimosso a causa dell'assenza di manutenzione e della richiesta di supporto NDS32 nel kernel Linux principale (gli utenti rimanenti utilizzano build specializzate del kernel dai produttori di hardware).
- Per impostazione predefinita, è stata disabilitata la compilazione del kernel con supporto per il formato di file eseguibili a.out per le architetture alpha e m68k, in cui tale formato continua a essere utilizzato. Probabilmente, il supporto per il formato obsoleto a.out verrà completamente rimosso dal kernel in tempi brevi. I piani per rimuovere il formato a.out sono in discussione dal 2019.
- Per l'architettura PA-RISC è stato implementato un supporto minimo per il meccanismo vDSO (virtual dynamic shared objects), che fornisce un insieme limitato di chiamate di sistema disponibili nello spazio utente senza cambio di contesto. Il supporto di vDSO ha permesso di implementare la possibilità di esecuzione con uno stack non eseguibile.
- È stato aggiunto il supporto per il meccanismo Intel HFI (Hardware Feedback Interface), che consente all'hardware di fornire al kernel informazioni sulle attuali prestazioni e sull'efficienza energetica di ogni CPU.
- È stato aggiunto un driver per il meccanismo Intel SDSi (Software-Defined Silicon), che consente di gestire l'attivazione di funzionalità aggiuntive nel processore (ad esempio, istruzioni specializzate e cache aggiuntiva). L'idea è che chip a un prezzo inferiore possano essere forniti con funzionalità avanzate bloccate, che possono poi essere "acquistate" e attivate senza sostituzioni hardware del chip.
- Aggiunto il driver amd_hsmp per il supporto dell'interfaccia AMD HSMP (Host System Management Port), che fornisce accesso alle funzioni di gestione del processore tramite un insieme di registri speciali, presenti nei processori server AMD EPYC a partire dalla generazione Fam19h. Ad esempio, tramite HSMP è possibile ottenere dati sul consumo energetico e sulla temperatura, impostare limiti sulla frequenza, attivare diversi modalità di aumento delle prestazioni, gestire i parametri di funzionamento della memoria.
- Nell'interfaccia di input/output asincrono io_uring è stata implementata l'opzione IORING_SETUP_SUBMIT_ALL per la registrazione in un buffer circolare di un insieme di descrittori di file, così come l'operazione IORING_OP_MSG_RING, che consente di inviare un segnale da un buffer circolare a un altro buffer circolare.
- Nel meccanismo DAMOS (Data Access Monitoring-based Operation Schemes), che consente di liberare memoria tenendo conto della frequenza di accesso alla memoria, sono state ampliate le funzionalità di controllo delle operazioni sulla memoria dallo spazio utente.
- Integrata la terza serie di patch con l'implementazione del concetto di folio di pagine di memoria, che somigliano a pagine di memoria composte, ma si distinguono per una semantica migliorata e un'organizzazione del lavoro più chiara. L'uso dei folio consente di accelerare la gestione della memoria in alcune sottosistemi del kernel. Nelle patch proposte è stato effettuato il passaggio ai folio delle funzioni interne di gestione della memoria, incluse le varianti della funzione get_user_pages(). È fornito supporto per la creazione di grandi folio nel codice di prelettura dei dati.
- Nel sistema di build è stato aggiunto il supporto per le variabili d'ambiente USERCFLAGS e USERLDFLAGS, con cui è possibile passare flag aggiuntivi al compilatore e al linker.
- Nel sottosistema eBPF, nel meccanismo BTF (BPF Type Format), che fornisce informazioni per il controllo dei tipi nel pseudocodice BPF, è stata realizzata la possibilità di aggiungere annotazioni a variabili che fanno riferimento a aree di memoria nello spazio utente. Le annotazioni aiutano il sistema di verifica del codice BPF a identificare e controllare in modo più efficace gli accessi alla memoria.
- Proposto un nuovo gestore per l'allocazione della memoria per la memorizzazione dei programmi BPF caricati, che consente di utilizzare la memoria in modo più efficiente in situazioni di caricamento di un gran numero di programmi BPF.
- Nel sistema di chiamata madvise(), che fornisce strumenti per ottimizzare la gestione della memoria del processo, è stato aggiunto il flag MADV_DONTNEED_LOCKED, che integra il già esistente flag MADV_DONTNEED, tramite il quale il kernel può essere informato in anticipo del rilascio imminente di un blocco di memoria, ovvero che questo blocco non è più necessario e può essere riutilizzato dal kernel. A differenza di MADV_DONTNEED, l'uso del flag MADV_DONTNEED_LOCKED è consentito per le pagine di memoria bloccate in RAM, che durante la chiamata madvise vengono espulse senza cambiare il loro stato di blocco e in caso di successivo accesso al blocco e generazione di un "page fault", vengono restituite mantenendo il vincolo. È stata inoltre aggiunta una modifica che consente l'uso del flag MADV_DONTNEED con grandi pagine di memoria in HugeTLB.
- Virtualizzazione e sicurezza
- Per l'architettura x86 è stato aggiunto il supporto per il meccanismo di protezione del flusso di esecuzione delle istruzioni Intel IBT (Indirect Branch Tracking), che impedisce l'uso di tecniche di exploit basate su programmazione orientata al ritorno (ROP, Return-Oriented Programming), in cui un exploit viene creato come una catena di chiamate a frammenti di istruzioni già presenti in memoria, che si concludono con un'istruzione di ritorno del controllo (di solito la fine delle funzioni). Il metodo di protezione implementato blocca i salti indiretti nel corpo di una funzione tramite l'aggiunta di un'istruzione speciale ENDBR all'inizio della funzione e consente l'esecuzione per salto indiretto solo nel caso in cui si salti a questa istruzione (una chiamata indiretta tramite JMP e CALL deve sempre puntare all'istruzione ENDBR, che è collocata all'inizio della funzione).
- È stata introdotta una verifica più rigorosa dei limiti dei buffer nelle funzioni memcpy(), memmove() e memset(), eseguita in fase di compilazione quando è attivata l'opzione CONFIG_FORTIFY_SOURCE. La modifica aggiunta consiste nella verifica dell'uscita dai limiti degli elementi delle strutture, di cui è noto il dimensionamento. Si osserva che la funzionalità implementata consentirebbe di bloccare tutte le sovrascritture di buffer relative a memcpy() nel kernel, identificate almeno negli ultimi tre anni.
- È stata aggiunta la seconda parte del codice della nuova implementazione del generatore di numeri pseudorandom RDRAND, responsabile del funzionamento dei dispositivi /dev/random e /dev/urandom. La nuova implementazione è notevole per l'unificazione del funzionamento di /dev/random e /dev/urandom, e per l'aggiunta di una protezione contro la duplicazione nel flusso di numeri casuali all'avvio. macchine virtuali e per il passaggio all'utilizzo della funzione hash BLAKE2s invece di SHA1 per le operazioni di mescolamento dell'entropia. Questa modifica ha migliorato la sicurezza del generatore di numeri pseudorandom eliminando l'algoritmo problematica SHA1 e prevenendo la riscrittura del vettore di inizializzazione RNG. Poiché l'algoritmo BLAKE2s supera SHA1 in termini di prestazioni, il suo utilizzo ha avuto anche un impatto positivo sulle performance.
- Per l'architettura ARM64 è stata aggiunta il supporto per un nuovo algoritmo di autenticazione dei puntatori — "QARMA3", che è più veloce dell'algoritmo QARMA mantenendo un adeguato livello di protezione. La tecnologia consente di utilizzare istruzioni specializzate ARM64 per la verifica degli indirizzi di ritorno tramite firme digitali, che vengono memorizzate nei bit superiori non utilizzati dello stesso puntatore.
- Per l'architettura ARM64 è stato implementato il supporto per la compilazione con l'attivazione della modalità di protezione contro la riscrittura dell'indirizzo di ritorno dalla funzione in caso di overflow del buffer nello stack in GCC 12. Il principio della protezione consiste nel salvare, dopo la chiamata alla funzione, l'indirizzo di ritorno in uno "stack ombra" separato e nel recuperare tale indirizzo prima di uscire dalla funzione.
- È stato aggiunto un nuovo storage di chiavi (keyring) — "machine", contenente le chiavi del proprietario del sistema (MOK, Macchine Owner Keys), supportate nel bootloader shim. Le chiavi menzionate possono essere utilizzate per firmare digitalmente i componenti del kernel caricati nella fase successiva all'avvio (ad esempio, i moduli del kernel).
- È stato rimosso il supporto per le chiavi private asimmetriche per il TPM, proposte nella versione obsoleta del TPM, che presentano noti problemi di sicurezza e non hanno trovato una diffusione pratica.
- È stata aggiunta una protezione dei dati con tipo size_t contro il overflow intero. Nel codice sono stati implementati i gestori size_mul(), size_add() e size_sub(), che consentono di eseguire in modo sicuro moltiplicazioni, addizioni e sottrazioni di dimensioni con tipo size_t.
- Nell'assemblaggio del kernel sono stati inclusi i flag «-Warray-bounds» e «-Wzero-length-bounds», che emettono avvisi quando l'indice supera i limiti dell'array e quando si utilizzano array di lunghezza zero.
- Nel dispositivo virtio-crypto è stata aggiunta la supporto per la crittografia utilizzando l'algoritmo RSA.
- Sottosistema di rete
- Nell'implementazione dei bridge di rete è stata aggiunta la supporto per la modalità di blocco delle porte (locked mode), in cui l'utente può inviare traffico attraverso una porta solo da un indirizzo MAC autorizzato. È stata anche aggiunta la possibilità di utilizzare più strutture per valutare lo stato del protocollo STP (Spanning Tree Protocol). In precedenza, per VLAN era possibile solo un legame diretto a STP (1:1), in cui ogni VLAN era gestita indipendentemente. Nella nuova versione è stato aggiunto il parametro mst_enable, che consente di controllare lo stato delle VLAN attraverso il modulo MST (Multiple Spanning Trees) e la legatura delle VLAN può corrispondere al modello M:N.
- Sono continuate le attività per l'integrazione nel stack di rete di strumenti per il monitoraggio delle cause di scarto dei pacchetti (codici reason). Il codice di causa viene trasmesso durante il rilascio della memoria associata al pacchetto e consente di considerare situazioni come lo scarto di pacchetti a causa di errori di compilazione dei campi nell'intestazione, il rilevamento di spoofing da parte del filtro rp_filter, checksum errato, mancanza di memoria, attivazione delle regole IPSec XFRM, numero di sequenza TCP errato, ecc.
- È stata fornita la possibilità di inviare pacchetti di rete da programmi BPF, eseguiti dallo spazio utente nella modalità BPF_PROG_RUN, in cui i programmi BPF vengono eseguiti nel kernel ma restituiscono i risultati allo spazio utente. I pacchetti vengono trasferiti utilizzando il sottosistema XDP (eXpress Data Path). È supportata la modalità live di elaborazione dei pacchetti, in cui l'elaboratore XDP può reindirizzare i pacchetti di rete al volo nel stack di rete o su altri dispositivi. È anche possibile creare generatori software di traffico esterno o inserire frame di rete nel stack di rete.
- Per i programmi BPF, collegati a cgroups di rete, sono state proposte funzioni ausiliarie per impostare esplicitamente il valore restituito dalle chiamate di sistema, consentendo di trasmettere informazioni più dettagliate sulle cause del blocco della chiamata di sistema.
- Nel sottosistema XDP (eXpress Data Path) è stata aggiunta la supporto per pacchetti frammentati, collocati in più buffer, il che consente di gestire in XDP i Jumbo-frame e di applicare TSO/GRO (TCP Segmentation Offload/Generic Receive Offload) per XDP_REDIRECT.
- È stato notevolmente accelerato il processo di eliminazione degli spazi dei nomi di rete, che era molto richiesto in alcuni sistemi di grandi dimensioni con un alto volume di traffico.
- Apparecchiatura
- Nel driver amdgpu è attivata di default la tecnologia di sincronizzazione adattiva FreeSync, che permette di correggere la frequenza di aggiornamento delle informazioni sullo schermo, garantendo fluidità e assenza di sfarfallii durante i giochi e la visione di video. È stata dichiarata la stabilità del supporto per la GPU Aldebaran.
- Nel driver i915 è stato aggiunto il supporto per i chip Intel Alderlake N e le schede grafiche discrete Intel DG2-G12 (Arc Alchemist).
- Nel driver nouveau è stato garantito il supporto per bitrate più elevati per le interfacce DP/eDP e il supporto per gli extender di cavo lttprs (Link-Training Tunable PHY Repeaters).
- Nel sottosistema drm (Direct Rendering Manager), nei driver armada, exynos, gma500, hyperv, imx, ingenic, mcde, mediatek, msm, omap, rcar-du, rockchip, sprd, sti, tegra, tilcdc, xen e vc4 è stato aggiunto il supporto per il parametro nomodeset, che consente di disattivare il cambio delle modalità video a livello kernel e l'uso di meccanismi per l'accelerazione hardware del rendering, lasciando solo la funzionalità relativa al framebuffer di sistema.
- È stato aggiunto il supporto per ARM SoC Qualcomm Snapdragon 625/632 (utilizzato negli smartphone LG Nexus 5X e Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (utilizzato nel Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (tablet Prestigio PMT5008 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD, TI K3/AM62 e i.MXRTxxxx.
- È stato aggiunto il supporto per dispositivi ARM e schede Broadcom (Raspberry Pi Zero 2 W), Qualcomm (Google Herobrine R1 Chromebook, SHIFT6mq, Samsung Galaxy Book2), Rockchip (Pine64 PineNote, Bananapi-R2-Pro, STM32 Emtrion emSBS, Samsung Galaxy Tab S, tablet Prestigio PMT5008 3G), Allwinner (A20-Marsboard), Amlogic (Amediatek X96-AIR, CYX A95XF3-AIR, Haochuangy H96-Max, Amlogic AQ222 e OSMC Vero 4K+), Aspeed (Quanta S6Q, ASRock ROMED8HM3), Marvell MVEBU/Armada (Ctera C200 V1 e V2 NAS), Mstar (DongShanPiOne, Miyoo Mini), NXP i.MX (Protonic PRT8MM, emCON-MX8M Mini, Toradex Verdin, Gateworks GW7903).
- È stato aggiunto il supporto per sistemi audio e codec AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek MT8181, nVidia Tegra234, Qualcomm SC7280, Renesas RZ/V2L, Texas Instruments TAS585M. È stata aggiunta una realizzazione iniziale del driver audio per il DSP-chip Intel AVS. È stato aggiornato il supporto per i driver Intel ADL e Tegra234, ed è stato apportato miglioramenti al supporto audio sui dispositivi Dell, HP, Lenovo, ASUS, Samsung e Clevo.
Contemporaneamente, il Fondo Software Libero dell'America Latina ha sviluppato una versione completamente libera del kernel 5.18 — Linux-libre 5.18-gnu, ripulito da elementi di firmware e driver contenenti componenti non liberi o sezioni di codice il cui ambito di applicazione è limitato dal produttore. Nella nuova versione sono stati ripuliti i driver per i pannelli MIPI DBI, VPU Amphion, WiFi MediaTek MT7986 WMAC, Mediatek MT7921U (USB) e Realtek 8852a/8852c, chip audio Intel AVS e Texas Instruments TAS5805M. Sono stati anche ripuliti i file DTS per vari SoC Qualcomm con processori basati sull'architettura AArch64. Il codice per la pulizia dei blob nei driver e nelle sottosistemi AMD GPU, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectrum Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART è stato aggiornato.
Fonte: opennet.ru
