După două luni de dezvoltare, Linus Torvalds a prezentat versiunea nucleului Linux 6.18. Între cele mai notabile schimbări se numără: dm-pcache pentru caching pe disc în memoria non-volatilă (PMEM), eliminarea Bcachefs, modul online de verificare XFS, driverele Binder (Android IPC) și Tyr (GPU Mali) scrise în Rust, posibilitatea de a crea drivere USB în Rust, optimizarea caching-ului în allocatorul de memorie SLUB, adresarea spațiilor de nume prin descriptorii de fișiere, accelerarea funcționării swap-ului, verificarea programelor BPF prin semnătură digitală, virtualizarea Intel CET în KVM, protocolul de rețea PSP (hibrid TLS și IPsec), suportul pentru extensia IP AccECN și optimizarea stivei UDP.
Noua versiune include 15035 de corecții făcute de 2217 dezvoltatori, dimensiunea patch-ului fiind de 45 MB (modificările au afectat 13142 de fișiere, s-au adăugat 601897 de linii de cod și s-au șters 355006 de linii). În versiunea anterioară au fost 14334 de corecții de la 2118 dezvoltatori, dimensiunea patch-ului fiind de 46 MB. Aproximativ 40% dintre toate modificările din 6.18 sunt legate de driverele de dispozitive, aproximativ 16% se referă la actualizări ale codului specific arhitecturilor hardware, 12% sunt legate de stiva de rețea, 5% de sistemele de fișiere și 3% de subsistemele interne ale nucleului.
Principalele noutăți din nucleul 6.18 (1, 2, 3):
- Subsistemul de disc, I/O și sistemele de fișiere
- În Device Mapper a fost adăugat un handler dm-pcache pentru utilizarea memoriei persistente (memorie CXL adresată prin dispozitive DAX) ca cache suplimentar de înaltă performanță înaintea discurilor tradiționale mai lente sau a unităților flash. Dm-pcache asigură păstrarea conținutului cache-ului în caz de crize (crash-safe) prin utilizarea memoriei non-volatilă, duplicarea metadatelor și verificarea integrității datelor și metadatelor prin sumelor de control CRC32. În prezent, este suportat doar caching-ul în mod de scriere întârziată (write-back).
- Codul sistemului de fișiere Bcachefs a fost eliminat din nucleu, urmând să fie distribuit sub formă de modul extern, compilat cu ajutorul instrumentelor DKMS (Dynamic Kernel Module Support). Codul Bcachefs poate fi readus în nucleu după ce Kent Overstreet va demonstra în mod concret posibilitatea interacțiunii corecte cu alți dezvoltatori de nucleu și capacitatea de a urma regulile de dezvoltare stabilite.
- În apelul de sistem pwritev2() a fost adăugat un flag RWF_NOSIGNAL, care dezactivează trimiterea semnalului SIGPIPE la scrierea în canale sau socketuri neamenajate întrerupte.
- În Procfs a fost adăugată opțiunea de montare «pidns» pentru a specifica spațiile de nume ale identificatorilor de procese (PID namespace). De exemplu: «mount -t proc -o pidns=\/proc\/self\/ns\/pid proc \/tmp\/proc».
- În XFS a fost declarată stabilă și activată implicit posibilitatea utilizării utilitarului fsck pentru verificarea și corectarea problemelor identificate în modul online, fără a demonta sistemul de fișiere. Au fost adăugate apeluri de sistem file_getattr și file_setattr pentru modificarea atributelor fișierelor speciale (orice inode). În KConfig, opțiunile XFS_SUPPORT_V4 (versiunea 4 XFS) și XFS_SUPPORT_ASCII_CI (modul fără considerare pentru cazul literelor ASCII) sunt dezactivate implicit, fiind declarate învechite. Opțiunile de montare attr2, noattr2, ikeep și noikeep au fost complet eliminate.
- În MD RAID a fost implementat un nou tip de hărți bit — llbitmap (bitmap fără blocări), care funcționează fără blocări și oferă o performanță mai bună.
- Informațiile legate de criptare și verificare (indicii i_crypt_info și i_verity_info) au fost extrase din structura generală «inode». Această modificare permite reducerea consumului de memorie în sistemele de fișiere care nu suportă criptarea și verificarea.
- În subsistemul FUSE a fost adăugată suportul pentru apelul de sistem copy_file_range() și copierea directă a intervalelor cu o dimensiune de tip 64-biți (anterior era suportată doar dimensiunea de 32-biți). A fost adăugată suportul pentru inițializarea în mod sincron în timpul montării (FUSE_DEV_IOC_SYNC_INIT).
- În FS ext4 a fost implementată posibilitatea utilizării identificatorilor de utilizatori (uid) și grupuri (gid) pe 32-biți la accesarea blocurilor rezervate. Au fost adăugate operații ioctl pentru setarea și citirea parametrilor superblocului sistemelor de fișiere montate (tune2fs va putea modifica parametrii din superbloc fără drepturi de scriere în dispozitivul de bloc). Toate setările învechite, specifice ext3, au fost complet eliminate.
- În f2fs a fost adăugată opțiunea de montare „lookup_mode” pentru alegerea modului de căutare: perf — căutare prin hash, compat — căutare liniară, auto — alegere automată. Schimbarea modului are sens pentru configurațiile cu directoare în care nu se ține cont de majuscule. Modului curent de căutare îi putem afla prin fișierul „/sys/fs/f2fs//effective_lookup_mode”. A fost adăugată posibilitatea rezervării inode-urilor, disponibile doar utilizatorilor privilegiați.
- În Overlayfs a fost adăugat un mod de lucru fără a ține cont de majuscule, activat la nivelul straturilor FS (setarea pentru directorii individuali nu este deocamdată suportată).
- În BTRFS a fost îmbunătățită paralelizarea operațiunilor în cazul unei încărcări mari de citire și a unei încărcări mici de scriere, timp de fixare a tranzacțiilor a fost redus, iar sincronizarea a fost semnificativ scurtată (de la minute la zeci de secunde). A fost oferită posibilitatea de a folosi blocuri (bs) mai mari decât pagina de memorie (ps).
- În ksmbd (server SMB funcționând la nivel de kernel) a fost adăugat un parametru pentru limitarea numărului maxim de conexiuni de la un singur. adrese IP. smbdirect, smbclient și smbserver au fost migrate la utilizarea structurilor standard ale kernel-ului.
- În SQUASHFS a fost adăugată posibilitatea utilizării opțiunilor SEEK_DATA și SEEK_HOLE în apelul de sistem lseek() pentru a căuta date și goluri în fișiere sparse. În unele teste, a fost observată o creștere a performanței copierea fișierelor sparse de până la 150 de ori.
- În EXFAT a fost adăugată suportul pentru ioctl FS_IOC_GETFSLABEL și FS_IOC_SETFSLABEL pentru a citi și scrie etichete ale partițiilor. A fost oferită posibilitatea modificării opțiunilor de montare în timpul remontării. A fost accelerată încărcarea hărților bitmap.
- În NTFS3 a fost adăugat suportul pentru ioctl FS_IOC_GETFSLABEL și FS_IOC_SETFSLABEL pentru a citi și seta etichete ale partițiilor.
- Memorie și servicii de sistem
- A fost acceptată implementarea mecanismului de interacțiune între procese Binder, scrisă în limbajul Rust. Binder este folosit în Android pentru a organiza interacțiunea între procese și apelurile metodei de la distanță (un proces Android poate apela o metodă sau o funcție dintr-un alt proces Android, folosind Binder pentru a identifica, apela și transmite argumente între procese). Codul Binder a fost rescris în limbajul Rust în cadrul inițiativei Google de întărire a securității Android.
- În SLUB, alocatoarele de memorie ale nucleului, s-a implementat un strat de cache opțional numit „sheaves”, care utilizează mai multe cache-uri, fiecare dintre ele fiind asociat cu un nucleu CPU separat, ceea ce permite localizarea operațiunilor de alocare sau eliberare a memoriei la un singur nucleu. Acest cache a îmbunătățit performanța alocării și eliberării memoriei în nucleu, prin eliminarea primitivelor de sincronizare inutile, necesare atunci când sunt implicate diverse nuclee CPU. În teste, îmbunătățirea performanței a variat între 6,3% și 31%, în funcție de tipul de sarcină.
- A fost adăugată opțiunea de a crea descriptorii de fișiere asociați cu un anumit spațiu de nume (namespace). Spre deosebire de accesul la spațiile de nume prin identificatori (\proc\<pid>\ns\), descriptorul de fișier este legat de un anumit exemplu al spațiului de nume și exclude situația în care identificatorul este alocat din nou și indică deja un alt obiect. Similar cu utilizarea pidfds, deschiderea descriptorilor de fișiere care se referă la spațiile de nume se realizează prin funcțiile open_by_handle_at() și name_to_handle_at().
- A fost implementat mecanismul „Swap Table”, care permite îmbunătățirea performanței schimbului de date. Accelerarea se obține prin reducerea concurenței pentru accesul la cache-ul de swap, o căutare mai eficientă în cache și reducerea fragmentării. Backend-ul bazat pe Swap Table este folosit pentru caching-ul schimbului de date în locul backend-ului XArray și a permis o creștere medie a performanței de 5-20%. În testul usemem, lățimea de bandă a crescut cu 17-28%, iar timpul de compilare în testul pentru recompilarea multithread a scăzut cu 1,12-3,19%, testul redis-benchmark cu BGSAVE a arătat o creștere a numărului de cereri procesate cu 6-7%.
- Subsystema Zswap a fost transferată pe utilizarea directă a sistemului de alocare a memoriei zsmalloc în locul stratului zpool, care nu mai este utilizat și acum a fost eliminat din nucleu.
- Pentru a gestiona comportamentul încărcătorului microcodului pe sistemele x86, a fost implementată opțiunea din linia de comandă „microcode=listă de steaguri”. În forma sa actuală, noua opțiune a înlocuit „microcode.force_minrev” și, de asemenea, permite specificarea versiunii minime de microcod acceptată pentru încărcare.
- A început reorganizarea structurii excesiv de umflate „page”, folosită pentru gestionarea paginilor de memorie RAM. A fost adăugat tipul ‘memdesc_flags_t’ pentru câmpurile cu steaguri universale, care pot fi folosite după așteptata în viitor separare din structura „page” a structurilor separate pentru slab și folio.
- Pentru arhitectura nios2, utilizată în procesoarele Altera Nios II (procesor soft bazat pe FPGA), a fost implementat suportul pentru apelul de sistem clone3().
- Configurația nucleului (KConfig) a fost îmbogățită cu atributul „transitional”, care poate fi folosit pentru a marca setările neafişate în interfețele utilizator, cum ar fi „make menuconfig”, și care nu sunt incluse în fișierele de configurație generate. Principala utilizare a atributului este simplificarea redenumirii opțiunilor, menținând compatibilitatea inversă.
- Versiunea minimă a compilatorului Clang, cu ajutorul căruia poate fi compilat nucleul, a fost ridicată la instrumentarul LLVM 15. În Debian 12 și Ubuntu 22.04 se furnizează LLVM 14.
- A continuat transferul modificărilor din ramura Rust-for-Linux, legate de utilizarea limbajului Rust ca al doilea limbaj pentru dezvoltarea driverelor și modulelor nucleului (suportul pentru Rust nu este activat în mod implicit și nu duce la includerea Rust în lista dependențelor de construcție obligatorii ale nucleului). În noua versiune, pentru codul scris în Rust au fost implementate operații atomice cu memorie, structura maple tree, posibilitatea de a crea fișiere DebugFS și funcții pentru manipularea hărților bitare. Accesul la API pentru dezvoltarea driverelor a fost extins. A fost adăugat un set complet de abstracții pentru dezvoltarea driverelor de dispozitive USB (exemplu de driver USB). Utilitarul perf a primit suport pentru simbolurile de depanare generate de compilatorul rustc.
- Virtualizare și securitate
- A fost adăugat suport pentru verificarea criptografică a programelor BPF încărcate prin semnătura digitală. În viitor, această capacitate va fi extinsă cu instrumente pentru stabilirea regulilor de încărcare a programelor BPF semnate și pentru a oferi utilizatorilor neprivilegiați posibilitatea de a utiliza programele BPF verificate.
- În hypervizorul KVM a fost implementat suportul pentru virtualizarea extensiei Intel CET (Control-flow Enforcement Technology), utilizată pentru protecția împotriva exploit-urilor care folosesc metode de programare orientate pe returnare (ROP — Return-Oriented Programming). Esența protecției este că, după ce controlul este transferat unei funcții, adresa de returnare este salvată de procesor nu doar în stiva obișnuită, ci și într-o stivă separată, care nu poate fi modificată direct.
- A fost adăugată posibilitatea de a utiliza mai mult de 255 CPU în sistemele gazdă care funcționează sub hypervizorul Bhyve pe gazde cu FreeBSD 15.
- A fost adăugată o interfață dibs (Direct Internal Buffer Sharing) pentru gestionarea Partajării bufferelor în interiorul unui mediu izolat, cum ar fi hypervizorul sau o instanță a nucleului Linux.
- În subsistemul de audit a fost adăugat suport pentru funcționarea cu mai multe module LSM (Linux Security Module) activate simultan.
- A fost adăugat driverul virtio spi-virtio pentru acces la dispozitivul SPI (Serial Peripheral Interface) din mașini virtuale.
- În hypervizorul KVM a fost adăugat suportul pentru modul SEV-SNP CipherText Hiding, care blochează citirea șifratului memoriei sistemelor gazdă protejate de CPU neautorizat.
- A fost adăugat driverul qtee pentru medii TEE (Trusted Execution Environment) ale chip-urilor Qualcomm.
- Subsystema de rețea
- A fost adăugat suport pentru criptarea conexiunilor TCP, folosind protocolul PSP (PSP Security Protocol), dezvoltat de Google pentru criptarea traficului între centrele de date. PSP asigură criptarea, controlul criptografic al integrității și autentificarea sursei, realizând o combinație unică de capacități ale protocoalelor TLS și IPsec. În PSP, criptarea se aplică la nivelul conexiunilor de rețea individuale, nu întregului canal de comunicare. PSP utilizează chei de criptare separate pentru diferite conexiuni TCP tunelabile pentru a izola strict traficul provenit din diverse aplicații și procese. Pentru a reduce încărcătura pe CPU, se sprijină externalizarea operațiunilor de criptare și decriptare pe partea plăcilor de rețea (offload). Protocolul UDP este utilizat ca transport pentru transmiterea datelor, pe care se suprapune conținutul pachetului TCP original.

- A fost adătată suportul inițial pentru extensia AccECN (Accurate Explicit Congestion Notification), care reprezintă o variantă îmbunătățită a extensiei ECN, permițând gazdelor, în cazul suprasolicitării, să marcheze pachetele IP în loc să le respingă, ceea ce oferă posibilitatea de a detecta apariția unei stări inițiale de congestionare în canalele de comunicație fără pierderea pachetelor. Extensia originală ECN are o limitare care permite semnalizarea unei singure suprasolicitări într-un singur ciclu de transmitere TCP (RTT, Round-Trip Time, trimiterea unei cereri și primirea răspunsului). AccECN elimină această limitare și permite destinatarului să transmită expeditorului mai multe etichete de suprasolicitare în antetul pachetului TCP. Algoritmii de gestionare a suprasolicitării pot folosi informațiile obținute pentru a reacționa mai precis la suprasolicitari și a evita reducerea drastică a intensității de trimitere a pachetelor în cazul unei suprasolicitări ușoare.
- În stiva UDP a fost optimizată procesarea pachetelor de intrare în condiții de atacuri DDoS, care duc la primirea unui număr mare de pachete într-unul sau mai multe socket-uri UDP. Optimizările implementate, cum ar fi reducerea blocajelor concurente, optimizarea plasării structurilor de date în memorie și utilizarea blocajelor care țin cont de arhitectura NUMA (Non-Uniform Memory Access), au permis creșterea performanței la primirea pachetelor UDP cu 47% și mai mult în condiții extreme.
- A fost implementată posibilitatea de a dezactiva caching-ul intrărilor/ieșirilor în serverul NFS, ceea ce permite utilizarea serverului NFS în sisteme cu cantitate mică de memorie (de exemplu, medii cloud reduse). Dezactivarea cache-ului poate fi de asemenea utile pe serverele NFS împovărate pentru a evita scoaterea din cache a datelor asociate cu stocatoarele locale din cauza eliberării memoriei pentru cache-ul NFS.
- Dimensiunea maximă a bufferelor pentru pachetele primite și trimise pentru socket-uri de rețea (net.core.rmem_max și net.core.wmem_max) a fost crescută de la 2 MB la 4 MB. Dimensiunea setată implicit nu s-a schimbat (net.core.rmem_default și net.core.wmem_default = 2 MB).
- A fost adăugat un driver pentru acceleratorul operațiunilor de rețea Qualcomm PPE (Packet Processing Engine), utilizat în SoC Qualcomm IPQ9574.
- A fost adăugat suport pentru criptarea conexiunilor TCP, folosind protocolul PSP (PSP Security Protocol), dezvoltat de Google pentru criptarea traficului între centrele de date. PSP asigură criptarea, controlul criptografic al integrității și autentificarea sursei, realizând o combinație unică de capacități ale protocoalelor TLS și IPsec. În PSP, criptarea se aplică la nivelul conexiunilor de rețea individuale, nu întregului canal de comunicare. PSP utilizează chei de criptare separate pentru diferite conexiuni TCP tunelabile pentru a izola strict traficul provenit din diverse aplicații și procese. Pentru a reduce încărcătura pe CPU, se sprijină externalizarea operațiunilor de criptare și decriptare pe partea plăcilor de rețea (offload). Protocolul UDP este utilizat ca transport pentru transmiterea datelor, pe care se suprapune conținutul pachetului TCP original.
- Echipament
- În nucleul sistemului a fost integrat driverul Tyr, scris în limbajul Rust, care asigură funcționarea cu GPU-uri ARM Mali, utilizând tehnologia CSF (Sistem Frontend al Comenzilor), precum Mali G310, G510 și G710. Driverul nu este încă pregătit pentru utilizarea permanentă de către utilizatorii obișnuiți și este considerat un prototip experimental pentru testarea abstractizărilor pentru dezvoltarea driverelor în limbajul Rust.
- În driverele pentru dispozitivele de intrare cu interfața HID (dispozitiv de interfață umană) a fost adăugată suport pentru touchpad-uri cu feedback haptic și senzori de forță la apăsare.
- S-au continuat lucrările la driverul drm (Direct Rendering Manager) Xe pentru GPU-uri bazate pe arhitectura Intel Xe, utilizată în plăcile grafice Intel din familia Arc și în grafica integrată, începând cu procesoarele Tiger Lake. În noua versiune a fost adăugat interfața madvise, a fost inclusă suportul pentru SR-IOV PF (Funcția Fizică a Virtualizării I/O cu Rădăcină Unică), a fost adăugată suport pentru modul Intel PSMI pentru validarea echipamentului, a fost asigurată prelucrarea informațiilor despre erori transmise prin firmware-uri, s-a implementat profilul de consum energetic SLPC, și a fost adăugată suportul pentru încărcarea firmware-urilor auxiliare (de exemplu, pentru controlerul ventilatorului și regulatorul de tensiune) în timpul verificării driverului.
- În driverul AMDGPU a fost adăugată suportul pentru dispozitive cu APU Cyan Skillfish, s-a îmbunătățit suportul pentru AMD GCN 1.0, s-a realizat compatibilitatea cu instrumentele criu, și în sysfs au fost adăugate metrici de temperatură, fiind permise cererile de remapare MMIO din spațiul utilizatorului.
- În driverul i915 a fost inclus suportul pentru cipurile din familia Wildcat Lake și s-a îmbunătățit funcționarea cu GPU-uri Jasper Lake, Elkhart Lake, Gen7 și Gen6.
- În driverul Nouveau au fost utilizate în mod implicit firmware-urile GSP NVIDIA și a fost îmbunătățită prelucrarea erorilor.
- S-a continuat integrarea componentelor driverului Nova pentru GPU-uri NVIDIA, echipate cu firmware-uri GSP, utilizate începând cu seria NVIDIA GeForce RTX 2000 bazată pe microarhitectura Turing. Driverul este scris în limbajul Rust. În noua versiune a fost extins suportul pentru firmware-urile GSP, a fost îmbunătățită implementarea macro-ului „register!”, și a fost adăugat suport pentru clasele de dispozitive PCI și identificatorii producătorilor.
- A fost adăugat driverul rocket pentru acceleratoarele NPU utilizate în SoC Rockchip RK3588.
- A fost adăugat parametru al nucleului „boot_display” pentru selectarea dispozitivului de ieșire pentru afișarea procesului de încărcare pe sistemele cu mai multe GPU-uri.
- În driverul vesadrm a fost implementat suportul pentru palete de 8 biți.
- În driverul msm a fost adăugată suport pentru GPU Adreno 663 și a fost implementat suport pentru tehnologia de reducere a consumului de energie IFPC (Inter Frame Power Collapse).
- În driverul panthor a fost adăugat suport pentru GPU Mali-G710, Mali-G510, Mali-G310, Mali-Gx15, Mali-Gx20 și Mali-Gx25.
- A fost adăugat suport pentru sistemele audio ASoC Qualcomm Glymur și PM4125, Realtek RT1321, Shanghai FourSemi FS2104/5S, Texas Instruments PCM1754 și TAS2783A, qcs615, CS35L56 B2, tas2118, tas2x20, tas5825. A fost adăugat suport pentru plăcile de sunet USB Tascam US-144mkII și Presonus S1824c.
- A fost adăugat suport pentru CPU ARM Cortex-A320/A520AE/A720AE și C1-Nano/Pro/Premium/Ultra.
- A fost adăugat suport pentru plăci ARM, SoC și dispozitive: Apple M2 Pro, M2 Max și M2 Ultra, Sony Xperia SP, Samsung Galaxy S22, Samsung Galaxy S20 FE, ASUS Eee Pad Slider SL101, Lenovo ThinkBook 16, HP Omnibook X14 X1P42100, Dell Inspiron 7441/Latitude 7455, Sige1, NanoPi Zero2, Axis Artpec8, NXP i.MX91, ROCK 2A/2F, Qualcomm Lemans Auto, Renesas RZ/T2H, RZ/N2H, RZ/T2H și RZ/N2H, Aspeed AST27xx, Meta Clemente BMC, Netcube Nagami som, Tqma91xx, Ultratronik i.MX8MP Ultra-MACH, i.MX8ULP EVK9, Buffalo WXR-1750DHP.
În același timp, Fundația latino-americană pentru software liber a creat o variantă complet liberă a nucleului 6.18 — Linux-libre 6.18-gnu, curățată de elemente de firmware și drivere care conțin componente nesigure sau fragmente de cod, al căror domeniu de aplicare este limitat de producător. În versiunea 6.18 a fost actualizat codul de curățare a blob-urilor în driverele Nova-Core, Intel XE, TI PRUeth, Lantiq GSWIP, Marvell WiFi-Ex. A fost realizată curățarea numelui blob-urilor în fișierele dts (devicetree) pentru cipurile ARM Qualcomm, Mediatek și TI ARM64. A fost neutralizată încărcarea blob-urilor în noile drivere FourSemi fs2104/5s, TI TAS2783 și Qualcomm GENI.
Sursa: opennet.ro

