Dopo due mesi di sviluppo, Linus Torvalds ha rilasciato il kernel . Tra i cambiamenti più significativi: una nuova interfaccia per l'input/output asincrono io_uring, la possibilità di utilizzare NVDIMM come RAM, il supporto della memoria virtuale condivisa in Nouveau, il supporto per il monitoraggio scalabile di filesystem molto grandi tramite fanotify, la possibilità di configurare i livelli di compressione Zstd in Btrfs, un nuovo gestore cpuidle TEO, l'implementazione delle chiamate di sistema per risolvere il problema del 2038, la possibilità di avviare da dispositivi device-mapper senza initramfs, il modulo LSM SafeSetID e il supporto per patching live combinati.
:
- Sottosistema disco, I/O e file system
- È stata implementata una nuova interfaccia per l'input/output asincrono — , che si distingue per il supporto del polling dell'input/output e la possibilità di operare sia con buffering che senza buffering. Ricordiamo che il meccanismo di input/output asincrono "aio" proposto in precedenza non supportava l'input/output buffered, poteva funzionare solo in modalità O_DIRECT (senza buffering e aggirando la cache), presentava problemi di blocco a causa dell'attesa della disponibilità dei metadati e mostrava grandi sovraccarichi a causa della copia dei dati in memoria.
Nell'ambito dell'API
Gli sviluppatori di io_uring hanno tentato di risolvere i difetti del vecchio interfaccia aio. A io_uring è molto vicino a e supera di gran lunga libaio nel funzionamento con il polling attivato. Per utilizzare io_uring nelle applicazioni finali, che operano nello spazio utente, è stata preparata una libreria , che fornisce un'interfaccia ad alto livello sopra l'interfaccia del kernel; - Il meccanismo di monitoraggio degli eventi nel filesystem fanotify() supporta il monitoraggio delle situazioni di modifica del superblocco e della struttura (eventi di creazione, eliminazione e spostamento delle directory). Le funzionalità presentate aiutano a risolvere i problemi di scalabilità che sorgono nella creazione di monitoraggi ricorsivi delle modifiche in filesystem molto grandi tramite il meccanismo inotify (le modifiche a dirent prima potevano essere monitorate solo tramite inotify, ma
l'efficienza in condizioni di monitoraggio ricorsivo di grandi directory annidate lasciava molto a desiderare). Ora questo tipo di monitoraggio può essere effettuato in modo efficace tramite fanotify; - Nel filesystem Btrfs possibilità di impostare il livello di compressione per l'algoritmo zstd, che può essere considerato come un compromesso ottimale tra lveloce ma inefficace lz4 e il lento ma altamente compressivo xz. Analogamente a come in passato era possibile impostare il livello di compressione applicando zlib, per zstd è stata aggiunta la supporto dell'opzione di montaggio "-o compress=zstd:level". Durante i test, il primo livello minimo ha fornito una compressione dei dati di 2.658 volte con una velocità di compressione di 438.47 MB/s, velocità di decompressione di 910.51 MB/s e un consumo di memoria di 780 MB, mentre il livello massimo 15 ha raggiunto 3.126 volte, ma con una velocità di compressione di 37.30 MB/s, decompressione di 878.84 MB/s e un consumo di memoria di 2547 MB;
- possibilità di avviare da un file system collocato su un dispositivo device-mapper, senza utilizzare initramfs. A partire dall'attuale rilascio del kernel, il dispositivo device-mapper può essere utilizzato direttamente nel processo di avvio, ad esempio come partizione con il file system radice. La configurazione della partizione avviene tramite il parametro di avvio "dm-mod.create". Tra i moduli consentiti per l'avvio del device-mapper ci sono: "crypt", "delay", "linear", "snapshot-origin" e "verity";
- Nel file system orientato ai Flash, F2FS, è stato aggiunto il flag F2FS_NOCOW_FL, che consente di disattivare la modalità copy-on-write per un determinato file;
- Il file system è stato rimosso dal kernel , che rappresenta una variante di ext2, adattata per funzionare con dispositivi di archiviazione basati su oggetti OSD (Object-based Storage Device). È stata anche rimossa la supporto per il protocollo SCSI per tali dispositivi di archiviazione degli oggetti;
- È stata implementata una nuova interfaccia per l'input/output asincrono — , che si distingue per il supporto del polling dell'input/output e la possibilità di operare sia con buffering che senza buffering. Ricordiamo che il meccanismo di input/output asincrono "aio" proposto in precedenza non supportava l'input/output buffered, poteva funzionare solo in modalità O_DIRECT (senza buffering e aggirando la cache), presentava problemi di blocco a causa dell'attesa della disponibilità dei metadati e mostrava grandi sovraccarichi a causa della copia dei dati in memoria.
- Virtualizzazione e sicurezza
- È stata aggiunta l'opzione PR_SPEC_DISABLE_NOEXEC a prctl() per gestire l'esecuzione speculativa delle istruzioni per il processo selezionato. Questa nuova opzione consente di disabilitare selettivamente l'esecuzione speculativa per i processi che potrebbero essere potenzialmente attaccati mediante attacchi del tipo Spectre. Il blocco rimane attivo fino alla prima chiamata a exec();
- È stato realizzato il modulo LSM , che permette ai servizi di sistema di gestire in modo sicuro gli utenti senza elevazione dei privilegi (CAP_SETUID) e senza ottenere i diritti dell'utente root. L'assegnazione dei privilegi avviene tramite la definizione in securityfs di regole basate su una lista bianca di collegamenti consentiti (nella forma «UID1:UID2»);
- Sono state aggiunte modifiche a basso livello necessarie per l'organizzazione stack del caricamento dei moduli di sicurezza (LSM). È stato introdotto il parametro di avvio del kernel "lsm", che consente di controllare quali moduli vengono caricati e in quale ordine;
- È stato aggiunto il supporto per i namespace dei file nel sottosistema di auditing;
- le funzionalità del plugin GCC structleak, che consente di bloccare potenziali perdite di contenuto della memoria. È stata garantita l'inizializzazione di tutte le variabili utilizzate nel codice tramite accesso per riferimento nello stack;
- Sottosistema di rete
- Per i socket una nuova opzione "SO_BINDTOIFINDEX", simile a
"SO_BINDTODEVICE", ma che accetta come argomento l'indice dell'interfaccia di rete invece del nome dell'interfaccia; - Nel stack mac80211 è stata aggiunta la possibilità di assegnare a un dispositivo più BSSID (indirizzi MAC). Nell'ambito del progetto di ottimizzazione delle prestazioni WiFi, nel stack mac80211 è stato aggiunto un monitoraggio della distribuzione del tempo etere e la possibilità di distribuire il tempo etere tra più stazioni (operando in modalità access point, riservando meno tempo per la trasmissione a stazioni wireless lente, invece di un'equa distribuzione del tempo tra tutte le stazioni);
- È stato aggiunto il meccanismo ««, che fornisce notifiche in caso di problemi con l'interfaccia di rete;
- Per i socket una nuova opzione "SO_BINDTOIFINDEX", simile a
- Memoria e servizi di sistema
- consegna sicura dei segnali, tenendo conto della possibilità di riutilizzare il PID. Ad esempio, durante l'esecuzione di una chiamata kill, in passato si poteva verificare una situazione in cui, subito dopo l'invio del segnale, il PID target poteva essere rilasciato a causa della conclusione del processo e occupato da un altro processo, e di conseguenza il segnale veniva trasmesso a un altro processo. Per escludere tali situazioni è stata aggiunta una nuova chiamata di sistema pidfd_send_signal, che utilizza i descrittori di file da /proc/pid per garantire un legame stabile con il processo. Anche se il PID viene riutilizzato durante l'elaborazione della chiamata di sistema, il descrittore di file non cambierà e può essere usato in sicurezza per inviare un segnale al processo;
- la possibilità di utilizzare dispositivi di memoria persistente (persistent-memory, ad esempio ) come RAM. Fino ad ora, tali dispositivi sono stati supportati nel kernel come dispositivi di archiviazione, ma ora possono essere utilizzati anche come memoria RAM aggiuntiva. Questa possibilità è stata implementata in risposta alle richieste degli utenti disposti a tollerare un calo delle prestazioni e desiderosi di utilizzare l'API di gestione della memoria del kernel Linux, invece di affidarsi ai sistemi di distribuzione della memoria nello spazio utente che operano sopra mmap per il file dax;
- È stato aggiunto un nuovo gestore di inattività della CPU (cpuidle, che decide quando è possibile mettere la CPU in modalità di risparmio energetico profondo; maggiore è la modalità, maggiore è il risparmio energetico, ma ci vuole più tempo per uscire dalla modalità) — TEO (Governor Orientato agli Eventi Timer). Fino ad ora erano stati proposti due gestori cpuidle — "menu" e "ladder", che differiscono per l'euristica. Il gestore "menu" presenta problemi noti nell'adozione di decisioni euristiche, per cui è stata presa la decisione di sviluppare un nuovo gestore. TEO è posizionato come un'alternativa al gestore "menu", consentendo di ottenere prestazioni superiori mantenendo lo stesso livello di consumo energetico.
Il nuovo gestore può essere attivato tramite il parametro di avvio "cpuidle.governor=teo"; - Nell'ambito del lavoro di risoluzione , causato dal sovraccarico del tipo time_t a 32 bit, sono state incluse chiamate di sistema che offrono contatori di tempo a 64 bit per architetture a 32 bit. Di conseguenza, ora è possibile utilizzare la struttura time_t a 64 bit su tutte le architetture. Modifiche analoghe sono state implementate nel sottosistema di rete per le opzioni dei socket di rete;
- Nel sistema di patching live del kernel la possibilità di "Atomic Replace" per l'applicazione atomica di una serie di modifiche a una funzione. Questa possibilità consente di distribuire patch aggregate che coprono più modifiche in una volta, invece di un processo piuttosto complesso di applicazione dei live patch in un ordine rigorosamente definito. Se in precedenza ogni modifica successiva doveva basarsi sullo stato della funzione dopo la modifica precedente, ora è possibile distribuire diverse modifiche legate a uno stesso stato iniziale (cioè i manutentori possono gestire un'unica patch aggregata rispetto al kernel di base invece di una catena di patch dipendenti l'una dall'altra);
- obsoleto il supporto per il formato di file eseguibili a.out e
codice per la generazione di file core in formato a.out, che si trova in uno stato abbandonato. Il formato a.out non è più utilizzato nei sistemi Linux, e la generazione di file a.out non è più supportata dagli strumenti moderni nelle configurazioni Linux predefinite. Inoltre, il caricatore per i file a.out può essere implementato interamente nello spazio utente; - Nel meccanismo di verifica dei programmi BPF è stata aggiunta la possibilità di identificare e rimuovere il codice non utilizzato. Il kernel include anche patch con supporto per spinlock per il sottosistema BPF, offrendo ulteriori possibilità di gestione dell'esecuzione parallela dei programmi BPF;
- Attrezzature
- Nel driver Nouveau supporto per la gestione della memoria eterogenea, che consente l'accesso della CPU e della GPU a aree di memoria condivise e sincronizzate. Il sistema di memoria virtuale condivisa (SVM) è implementato sulla base del sottosistema HMM (gestione della memoria eterogenea), che permette di utilizzare dispositivi con unità di gestione della memoria proprie (MMU) che possono accedere alla memoria principale. Inoltre, tramite HMM è possibile organizzare uno spazio di indirizzamento condiviso tra GPU e CPU, in cui la GPU può accedere alla memoria principale del processo. Il supporto SVM è attualmente abilitato solo per le GPU della famiglia Pascal, anche se il supporto è garantito anche per le GPU Volta e Turing. Inoltre, in Nouveau nuovo ioctl per gestire la migrazione delle aree di memoria dei processi nella memoria della GPU;
- nel driver DRM di Intel per GPU Skylake e versioni successive (gen9+) la modalità fastboot per default, escludendo cambi di modalità non necessari durante il boot. identificatori dei dispositivi basati su architetture microarchitetturali Coffelake e Ice Lake. Per i chip Coffelake supporto per GVT (). Per le GPU virtuali supporto per VFIO EDID. Per i pannelli LCD MIPI/DSI supporto per elementi ACPI/PMIC. nuove modalità TV 1080p30/50/60 TV;
- Nel driver amdgpu è stata aggiunta la supporto per le GPU Vega10/20 BACO. Sono state implementate le funzionalità di gestione dell'alimentazione per Vega 10/20 e le tabelle di controllo della ventola per Vega 10. Sono stati aggiunti nuovi identificatori PCI per i dispositivi GPU Picasso. interfaccia di gestione delle dipendenze pianificate per l'esclusione dei deadlock;
- driver DRM/KMS per acceleratori delle operazioni di visualizzazione (Mali D71);
- Aggiunta la supporto per i pannelli LCD Toppoly TPG110, Sitronix ST7701, PDA 91-00156-A0, LeMaker BL035-RGB-002 3.5 e Kingdisplay kd097d04;
- Aggiunta la supporto per i codec audio Rockchip RK3328, Cirrus Logic CS4341 e CS35L36, MediaTek MT6358, Qualcomm WCD9335 e Ingenic JZ4725B, oltre alla piattaforma audio MediaTek MT8183;
- Aggiunta la supporto per i controller NAND Flash STMicroelectronics FMC2, Amlogic Meson;
- Aggiunta la supporto per gli acceleratori per sistemi hardware Habana AI;
- Aggiunta la supporto per i controller Ethernet gigabit NXP ENETC e interfacce wireless MediaTek MT7603E (PCIe) e MT76x8.
Contemporaneamente, il Fondo latinoamericano per il software libero
una variante — , ripulito da elementi di firmware e driver contenenti componenti o parti di codice non liberi, la cui area di applicazione è limitata dal produttore. Nella nuova versione è stata disabilitata il caricamento dei blob nei driver mt7603 e goya. È stato aggiornato il codice di pulizia dei blob nei driver e nei sottomoduli wilc1000, iwlwifi, soc-acpi-intel, brcmfmac, mwifiex, btmrvl, btmtk e touchscreen_dmi. È stata interrotta la pulizia dei blob nel bootloader del firmware lantiq xrx200 a causa della sua rimozione dal kernel.
Fonte: opennet.ru
