Rilascio del kernel Linux 5.18

Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.18. Tra i cambiamenti più notevoli: è stata effettuata un'importante pulizia delle funzionalità obsolete, Reiserfs FS è stato dichiarato obsoleto, sono stati implementati gli eventi di tracciamento dei processi utente, è stato aggiunto il supporto per il meccanismo per bloccare gli exploit Intel IBT, è stata abilitata una modalità di rilevamento del buffer overflow quando utilizzando la funzione memcpy() è stato aggiunto un meccanismo per il tracciamento delle chiamate alla funzione fprobe, sono state migliorate le prestazioni del task scheduler sulle CPU AMD Zen, è stato incluso un driver per la gestione delle funzionalità delle CPU Intel (SDS), sono state integrate alcune patch per la ristrutturazione dei file di intestazione ed è stato approvato l'uso dello standard C11.

La nuova versione include 16206 correzioni da 2127 sviluppatori (nell'ultima versione c'erano 14203 correzioni da 1995 sviluppatori), la dimensione della patch è di 108 MB (le modifiche hanno interessato 14235 file, sono state aggiunte 1340982 righe di codice, 593836 righe sono state cancellate). Circa il 44% di tutte le modifiche introdotte nella versione 5.18 sono correlate ai driver di dispositivo, circa il 16% delle modifiche è correlato all'aggiornamento del codice specifico delle architetture hardware, l'11% è correlato allo stack di rete, il 3% è correlato ai file system e il 3% sono legati ai sottosistemi interni del kernel.

Principali innovazioni nel kernel 5.18:

  • Sottosistema disco, I/O e file system
    • Il file system Btrfs ha aggiunto il supporto per l'inoltro di dati compressi durante l'esecuzione di operazioni di invio e ricezione. In precedenza, quando si utilizzava invio/ricezione, il lato mittente decomprimeva i dati archiviati in formato compresso e il lato ricevente li ricomprimeva prima di scriverli. Nel kernel 5.18, alle applicazioni user-space che utilizzavano chiamate di invio/ricezione veniva data la possibilità di trasmettere dati compressi senza riconfezionarli. La funzionalità è implementata grazie alle nuove operazioni ioctl BTRFS_IOC_ENCODED_READ e BTRFS_IOC_ENCODED_WRITE, che permettono di leggere e scrivere direttamente le informazioni su misura.

      Inoltre, Btrfs migliora le prestazioni di fsync. Aggiunta la possibilità di deduplicare ed eseguire reflink (clonazione dei metadati dei file creando un collegamento ai dati esistenti senza effettivamente copiarli) per l'intero storage, non limitato ai punti di montaggio.

    • Nella modalità Direct I/O, è possibile accedere ai file crittografati quando fscrypt utilizza la crittografia in linea, in cui le operazioni di crittografia e decrittografia vengono eseguite dal controller dell'unità anziché dal kernel. Con la normale crittografia del kernel, l'accesso ai file crittografati utilizzando l'I/O diretto è ancora impossibile, poiché l'accesso ai file avviene bypassando il meccanismo di buffering nel kernel.
    • Il server NFS include il supporto per il protocollo NFSv3 per impostazione predefinita, che ora non richiede un'abilitazione separata ed è disponibile quando NFS è generalmente abilitato. NFSv3 è considerata la versione principale e sempre supportata di NFS e il supporto per NFSv2 potrebbe essere interrotto in futuro. L'efficienza nella lettura del contenuto della directory è stata notevolmente migliorata.
    • Il file system ReiserFS è stato deprecato e se ne prevede la rimozione nel 2025. La deprecazione di ReiserFS ridurrà lo sforzo richiesto per mantenere le modifiche a livello di file system relative al supporto della nuova API per montaggio, iomap e tomi.
    • Per il file system F2FS è stata implementata la possibilità di mappare gli ID utente dei file system montati, che viene utilizzata per confrontare i file di un utente specifico su una partizione esterna montata con un altro utente sul sistema corrente.
    • Il codice per il calcolo delle statistiche nei gestori Device-mapper è stato rielaborato, il che ha migliorato significativamente la precisione della contabilità nei gestori come dm-crypt.
    • I dispositivi NVMe ora supportano 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 disabilita la cancellazione dei punti alla fine del nome del file (in Windows, i punti alla fine del nome del file vengono rimossi per impostazione predefinita).
    • EXT4 migliora le prestazioni della modalità fast_commit e aumenta la scalabilità. L'opzione di montaggio “mb_optimize_scan”, che consente di aumentare le prestazioni in condizioni di grande frammentazione del file system, è adattata per lavorare con file con estensioni.
    • Il supporto per i flussi di scrittura nel sottosistema che supporta i dispositivi a blocchi è stato interrotto. Questa funzionalità è stata proposta per gli SSD, ma non è stata molto diffusa e attualmente non sono in uso dispositivi che supportano questa modalità ed è improbabile che appaiano in futuro.
  • Servizi di memoria e di sistema
    • È iniziata l'integrazione di un set di patch che consentirà di ridurre significativamente i tempi di ricostruzione del kernel ristrutturando la gerarchia dei file header e riducendo il numero di dipendenze incrociate. Il kernel 5.18 include patch che ottimizzano la struttura dei file di intestazione dell'utilità di pianificazione (kernel/sched). Rispetto alla versione precedente, il consumo di tempo della CPU durante l'assemblaggio di kernel/sched/codice è stato ridotto del 61% e il tempo effettivo è diminuito del 3.9% (da 2.95 a 2.84 secondi).
    • Il codice kernel può utilizzare lo standard C11, pubblicato nel 2011. In precedenza, il codice aggiunto al kernel doveva essere conforme alla specifica ANSI C (C89), creata nel 1989. Negli script di build del kernel 5.18, l'opzione "—std=gnu89" è stata sostituita con "—std=gnu11 -Wno-shift-negative-value". È stata presa in considerazione la possibilità di utilizzare lo standard C17, ma in questo caso sarebbe necessario aumentare la versione minima supportata di GCC, mentre l'inclusione del supporto C11 rientra negli attuali requisiti per la versione GCC (5.1).
    • Prestazioni migliorate di pianificazione delle attività sui processori AMD con microarchitettura Zen, che forniscono più Last Level Cache (LLC) per ciascun nodo con canali di memoria locali. La nuova versione elimina lo squilibrio LLC tra i nodi NUMA, che ha portato ad un aumento significativo delle prestazioni per alcuni tipi di carico di lavoro.
    • Gli strumenti per tracciare le applicazioni nello spazio utente sono stati ampliati. La nuova versione del kernel aggiunge la possibilità per i processi utente di creare eventi utente e scrivere dati nel buffer di traccia, che può essere visualizzato tramite utilità di tracciamento del kernel standard come ftrace e perf. Gli eventi di traccia dello spazio utente sono isolati dagli eventi di traccia del kernel. Lo stato dell'evento può essere visualizzato tramite il file /sys/kernel/debug/tracing/user_events_status e la registrazione dell'evento e la registrazione dei dati tramite il file /sys/kernel/debug/tracing/user_events_data.
    • Aggiunto un meccanismo per monitorare le chiamate di funzione (probe) - fprobe. L'API fprobe è basata su ftrace, ma è limitata solo dalla possibilità di collegare gestori di callback ai punti di ingresso e ai punti di uscita delle funzioni. A differenza di kprobes e kretprobes, il nuovo meccanismo ti consente di utilizzare un gestore per più funzioni contemporaneamente.
    • Il supporto per i vecchi processori ARM (ARMv4 e ARMv5) che non sono dotati di unità di gestione della memoria (MMU) è stato interrotto. Il supporto per i sistemi ARMv7-M senza MMU viene mantenuto.
    • Il supporto per l'architettura NDS32 simile a RISC utilizzata nei processori Andes Technologies è stato interrotto. Il codice è stato rimosso a causa della mancanza di manutenzione e della mancanza di richiesta di supporto NDS32 nel kernel Linux principale (gli utenti rimanenti utilizzano build di kernel specializzate di produttori di hardware).
    • Per impostazione predefinita, la creazione del kernel con supporto per il formato di file eseguibile a.out è disabilitata per le architetture alpha e m68k, che continuano a utilizzare questo formato. È probabile che presto il supporto per il vecchio formato a.out verrà completamente rimosso dal kernel. I piani per rimuovere il formato a.out sono discussi dal 2019.
    • L'architettura PA-RISC fornisce 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 vDSO ha reso possibile implementare la capacità di esecuzione con uno stack non eseguibile.
    • Aggiunto il supporto per il meccanismo Intel HFI (Hardware Feedback Interface), che consente all'hardware di trasmettere informazioni al kernel sulle prestazioni attuali e sull'efficienza energetica di ciascuna CPU.
    • Aggiunto un driver per il meccanismo Intel SDSi (Software-Defined Silicon), che consente di controllare l'inclusione di funzionalità aggiuntive nel processore (ad esempio, istruzioni specializzate e memoria cache aggiuntiva). L'idea è che i chip possano essere forniti a un prezzo inferiore con funzioni avanzate bloccate, che possono poi essere “acquistate” e funzionalità aggiuntive attivate senza sostituzione hardware del chip.
    • Il driver amd_hsmp è stato aggiunto per supportare l'interfaccia AMD HSMP (Host System Management Port), che fornisce l'accesso alle funzioni di gestione del processore attraverso una serie di registri speciali apparsi 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 di frequenza, attivare varie modalità di miglioramento delle prestazioni e gestire i parametri di memoria.
    • L'interfaccia I/O asincrona io_uring implementa l'opzione IORING_SETUP_SUBMIT_ALL per registrare un set di descrittori di file in un buffer ad anello e l'operazione IORING_OP_MSG_RING per inviare un segnale da un buffer ad anello a un altro buffer ad anello.
    • Il meccanismo DAMOS (Data Access Monitoring-based Operation Schemes), che consente il rilascio della memoria tenendo conto della frequenza di accesso alla memoria, ha ampliato le capacità di monitoraggio delle operazioni di memoria dallo spazio utente.
    • Una terza serie di patch è stata integrata con l'implementazione del concetto di page folio, che assomigliano a pagine composte, ma hanno una semantica migliorata e un'organizzazione del lavoro più chiara. L'uso dei tomi consente di velocizzare la gestione della memoria in alcuni sottosistemi del kernel. Nelle patch proposte, le funzioni di gestione della memoria interna sono state tradotte in folio, comprese le variazioni della funzione get_user_pages(). Fornito supporto per la creazione di grandi volumi nel codice read-ahead.
    • Il sistema di assemblaggio ora supporta le variabili di ambiente USERCFLAGS e USERLDFLAGS, con le quali è possibile passare flag aggiuntivi al compilatore e al linker.
    • Nel sottosistema eBPF, il meccanismo BTF (BPF Type Format), che fornisce informazioni sul controllo del tipo nello pseudocodice BPF, offre la possibilità di aggiungere annotazioni alle variabili che fanno riferimento ad aree di memoria nello spazio utente. Le annotazioni aiutano il sistema di verifica del codice BPF a identificare e verificare meglio gli accessi alla memoria.
    • È stato proposto un nuovo gestore di allocazione della memoria per memorizzare i programmi BPF caricati, che consente un utilizzo più efficiente della memoria in situazioni in cui vengono caricati un gran numero di programmi BPF.
    • Alla chiamata di sistema madvise() è stata aggiunta la flag MADV_DONTNEED_LOCKED, che fornisce strumenti per ottimizzare la gestione della memoria del processo, che integra la flag MADV_DONTNEED esistente, attraverso la quale il kernel può essere informato in anticipo sull'imminente rilascio di un blocco di memoria, ad es. che questo blocco non è più necessario e può essere utilizzato dal kernel. A differenza di MADV_DONTNEED, l'uso del flag MADV_DONTNEED_LOCKED è consentito per le pagine di memoria bloccate in RAM, le quali, quando viene chiamato madvise, vengono sfrattate senza modificare il loro stato bloccato e, in caso di successivo accesso al blocco e generazione di una "pagina difetto”, vengono restituiti con la rilegatura preservata. Inoltre, è stata aggiunta una modifica per consentire l'utilizzo del flag MADV_DONTNEED con pagine di memoria di grandi dimensioni in HugeTLB.
  • Virtualizzazione e sicurezza
    • Per l'architettura x86 è stato aggiunto il supporto al meccanismo di protezione del flusso di comandi Intel IBT (Indirect Branch Tracking), che impedisce l'utilizzo di tecniche di costruzione dell'exploit mediante tecniche di programmazione orientata al ritorno (ROP, Return-Oriented Programming), in cui l'exploit è formato sotto forma di una catena di chiamate già esistenti in memoria di parti di istruzioni macchina che terminano con un'istruzione di ritorno di controllo (di regola, queste sono le estremità delle funzioni). L'essenza del metodo di protezione implementato è bloccare le transizioni indirette al corpo di una funzione aggiungendo un'istruzione speciale ENDBR all'inizio della funzione e consentendo l'esecuzione di una transizione indiretta solo nel caso di una transizione a questa istruzione (una transizione indiretta chiamata tramite JMP e CALL devono sempre ricadere sull'istruzione ENDBR, che si trova all'inizio delle funzioni).
    • Abilitato un controllo più rigoroso dei limiti del buffer nelle funzioni memcpy(), memmove() e memset(), eseguito in fase di compilazione quando la modalità CONFIG_FORTIFY_SOURCE è abilitata. La modifica aggiuntiva si riduce alla verifica se gli elementi delle strutture di cui si conosce la dimensione vanno oltre i confini. Si noti che la funzionalità implementata consentirebbe di bloccare tutti gli overflow del buffer del kernel relativi a memcpy() identificati almeno negli ultimi tre anni.
    • Aggiunta la seconda parte del codice per l'implementazione aggiornata del generatore di numeri pseudo-casuali RDRAND, responsabile del funzionamento dei dispositivi /dev/random e /dev/urandom. La nuova implementazione si distingue per unificare il funzionamento di /dev/random e /dev/urandom, aggiungendo protezione contro la comparsa di duplicati nel flusso di numeri casuali all'avvio di macchine virtuali e passando all'utilizzo della funzione hash BLAKE2s invece di SHA1 per operazioni di mescolamento entropico. La modifica ha migliorato la sicurezza del generatore di numeri pseudo-casuali eliminando il problematico algoritmo SHA1 ed eliminando la sovrascrittura del vettore di inizializzazione RNG. Poiché l'algoritmo BLAKE2s è superiore a SHA1 in termini di prestazioni, anche il suo utilizzo ha avuto un effetto positivo sulle prestazioni.
    • Per l'architettura ARM64 è stato aggiunto il supporto per un nuovo algoritmo di autenticazione del puntatore - "QARMA3", che è più veloce dell'algoritmo QARMA pur mantenendo il corretto livello di sicurezza. La tecnologia consente di utilizzare istruzioni ARM64 specializzate per verificare gli indirizzi di ritorno utilizzando firme digitali archiviate nei bit superiori non utilizzati del puntatore stesso.
    • Per l'architettura ARM64 è stato implementato il supporto all'assembly con l'inclusione in GCC 12 di una modalità di protezione contro la sovrascrittura dell'indirizzo di ritorno da una funzione in caso di buffer overflow sullo stack. L'essenza della protezione è salvare l'indirizzo di ritorno in uno stack "ombra" separato dopo aver trasferito il controllo a una funzione e aver recuperato questo indirizzo prima di uscire dalla funzione.
    • Aggiunto un nuovo portachiavi - "macchina", contenente le chiavi del proprietario del sistema (MOK, Machine Owner Keys), supportato nel bootloader shim. Queste chiavi possono essere utilizzate per firmare digitalmente i componenti del kernel caricati in una fase di post-avvio (ad esempio, i moduli del kernel).
    • Rimosso il supporto per le chiavi private asimmetriche per i TPM, che erano offerti in una versione legacy di TPM, presentavano problemi di sicurezza noti e non erano ampiamente adottati nella pratica.
    • Aggiunta la protezione dei dati con tipo size_t dagli overflow di numeri interi. Il codice include i gestori size_mul(), size_add() e size_sub(), che consentono di moltiplicare, aggiungere e sottrarre in modo sicuro le dimensioni con il tipo size_t.
    • Durante la creazione del kernel, vengono abilitati i flag "-Warray-bounds" e "-Wzero-length-bounds", che visualizzano avvisi quando l'indice supera il limite dell'array e quando vengono utilizzati array di lunghezza zero.
    • Il dispositivo virtio-crypto ha aggiunto il supporto per la crittografia utilizzando l'algoritmo RSA.
  • Sottosistema di rete
    • Nell'implementazione dei bridge di rete è stato aggiunto il supporto per la modalità port binding (modalità bloccata), in cui l'utente può inviare traffico attraverso la porta solo da un indirizzo MAC autorizzato. È stata inoltre aggiunta la possibilità di utilizzare diverse strutture per valutare lo stato del protocollo STP (Spanning Tree Protocol). In precedenza, le VLAN potevano essere mappate solo direttamente su STP (1:1), con ciascuna VLAN gestita in modo indipendente. La nuova versione aggiunge il parametro mst_enable, quando abilitato, lo stato delle VLAN è controllato dal modulo MST (Multiple Spanning Trees) e il collegamento delle VLAN può corrispondere al modello M:N.
    • È proseguito il lavoro sull'integrazione di strumenti nello stack di rete per tracciare i motivi della perdita dei pacchetti (codici motivo). Il codice motivo viene inviato quando la memoria associata al pacchetto viene liberata e consente situazioni quali l'eliminazione del pacchetto a causa di errori di intestazione, rilevamento spoofing rp_filter, checksum non valido, memoria esaurita, regole IPSec XFRM attivate, numero di sequenza TCP non valido, ecc.
    • È possibile trasferire pacchetti di rete da programmi BPF lanciati dallo spazio utente nella modalità BPF_PROG_RUN, in cui i programmi BPF vengono eseguiti nel kernel, ma restituiscono il risultato allo spazio utente. I pacchetti vengono trasmessi utilizzando il sottosistema XDP (eXpress Data Path). È supportata la modalità di elaborazione dei pacchetti in tempo reale, in cui il processore XDP può reindirizzare al volo i pacchetti di rete allo stack di rete o ad altri dispositivi. È anche possibile creare generatori software di traffico esterno o sostituire frame di rete nello stack di rete.
    • Per i programmi BPF collegati ai cgroup di rete, sono state proposte funzioni di supporto per impostare esplicitamente il valore di ritorno delle chiamate di sistema, il che rende possibile trasmettere informazioni più complete sui motivi del blocco di una chiamata di sistema.
    • Il sottosistema XDP (eXpress Data Path) ha aggiunto il supporto per pacchetti frammentati inseriti in più buffer, che consente di elaborare frame Jumbo in XDP e utilizzare TSO/GRO (TCP Segmentation Offload/Generic Receive Offload) per XDP_REDIRECT.
    • Il processo di eliminazione degli spazi dei nomi di rete è stato notevolmente accelerato, cosa che era richiesta su alcuni sistemi di grandi dimensioni con un grande volume di traffico.
  • Attrezzatura
    • Il driver amdgpu include per impostazione predefinita la tecnologia di sincronizzazione adattiva FreeSync, che consente di regolare la frequenza di aggiornamento delle informazioni sullo schermo, garantendo immagini fluide e prive di strappi durante i giochi e la visione di video. Il supporto GPU Aldebaran è stato annunciato come stabile.
    • Il driver i915 aggiunge il supporto per i chip Intel Alderlake N e le schede grafiche discrete Intel DG2-G12 (Arc Alchemist).
    • Il nuovo driver fornisce supporto per bitrate più elevati per le interfacce DP/eDP e supporto per estensori di cavi 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 supporto dei parametri vc4 è stato aggiunto nomodeset, che permette di disabilitare il cambio di modalità video a livello di kernel e l'utilizzo di strumenti di accelerazione del rendering hardware, lasciando solo funzionalità legate al framebuffer di sistema.
    • Aggiunto supporto per ARM SoС Qualcomm Snapdragon 625/632 (utilizzato negli smartphone LG Nexus 5X e Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (utilizzato in Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (Prestigio PMT5008 tablet 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD, TI K3/AM62 e i.MXRTxxxx.
    • Aggiunto supporto per dispositivi e schede ARM di 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).
    • Aggiunto 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. Aggiunta l'implementazione iniziale del driver audio per il chip Intel AVS DSP. Aggiornato il supporto dei driver per Intel ADL e Tegra234 e apportate modifiche per migliorare il supporto audio sui dispositivi Dell, HP, Lenovo, ASUS, Samsung e Clevo.

    Allo stesso tempo, la Latin American Free Software Foundation ha formato una versione del kernel 5.18 completamente gratuita - Linux-libre 5.18-gnu, ripulita da elementi di firmware e driver contenenti componenti non liberi o sezioni di codice, la cui portata è limitata dal produttore. La nuova versione pulisce 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 ripuliti anche i file DTS per vari SoC Qualcomm con processori basati sull'architettura AArch64. Codice di pulizia blob aggiornato nei driver e nei sottosistemi di GPU AMD, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectru Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART.

Fonte: opennet.ru

Aggiungi un commento