Rilascio del kernel Linux 5.8

Dopo due mesi di sviluppo Linus Torvalds presentata rilascio del kernel Linux 5.8. Tra i cambiamenti più notevoli: un rilevatore di condizioni di gara KCSAN, un meccanismo universale per inviare notifiche allo spazio utente, supporto hardware per la crittografia in linea, meccanismi di sicurezza avanzati per ARM64, supporto per il processore russo Baikal-T1, la possibilità di montare separatamente istanze procfs , implementazione di meccanismi di sicurezza shadow per ARM64 Call Stack e ITV.

Il kernel 5.8 è diventato il più grande in termini di numero di modifiche di tutti i kernel durante l'intera esistenza del progetto. Inoltre, i cambiamenti non sono legati ad alcun sottosistema, ma coprono diverse parti del kernel e sono principalmente associati alla rielaborazione e alla pulizia interna. I maggiori cambiamenti si vedono nei conducenti. La nuova versione includeva 17606 correzioni da 2081 sviluppatori, che hanno interessato circa il 20% di tutti i file nel repository del codice del kernel. La dimensione della patch è di 65 MB (le modifiche hanno interessato 16180 file, sono state aggiunte 1043240 righe di codice, sono state cancellate 489854 righe). In confronto, il ramo 5.7 aveva 15033 correzioni e una dimensione della patch di 39 MB. Circa il 37% di tutte le modifiche introdotte nella versione 5.8 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 4% sono legati ai sottosistemi interni del kernel.

Il principale innovazioni:

  • Virtualizzazione e sicurezza
    • È previsto il caricamento di moduli del kernel che hanno sezioni con codice in cui vengono impostati contemporaneamente i bit che permettono l'esecuzione e la scrittura. La modifica è stata implementata come parte di un progetto più ampio per liberare il kernel dall'uso di pagine di memoria che consentono l'esecuzione e la scrittura simultanee.
    • Ora è possibile creare istanze procfs separate, consentendo l'uso di più punti di montaggio procfs, montati con opzioni diverse, ma che riflettono lo stesso spazio dei nomi dell'identificatore del processo (spazio dei nomi pid). In precedenza, tutti i punti di montaggio procfs rispecchiavano solo una rappresentazione interna e qualsiasi modifica ai parametri di montaggio influenzava tutti gli altri punti di montaggio associati allo stesso spazio dei nomi ID processo. Tra le aree in cui potrebbe essere richiesto il montaggio con diverse opzioni c'è l'implementazione di un isolamento leggero per sistemi embedded con la capacità di nascondere determinati tipi di processi e nodi di informazioni in procfs.
    • Il supporto per il meccanismo è stato implementato per la piattaforma ARM64
      Stack di Richiamo Ombra, fornito dal compilatore Clang per proteggere dalla sovrascrittura dell'indirizzo di ritorno di una funzione in caso di overflow del buffer dello 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.

    • È stato aggiunto il supporto delle istruzioni per la piattaforma ARM64 ARMv8.5-BTI (Branch Target Indicator) per proteggere l'esecuzione di insiemi di istruzioni a cui non è necessario effettuare branch. Il blocco delle transizioni a sezioni arbitrarie di codice è implementato per impedire la creazione di gadget negli exploit che utilizzano tecniche di programmazione orientata al ritorno (ROP - Return-Oriented Programming; l'attaccante non tenta di posizionare il proprio codice in memoria, ma opera su pezzi già esistenti di istruzioni macchina che terminano con un'istruzione di controllo di ritorno, da cui si costruisce una catena di chiamate per ottenere la funzionalità desiderata).
    • Aggiunto supporto hardware per la crittografia in linea dei dispositivi a blocchi (Crittografia in linea). I dispositivi di crittografia inlinep sono generalmente integrati nell'unità, ma sono posizionati logicamente tra la memoria di sistema e il disco, crittografando e decrittografando in modo trasparente l'I/O in base alle chiavi specificate dal kernel e a un algoritmo di crittografia.
    • Aggiunta l'opzione della riga di comando del kernel "initrdmem" per consentire di specificare l'indirizzo della memoria fisica dell'initrd quando si posiziona l'immagine di avvio iniziale nella RAM.
    • Aggiunta una nuova funzionalità: CAP_PERFMON per accedere al sottosistema perf ed eseguire il monitoraggio delle prestazioni. CAP_BPF, che consente determinate operazioni BPF (come il caricamento di programmi BPF) che in precedenza richiedevano i diritti CAP_SYS_ADMIN (i diritti CAP_SYS_ADMIN sono ora suddivisi in una combinazione di CAP_BPF, CAP_PERFMON e CAP_NET_ADMIN).
    • Aggiunto un nuovo dispositivo virtio-mem che consente di collegare e inserire a caldo la memoria nei sistemi guest.
    • Implementato il richiamo delle operazioni di mappatura in /dev/mem se il driver del dispositivo utilizza aree di memoria sovrapposte.
    • Aggiunta protezione dalle vulnerabilità CROSSTalk/SRBDS, che consente di ripristinare i risultati di determinate istruzioni eseguite su un altro core della CPU.
  • Servizi di memoria e di sistema
    • Nel documento che definisce le regole per la formattazione del codice, accettato raccomandazioni per l’uso di una terminologia inclusiva. Agli sviluppatori non è consigliabile utilizzare separatamente le combinazioni "master/slave" e "blacklist/whitelist", nonché la parola "slave". Le raccomandazioni riguardano solo i nuovi usi di questi termini. Le menzioni delle parole specificate già esistenti nel nucleo rimarranno intatte. Nel nuovo codice, l'uso dei termini contrassegnati è consentito se necessario per supportare l'API e l'ABI esposte nello spazio utente, nonché durante l'aggiornamento del codice per supportare hardware o protocolli esistenti le cui specifiche richiedono l'uso di determinati termini.
    • Strumento di debug incluso KCSAN (Kernel Concurrency Sanitizer), progettato per il rilevamento dinamico condizioni di gara all'interno del nucleo. L'uso di KCSAN è supportato durante la creazione in GCC e Clang e richiede modifiche speciali in fase di compilazione per tenere traccia dell'accesso alla memoria (vengono utilizzati punti di interruzione che vengono attivati ​​quando la memoria viene letta o modificata). Lo sviluppo di KCSAN si concentra sulla prevenzione dei falsi positivi, sulla scalabilità e sulla facilità d'uso.
    • Aggiunto meccanismo universale consegnare notifiche dal kernel allo spazio utente. Il meccanismo si basa sul pipe driver standard e consente di distribuire in modo efficiente le notifiche dal kernel sui canali aperti nello spazio utente. I punti di ricezione delle notifiche sono pipe che vengono aperte in una modalità speciale e consentono di accumulare i messaggi ricevuti dal kernel in un buffer ad anello. La lettura viene eseguita dalla consueta funzione read(). Il proprietario del canale determina quali fonti nel kernel devono essere monitorate e può definire un filtro per ignorare determinati tipi di messaggi ed eventi. Tra gli eventi, attualmente sono supportate solo le operazioni con le chiavi, come l'aggiunta/rimozione di chiavi e la modifica dei loro attributi. Questi eventi sono pianificati per essere utilizzati in GNOME.
    • Sviluppo continuo della funzionalità 'pidfd' per aiutare a gestire le situazioni di riutilizzo del PID (pidfd è associato a un processo specifico e non cambia, mentre un PID può essere associato a un altro processo dopo che il processo corrente associato a quel PID termina). La nuova versione aggiunge il supporto per l'utilizzo di pidfd per collegare un processo ai namespace (permettendo di specificare pidfd durante l'esecuzione della chiamata di sistema setns). L'uso di pidfd consente di controllare l'allegato di un processo a diversi tipi di spazi dei nomi con una chiamata, riducendo significativamente il numero di chiamate di sistema necessarie e implementando l'allegato in modalità atomica (se l'allegato a uno degli spazi dei nomi fallisce, gli altri non si connetteranno) .
    • Aggiunta una nuova chiamata di sistema faccessat2(), diversa da
      faccessat() un argomento aggiuntivo con flag conformi alle raccomandazioni POSIX (in precedenza questi flag erano emulati nella libreria C e il nuovo faccessat2 consente di implementarli nel kernel).

    • Nel gruppo C aggiunto un'impostazione memory.swap.high che può essere utilizzata per rallentare le attività che occupano troppo spazio di swap.
    • All'interfaccia I/O asincrona io_uring aggiunto il supporto per la chiamata di sistema tee().
    • Aggiunto meccanismo "Iteratore BPF, progettato per inviare il contenuto delle strutture del kernel allo spazio utente.
    • Fornito da la possibilità di utilizzare un buffer ad anello per lo scambio di dati tra programmi BPF.
    • Nel meccanismo padata, progettato per organizzare l'esecuzione parallela delle attività nel kernel, ha aggiunto il supporto per attività multi-thread con bilanciamento del carico.
    • Nel meccanismo pstore, che consente di salvare le informazioni di debug sulla causa del crash in aree di memoria che non vengono perse tra i riavvii, aggiunto backend per il salvataggio delle informazioni per bloccare i dispositivi.
    • Dal ramo del kernel PREEMPT_RT mosso implementazione di serrature locali.
    • Aggiunto nuova API di allocazione buffer (AF_XDP), volta a semplificare la scrittura dei driver di rete con supporto XDP (eXpress Data Path).
    • Per l'architettura RISC-V è stato implementato il supporto per il debug dei componenti del kernel utilizzando KGDB.
    • Prima della versione 4.8, i requisiti per la versione di GCC che può essere utilizzata per compilare il kernel sono stati aumentati. In una delle prossime versioni si prevede di alzare l'asticella fino a GCC 4.9.
  • Sottosistema disco, I/O e file system
    • Nel mappatore dei dispositivi aggiunto nuovo gestore dm-ebs (emulazione della dimensione del blocco), che può essere utilizzato per emulare una dimensione del blocco logico più piccola (ad esempio, per emulare settori da 512 byte su dischi con dimensione del settore da 4K).
    • Il file system F2FS ora supporta la compressione utilizzando l'algoritmo LZO-RLE.
    • In dm-crypt aggiunto supporto per chiavi crittografate.
    • Btrfs ha migliorato la gestione delle operazioni di lettura in modalità I/O diretta. Durante il montaggio accelerato controllando le sottosezioni cancellate e le directory lasciate senza un genitore.
    • Un parametro "nodelete" è stato aggiunto a CIFS, consentendo i normali controlli dei permessi sul server, ma vietando al client di eliminare file o directory.
    • Ext4 ha migliorato la gestione degli errori ENOSPC quando si utilizza il multithreading. xattr ha aggiunto il supporto per lo spazio dei nomi gnu.* utilizzato in GNU Hurd.
    • Per Ext4 e XFS è abilitato il supporto per le operazioni DAX (accesso diretto al file system, bypassando la cache delle pagine senza utilizzare il livello del dispositivo a blocchi) in relazione ai singoli file e directory.
    • Nella chiamata di sistema statx() aggiunta la bandiera STATX_ATTR_DAX, che, se specificato, recupera le informazioni utilizzando il motore DAX.
    • ESAURITO aggiunto supporto per la verifica dell'area di avvio.
    • Nel GRASSO migliorato caricamento proattivo degli elementi FS. Il test di una lenta unità USB da 2 TB ha mostrato una riduzione del tempo di completamento del test da 383 a 51 secondi.
  • Sottosistema di rete
    • Nel codice per controllare il funzionamento dei bridge di rete aggiunto supporto del protocollo MRP (Media Redundancy Protocol), che consente la tolleranza agli errori collegando più switch Ethernet.
    • Al sistema di controllo del traffico (Tc) aggiunto nuova azione “gate”, che permette di definire intervalli di tempo per l'elaborazione e lo scarto di determinati pacchetti.
    • Al kernel e all'utilità ethtool è stato aggiunto il supporto per testare il cavo di rete connesso e per l'autodiagnosi dei dispositivi di rete.
    • Il supporto per l'algoritmo MPLS (Multiprotocol Label Switching) è stato aggiunto allo stack IPv6 per instradare i pacchetti utilizzando la commutazione di etichette multiprotocollo (MPLS era precedentemente supportato per IPv4).
    • Aggiunto il supporto per la trasmissione di pacchetti IKE (Internet Key Exchange) e IPSec su TCP (RFC 8229) per aggirare un possibile blocco UDP.
    • Aggiunto dispositivo a blocchi di rete rnbd, che consente di organizzare l'accesso remoto a un dispositivo a blocchi utilizzando il trasporto RDMA (InfiniBand, RoCE, iWARP) e il protocollo RTRS.
    • Nello stack TCP aggiunto supporto per la compressione dell'intervallo nelle risposte di riconoscimento selettivo (SACK).
    • Per IPv6 implementato Supporto TCP-LD (RFC 6069, lunghe interruzioni della connettività).
  • Attrezzatura
    • Il driver DRM i915 per le schede video Intel include il supporto per i chip Intel Tiger Lake (GEN12) per impostazione predefinita, per i quali implementato la possibilità di utilizzare il sistema SAGV (System Agent Geyserville) per regolare dinamicamente la frequenza e la tensione in base al consumo energetico o ai requisiti di prestazione.
    • Il driver amdgpu ha aggiunto il supporto per il formato pixel FP16 e la capacità di lavorare con buffer crittografati nella memoria video (TMZ, Trusted Memory Zone).
    • Aggiunto supporto per sensori di potenza per processori AMD Zen e Zen2, nonché sensori di temperatura per AMD Ryzen 4000 Renoir. Il supporto per il recupero delle informazioni sul consumo energetico tramite l'interfaccia è fornito per AMD Zen e Zen2 RAPL (Limite di potenza media in esecuzione).
    • Aggiunto il supporto per il formato del modificatore NVIDIA al driver Nouveau. Per gv100 è stata implementata la possibilità di utilizzare le modalità di scansione interlacciata. Aggiunta la definizione di vGPU.
    • Aggiunto il supporto per le GPU Adreno A405, A640 e A650 al driver MSM (Qualcomm).
    • Aggiunto framework interno per la gestione delle risorse DRM (Direct Rendering Manager).
    • Aggiunto supporto per gli smartphone Xiaomi Redmi Note 7 e Samsung Galaxy S2, nonché per i laptop Chromebook Elm/Hana.
    • Aggiunti driver per pannelli LCD: ASUS TM5P5 NT35596, Starry KR070PE2T, Leadtek LTK050H3146W, Visionox rm69299, Boe tv105wum-nw0.
    • Aggiunto supporto per schede e piattaforme ARM Renesas "RZ/G1H", Realtek RTD1195, Realtek RTD1395/RTD1619, Rockchips RK3326, AMLogic S905D, S905X3, S922XH, Olimex A20-OLinuXino-LIME-eMMC, Check Point L-50,
      , Beacon i.MX8m-Mini, Qualcomm SDM660/SDM630, Xnano X5 TV Box, Stinger96, Beaglebone-AI.

    • Aggiunto il supporto per il processore MIPS Loongson-2K (abbreviato Loongson64). Per CPU Loongson 3 è stato aggiunto il supporto per la virtualizzazione utilizzando l'hypervisor KVM.
    • Aggiunto da
      supporto per il processore russo Baikal-T1 e il system-on-chip basato su di esso BE-T1000. Il processore Baikal-T1 contiene due core superscalari P5600 MIPS 32 r5 che operano a 1.2 GHz. Il chip contiene cache L2 (1 MB), controller di memoria DDR3-1600 ECC, 1 porta Ethernet da 10 Gb, 2 porte Ethernet da 1 Gb, controller PCIe Gen.3 x4, 2 porte SATA 3.0, USB 2.0, GPIO, UART, SPI, I2C. Il processore fornisce supporto hardware per la virtualizzazione, istruzioni SIMD e un acceleratore crittografico hardware integrato che supporta GOST 28147-89. Il chip è sviluppato utilizzando un'unità core del processore MIPS32 P5600 Warrior concessa in licenza da Imagination Technologies.

Allo stesso tempo, la Fondazione Latinoamericana per il Software Libero formato
вариант kernel 5.8 completamente gratuito - linux-libre 5.8-gnu, ripulito da elementi firmware e driver contenenti componenti non liberi o sezioni di codice, la cui portata è limitata dal produttore. La nuova versione disabilita il caricamento dei blob nei driver per Atom ISP Video, MediaTek 7663 USB/7915 PCIe, Realtek 8723DE WiFi, Renesas PCI xHCI, HabanaLabs Gaudi, Enhanced Asynchronous Sample Rate Converter, Maxim Integrated MAX98390 Speaker Aimplifier, Microsemi ZL38060 Connected Home Audio Processor, e slave EEPROM I2C. Codice di pulizia blob aggiornato nella GPU Adreno, HabanaLabs Goya, touchscreen x86, driver e sottosistemi vt6656 e btbcm.

Fonte: opennet.ru

Aggiungi un commento