După două luni de dezvoltare, Linus Torvalds a prezentat versiunea kernel-ului Linux 6.6. Printre cele mai notabile schimbări se numără: un nou planificator de sarcini EEVDF; un mecanism de stivă de protecție pentru a preveni exploatările; suport pentru fs-verity în OverlayFS; implementarea cotelor și a xattr în tmpfs; pregătirea fsck online în XFS; monitorizarea crescută a exportului simbolurilor „GPL-only”; suport pentru socket-uri de rețea în io_uring; randomizarea memoriei în kmalloc(); ReiserFS a fost declarată învechită; au fost adăugate primitive pentru driverul Vulkan NVK în Nouveau.
Noua versiune include 15291 de corecții de la 2058 de dezvoltatori, dimensiunea patch-ului fiind de 39 MB (modificările au afectat 14844 de fișiere, au fost adăugate 553359 de linii de cod și eliminate 284012 linii). În versiunea anterioară au fost 14674 de corecții de la 2016 de dezvoltatori, dimensiunea patch-ului fiind de 78 MB. Aproximativ 44% din toate modificările prezentate în 6.6 sunt legate de driverele de dispozitive, aproximativ 17% se referă la actualizarea codului specific arhitecturilor hardware, 11% sunt legate de stiva de rețea, 4% de sistemele de fișiere și 3% de subsistemele interne ale kernel-ului.
Inovațiile cheie în kernel-ul 6.6:
- Memorie și servicii de sistem
- A fost implementat un nou planificator de sarcini EEVDF (Earliest Eligible Virtual Deadline First), care îl înlocuiește pe planificatorul CFS (Completely Fair Scheduler), care a fost livrat începând cu kernel-ul 2.6.23. Noua planificare, în alegerea următorului proces de transmisie, ia în considerare procesele care nu au primit suficiente resurse CPU sau care au obținut în mod nedrept prea mult timp de procesor. În primul caz, se forțează transmiterea controlului către proces, iar în al doilea, dimpotrivă, se amână. Vechiul planificator CFS folosea un sistem euristic și ajustări fine pentru a determina procesele ce necesită atenție separată, în timp ce noul planificator le urmărește mai clar și nu necesită ajustări fine. Se estimează că EEVDF va reduce întârzierile în execuția sarcinilor cu care CFS a avut probleme în planificare.
- Au fost aduse modificări în procesarea simbolurilor interne din categoria «GPL-only», destinate dificultării utilizării modulelor proprietare GPL-layer pentru a ocoli restricțiile de acces la subsistemele nucleului, care permit apelul doar de cod licențiat GPL. În funcția symbol_get() pentru modulele proprietare, căutarea simbolurilor marcate ca GPL-only este interzisă, iar modulele GPL nu vor putea găsi simboluri exportate de modulele proprietare.
- Au fost adăugate setări suplimentare pentru cozile de lucru (unbound workqueue) pentru a îmbunătăți eficiența reutilizării cache-ului procesorului în sistemele mari, care au mai multe cache-uri de nivel trei (L3). Nucleul include acum și utilitarul tools/workqueue/wq_dump.py pentru a verifica configurația actuală a cozilor de lucru.
- În subsistemul io_uring a fost adăugată suportul inițial pentru operațiuni și comenzi specifice socket-urilor de rețea. A fost adăugat sysctl io_uring_disabled pentru a dezactiva io_uring la nivel de sistem. De asemenea, în io_uring a fost accelerat semnificativ input/output-ul direct (Direct I/O) în mod asincron. Creșterea lățimii de bandă și reducerea întârzierilor la efectuarea operațiunilor de input-output după modificări ating 37%.
- Pentru arhitectura PA-RISC a fost implementat un compilator JIT pentru BPF.
- În setările /sys/devices/system/cpu/smt/control a fost adăugat suportul pentru parametrii numerici care determină numărul de fire disponibile pentru fiecare nucleu CPU (anterior erau acceptate doar valorile «on» și «off» pentru activarea și dezactivarea suportului de SMT simetric). Noua funcționalitate poate fi utilizată pe anumite procesoare PowerPC care suportă modul de activare la cald a SMT-ului simetric («hotplug SMT»), pentru a activa selectiv SMT pe anumite nuclee în timpul funcționării.
- Continuarea transferului modificărilor din ramura Rust-for-Linux, legate de utilizarea limbajului Rust ca a doua limbă pentru dezvoltarea driverelor și modulelor nucleului (suportul Rust nu este activat în mod implicit și nu duce la includerea Rust ca dependență obligatorie în construcția nucleului). A fost realizată trecerea la versiunile Rust 1.71.1 și bindgen 0.65.1. A fost implementat tipajul 'Zeroable'. Au fost adăugate macrocomenzi procedurale 'paste!' și '#[derive(Zeroable)]'. A fost asigurată compatibilitatea cu '#[pin_data]'. Au fost adăugate funcții de inițializare '{,pin_}init_array_from_fn()' și metoda '{,pin_}chain'. Funcționalitățile modulului 'types' au fost extinse. În cadrul framework-ului de testare unitară kunit a fost adăugată capacitatea de a rula teste din documentația Rust.
- A fost adăugată subsistemul 'eventfs', care reduce semnificativ consumul de memorie în sistemul de trasare, prin eliminarea stocării structurilor inutile utilizate pentru reprezentarea punctelor de trasare în sistemul de fișiere. În trecut, structuri similare erau create pentru toate punctele de trasare, indiferent de utilizarea trasării. Prin intermediul eventfs, astfel de structuri pot fi create dinamic, doar în momentele în care sunt necesare.
- Funcționalitățile utilitarului perf au fost extinse.
- În fișierul /proc/pid/smaps a fost adăugată informația pentru diagnosticarea eficienței mecanismului de fuziune a paginilor de memorie identice (KSM, Kernel Same-page Merging).
- API-ul Frontswap a fost eliminat, permițând plasarea partiturii de swap în memorie, care nu poate fi adresată direct și care nu oferă informații operaționale despre disponibilitatea spațiului liber. Acest API a fost folosit doar în zswap, așa că s-a decis utilizarea directă a acestei funcționalități în zswap, eliminând straturile intermediare.
- Pentru arhitectura RISC-V a fost adăugat suportul pentru accesarea contoarelor de performanță din spațiul utilizatorului și posibilitatea plasării unui dump al nucleului după o eroare în zona dincolo de 4GB.
- A fost adăugat suport inițial pentru instrucțiunile ARM SME (Scalable Matrix Extension).
- A fost realizată posibilitatea utilizării instrumentelor de depanare KDB, KGDB, kcov, KFENCE și KASAN pe sisteme cu arhitectura LoongArch.
- A fost adăugat suport pentru fișierele de testare a nucleului în sistemul de integrare continuă GitLab, care sunt folosite în dezvoltarea driverelor grafice.
- Subsistemul de disc, I/O și sistemele de fișiere
- Sistemul de fișiere OverlayFS a adăugat suport pentru salvarea hash-urilor fs-verity în atributul extins (xattr) overlay.verity, care poate fi folosit pentru a verifica integritatea și autenticitatea fișierelor din straturile inferioare ale OverlayFS prin utilizarea hash-urilor criptografice și a cheilor. Astfel, OverlayFS include acum toate modificările necesare proiectului Composefs pentru a funcționa ca un strat peste FS OverlayFS și EROFS.
- Sistemul de fișiere XFS a fost pregătit pentru implementarea posibilității de utilizare a utilitarului fsck pentru a verifica și corecta problemele descoperite în modul online, fără a demonta sistemul de fișiere. În plus, în XFS a fost implementată utilizarea foliilor mari (folios) în cache-ul pe pagini și au fost adăugate unele optimizări conexe, care au crescut considerabil performanța pentru anumite tipuri de sarcini.
- Sistemul de fișiere tmpfs a adăugat suport pentru atribute extinse personalizate (user xattrs), I/O direct și cote legate de utilizator și grup. Offset-urile pentru directoare au fost stabilizate, rezolvând problemele de export al tmpfs prin NFS.
- În API-ul de gestionare a montării, pentru creșterea securității, a fost adăugat flag-ul FSCONFIG_CMD_CREATE_EXCL, care interzice partajarea superblock-ului în mai multe puncte de montare (interzice atașarea unei partiții la mai multe puncte de montare). În utilitarul mount, a fost sugerată opțiunea „—exclusive” pentru a activa acest flag.
- În subsistemul VFS a fost adăugat suport pentru modificarea dinamică a parametrilor de timp de acces și modificare (atime, mtime). În trecut, datele despre timp erau reflectate cu o oarecare întârziere, ceea ce împiedica urmărirea actualității datelor în cache în sisteme precum NFS (din cauza întârzierii în determinarea modificărilor din fișier, sistemul putea considera greșit că datele din cache sunt actuale). Noua posibilitate este disponibilă pentru Btrfs, Ext4, tmpfs și XFS.
- În Btrfs, mecanismul încorporat de verificare a integrității, activat în etapa de construire prin parametrul BTRFS_FS_CHECK_INTEGRITY, a fost declarat învechit. Mecanismul respectiv nu mai este întreținut, nu mai este testat și generează o sarcină suplimentară pe CPU și memorie. În plus, în Btrfs a fost optimizată performanța noii coduri de verificare a FS (scrub).
- În sistemul de fișiere Ext4 au fost adăugate verificări periodice pentru actualizarea superblocului și au fost accelerate operațiile de alocare a memoriei la adăugarea de date la sfârșitul fișierului.
- În subsistemul FUSE a fost adăugată suport pentru atributul btime ("birth time"), care determină timpul de creare a inode-ului.
- Modificarea permisiunilor de acces pentru linkurile simbolice este interzisă.
- A fost adăugat apelul de sistem fchmodat2(), care se deosebește de apelul de sistem fchmodat() printr-un argument suplimentar pentru specificarea flag-urilor. Din flag-uri, deocamdată, sunt acceptate doar AT_SYMLINK_NOFOLLOW și AT_EMPTY_PATH, care permit implementarea interdicției de dereferențiere a linkurilor simbolice în funcția libc fchmodat() fără devieri și utilizarea descriptorului de fișier la specificarea unui drum gol.
- În sistemul de fișiere EROFS (Extendable Read-Only File System), destinat utilizării pe partiții accesibile doar în modul de citire, a fost adăugat suport pentru algoritmul de compresie Deflate. Pentru accelerarea căutării atributelor extinse a fost utilizată o structură probabilistică bloom filter.
- A fost adăugată configurația CONFIG_BUFFER_HEAD, care permite compilarea nucleului fără utilizarea structurii buffer_head. La compilarea fără buffer_head pot fi utilizate dispozitive de bloc și unele sisteme de fișiere, de exemplu, xfs, btrfs, cramfs, erofs și squashfs.
- În driverul dispozitivelor de bloc ublk, care permite transferarea logicii specifice pe partea procesului în spațiul utilizatorului, a fost adăugat suport pentru dispozitive de stocare zonificate (împărțire în zone de grupuri de blocuri sau sectoare, în care este permisă doar adăugarea secvențială de date cu actualizarea întregii grupe de blocuri).
- Implementarea sistemului de fișiere ReiserFS a fost transferată din categoria celor suportate în categoria celor învechite (Obsolete). Oprirea suportului pentru ReiserFS este planificată pentru anul 2025. Motivul transferului ReiserFS în categoria celor învechite este stagnarea în întreținerea acestuia, problema nerezolvată a anului 2038, lipsa capacităților de asigurare a rezilienței și dorința de a reduce costurile de întreținere ale modificărilor comune pentru sistemele de fișiere, legate de suportul noului API pentru montare, iomap și folios.
- În serverul NFS a fost implementat un mecanism de delegare a operațiunilor de scriere pentru NFSv4, care îmbunătățește eficiența memoriei cache pentru scrierea fișierelor, reducând traficul. A fost inclus suport pentru operația READ_PLUS, definită în NFS 4.2.
- Sistemul de fișiere Ceph a primit suport pentru fscrypt.
- Virtualizare și securitate
- A fost adăugată o implementare a mecanismului Shadow Stack, care permite blocarea funcționării multor exploatări, folosind capacitățile hardware ale procesoarelor Intel pentru a proteja împotriva rescrierii adresei de returnare din funcție în cazul overflow-ului de buffer în stivă. Conceptul de protecție este că, după ce controlul este transferat funcției, adresa de returnare este salvată de procesor nu doar în stiva obișnuită, ci și într-o stivă „shadow” separată, care nu poate fi modificată direct. Înainte de a ieși din funcție, adresa de returnare este extrasă din stiva shadow și comparată cu adresa de returnare din stiva principală. Nepotrivirea adreselor duce la generarea unei excepții, care blochează situațiile în care un exploit a reușit să rescrie adresa în stiva principală. Stiva shadow hardware este suportată doar în construcțiile pe 64 de biți, iar în construcțiile pe 32 de biți se aplică o emulare software.
- A fost adăugat suport pentru compilarea cu Clang cu modul de protecție CFI (Control Flow Integrity) activat, care blochează încălcările ordinii normale de execuție (control flow) ca rezultat al utilizării exploatărilor, care modifică indicatorii funcțiilor stocați în memorie.
- Pentru arhitectura RISC-V a fost activată randomizarea plasării nucleului în memorie la încărcare.
- În apelul de sistem seccomp() a fost adăugat flagul SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP, care permite procesarea evenimentelor din procesele urmărite în mod sincronic pentru o funcționare mai eficientă a planificatorului de sarcini.
- În funcția kmalloc() a fost asigurată randomizarea slab-cache-urilor, complicând exploatarea vulnerabilităților în nucleu.
- Din opțiunile legate de activarea sistemului de control al accesului SELinux, a fost eliminată mențiunea Agenției Naționale de Securitate a SUA. Deoarece proiectul s-a dezvoltat timp de 20 de ani sub auspiciile comunității și este susținut de mentori independenți, s-a decis trecerea la utilizarea numelui „SELinux” în loc de „NSA SELinux” în comentarii și documentație în Kconfig (de exemplu, explicația pentru parametrul de compilare SECURITY_SELINUX a fost schimbată de la „Suport NSA SELinux” la „Suport SELinux”).
- În apelul de sistem userfaultfd() a fost adăugată operația UFFDIO_POISON, care permite marcarea paginilor de memorie ca „otrăvite” (poisoned), ceea ce poate fi folosit pentru a muta paginile de memorie defecte în timpul migrației mașini virtuale de pe o sistem pe altul.
- În subsistemul VFIO a fost adăugat un nou interfață simbolic (\/dev\/vfio\/devices\/vfioX) pentru gestionarea dispozitivelor VFIO, permițând utilizatorului să deschidă direct fișierul cu dispozitivul, fără a apela la interfața de grup obosită \/dev\/vfio\/$groupID.
- În server NFS a încetat să mai suporte tipurile învechite de criptare Kerberos care utilizează algoritmi DES și 3DES.
- La lansarea în mediu de hipervizor Hyper-V, a fost adăugată suport pentru sisteme gazdă protejate prin tehnologia AMD SEV-SNP (Secure Nested Paging) și Intel TDX (Trusted Domain Extensions).
- La compilarea nucleului în mod «W=1», în compilatorul implicit au fost activate avertizările «-Wformat-overflow», «-Wformat-truncation», «-Wstringop-overflow» și «-Wrestrict». Pentru orice compilare, este activată avertizarea «-Wenum-conversion».
- Subsystema de rețea
- Implementarea familiei de adrese AF_XDP (eXpress Data Path) a fost extinsă pentru a permite lucrul cu pachete stocate în mai multe buffere (de exemplu, un buffer poate conține antetul pachetului, iar în altul datele sau într-un lanț de mai multe buffere pot fi plasate cadre mari Ethernet - jumbo frames). Programele care utilizează socketuri AF_XDP pot acum să primească și să transmită pachete din mai multe buffere simultan.
- În subsistemul BPF a fost adăugată suport pentru defragmentarea pachetelor IPv4 și IPv6, precum și posibilitatea de filtrare a pachetelor fragmentate.
- În BPF a fost adăugat un nou handler update_socket_protocol, care permite programelor BPF să modifice protocolul solicitat pentru noile socketuri. De exemplu, programul BPF poate înlocui transparent protocolul TCP cu MPTCP (multipath TCP) pentru a optimiza traficul aplicației. De asemenea, în BPF a fost adăugată suport pentru gestionarea rutării pachetelor prin diferite fluxuri în MPTCP.
- Eticheta de dezvoltare experimentală a fost eliminată de pe modulul ksmbd, care oferă o implementare a serverului de fișiere la nivel de nucleu bazată pe protocolul SMB3. A fost adăugat suport pentru combinarea operațiunilor de citire (solicită «read compound»).
- Echipament
- În subsistemul DRM (Direct Rendering Manager) au fost făcute modificări necesare pentru funcționarea eficientă a driverului deschis NVK cu implementarea API-ului grafic Vulkan pentru plăcile video NVIDIA. Inițial, driverul DRN Nouveau a fost conceput pentru implementarea OpenGL, astfel că îi lipsesc primitivele necesare pentru funcționarea eficientă a driverelor Vulkan, cum ar fi suportul pentru obiecte sincronizate și gestionarea spațiului de adresare virtuale.
- Driverul AMDGPU suportă SDMA 6.1.0, HDP 6.1, SMUIO 14.0, PSP 14.0, IH 6.1 și GFX 9.4.3. A fost refăcut codul de încărcare a firmware-ului PSP (Platform Security Processor). Suportul pentru tehnologia de sincronizare adaptivă FreeSync a fost extins (s-a adăugat suport pentru Freesync Panel Replay V2).
- Driverul i915 continuă implementarea suportului pentru cipurile Intel Meteor Lake. A fost îmbunătățit suportul pentru tehnologia de protecție împotriva copiantului HDCP (High-bandwidth Digital Content Protection). Codul pentru interacțiunea cu ecranul a fost refăcut.
- Opțiunile de dezactivare a încărcării microcodului în etapa de compilare au fost eliminate din Kconfig — MICROCODE_INTEL și MICROCODE_AMD. Kernelul este acum întotdeauna compilat cu codul de încărcare a microcodului pentru sistemele x86, dar încărcarea efectivă a microcodului poate fi dezactivată specificând parametrul kernel ‘dis_ucode_ldr’.
- Subsystema audio a primit capacitatea de a gestiona dispozitivele audio conectate prin subsystema IIO (Industrial I/O).
- A fost adăugat suport pentru interfețele audio Intel LunarLake, Intel ArrowLake și AMD ACP5x, codecurile Cirrus Logic CS42L43, Realtek RT1017 și TI TAS2781, precum și amplificatoarele Cirrus Logic CS35L56 și winic aw88261. A fost adăugat suport pentru ASoC AMD Van Gogh.
- A fost adăugat driverul USB MIDI 2.0 Gadget, care emulează interfața USB MIDI 2.0, legată de dispozitivul ALSA UMP rawmidi.
- A fost adăugat suport pentru controlerele Ethernet Broadcom ASP 2.0 și Marvell 88Q2XXX.
- A fost adăugat suport pentru panourile Visionox R66451, TDO TL050HDV35, KD070FHFID015, Inanbo T28CP45TN89 și EDT ET028013DMA, controalele de display Loongson și controalele pentru ecrane tactile Azoteq IQS7222D/IQS7210A/7211A.
- A fost adăugat suport pentru ARM SoC Qualcomm SM4450 (Snapdragon 4 Gen 2), TI AM62P5, Intel Agilex5, Qualcomm ipq5018, AN400 (Amlogic T7).
- A fost adăugat suport pentru plăcile ARM Samsung Galaxy Tab 3 8.0, FriendlyElec NanoPC T6, Amlogic A311D2, Khadas Vim4, Xiaomi SM7125, Facebook Yosemite 4, Orange Pi Zero 3, Radxa ROCK 4SE.
În același timp, Fondul Latino-American pentru Software Liber a creat o variantă complet liberă a kernel-ului 6.6 — Linux-libre 6.6-gnu, curățată de elementele de firmware și drivere care conțin componente sau porțiuni de cod ne-liberate, al căror domeniu de aplicare este limitat de către producător. În versiunea 6.6, codul de curățare a blob-urilor din diferite drivere și subsisteme a fost actualizat, de exemplu, în driverele TI gigabit RU ethernet, MediaTek 792x wifi, Cirrus Logic cs42l43 mfd, cs35l56 HD-audio și aw88261 SoC. A fost realizată curățarea numelui blob-urilor în fișierele dts pentru arhitectura Aarch64. Blob-urile din noile drivere ivpu, în driverele Bluetooth, în driverul pentru ecrane tactile și în encoderul/decoderul Qualcomm Venus V4L2 au fost eliminate.
Sursa: opennet.ro
