După două luni de dezvoltare, Linus Torvalds a prezentat lansarea kernelului Linux 6.8. Printre cele mai notabile schimbări se numără: driverul Xe pentru GPU Intel, modul de protecție a dispozitivelor de blocare cu sisteme de fișiere montate, mecanismul planificatorului de sarcini Deadline server, optimizarea automată a fuziunii paginilor de memorie identice, primul driver scris în Rust, apelurile de sistem listmount și statmount, eliminarea bpfilter și SLAB, mecanismul guest_memfd în KVM, profilarea accesului la date.
Noua versiune include 15641 de remedieri de la 2018 dezvoltatori, dimensiunea patch-ului fiind de 44 MB (modificările au afectat 12212 fișiere, au fost adăugate 663864 linii de cod, eliminate 339094 linii). În versiunea anterioară au fost 18405 de remedieri de la 2066 dezvoltatori, dimensiunea patch-ului fiind de 72 MB. Aproximativ 42% din toate modificările prezentate în 6.8 sunt legate de driverele de dispozitive, aproximativ 15% din modificări se referă la actualizarea codului specific arhitecturilor hardware, 14% sunt legate de stiva de rețea, 6% de sistemele de fișiere și 3% de subsistemele interne ale kernelului.
În Git-repozitoriu cu kernelul 6.8 există 9.996 milioane de obiecte, ceea ce indică faptul că următorul kernel 6.9 va depăși cota semnificativă de 10 milioane de obiecte git. Anterior, schimbarea numerelor ramurilor 3.x și 4.x a corelat bine cu numărul de obiecte git în repo — kernelul 3.0 a fost lansat când în repo erau aproximativ 2 milioane de obiecte, iar kernelul 4.0 — 4 milioane de obiecte. Cu toate acestea, în 2019, lansarea 5.0 a rupt această logică, deoarece la formarea sa repo includea aproximativ 6,5 milioane de obiecte git.
Principalele noutăți din kernelul 6.8:
- Subsistemul de disc, I/O și sistemele de fișiere
- A fost adăugat modul de blocare a scrierii directe pe dispozitivele de blocare care au sisteme de fișiere montate (după activarea modulului, utilizatorul root nu va putea face modificări în sistemul de fișiere prin manipulări la nivel de dispozitiv bloc). În mod implicit, modulul este dezactivat și necesită specificarea parametrului BLK_DEV_WRITE_MOUNTED la compilare. Pentru partițiile cu Btrfs, blocarea nu funcționează deocamdată, deoarece în codul Btrfs nu au fost acceptate modificările necesare.
- Au fost adăugate apelurile de sistem listmount() și statmount(), care permit din spațiul utilizatorului obținerea de informații detaliate despre sistemele de fișiere montate.
- În sistemul de fișiere XFS, s-a continuat lucrul asupra implementării posibilității de aplicare a utilitarului fsck pentru a verifica și a corecta problemele descoperite în modul online, fără a de-monta sistemul de fișiere.
- În Ext4, pentru blocuri de dimensiuni mai mici decât pagina de memorie, este utilizată apelul dioread_nolock, care îmbunătățește performanța prin eliminarea blocajelor inutile. Unele funcții au fost convertite pentru a folosi volumele de pagini de memorie (page folios).
- În Btrfs, a fost adăugată suportul pentru flag-ul de montare „nospace_cache” pentru dezactivarea cache-ului blocurilor libere. Unele funcții au fost convertite pentru a folosi volumele de pagini de memorie (page folios).
- Î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 suportul pentru compresia subpaginilor și a fost îmbunătățită funcționarea în situații de lipsă de memorie.
- În sistemul de fișiere F2FS, a fost îmbunătățit suportul pentru dispozitivele de stocare zonate (împărțirea în zone de grupuri de blocuri sau sectoare, în care se permite doar adăugarea secvențială a datelor cu actualizarea întregului grup de blocuri).
- Pentru FS SMB, a fost realizată posibilitatea de a crea fișiere de dispozitiv bloc și simbolice.
- În Bcachefs, a fost adăugat suport parțial pentru verificarea și recuperarea integrității sistemelor de fișiere montate.
- În subsistemul device-mapper, suportul pentru handler-ele MD_LINEAR, MD_MULTIPATH și MD_FAULTY a fost oprit, fiind declarate învechite în 2021.
- Memorie și servicii de sistem
- În subsistemul Zswap, a fost adăugată o opțiune activată în cazul lipsei de memorie, care permite descărcarea forțată în partiția de swap reală a paginilor de memorie „reci”, la care nu s-a făcut apel și care cel mai probabil vor rămâne neutilizate. Zswap realizează cache-ul paginilor care sunt înlocuite în partiția de swap, stocându-le în memorie RAM într-o formă comprimată, fără a le descărca în partiția de swap nespecificată pe disc. Modificările realizate în caz de lipsă de memorie permit reducerea dimensiunii pool-ului Zswap stocat în RAM și eliberarea memoriei sistemului.
- În Zswap, a fost propus un nou mod care dezactivează complet scrierea întârziată (writeback) în partiția de swap reală, dacă încercarea de scriere eșuează și nu descarcă deja paginile existente în pool-ul zswap în partiția de swap.
- În planificatorul de sarcini a fost adăugat mecanismul SCHED_DEADLINE server, care rezolvă problema neprimirii resurselor CPU de către sarcinile obișnuite în condițiile monopolizării CPU de către sarcinile de mare prioritate (realtime). Pentru a preveni monopolizarea CPU, în nucleu a fost utilizat anterior mecanismul de Realtime throttling, care încerca să rezerve 5% pentru sarcinile de prioritate mică, lăsând 95% din timp sarcinilor realtime. Acest mecanism lăsa de dorit, deoarece sarcinile obișnuite în multe situații nu primeau timpul procesorului. SCHED_DEADLINE server implementează un mecanism de rezervare a resurselor mai eficient.
- În subsistemul DAMON (Data Access MONitor), care permite monitorizarea accesului procesului la datele din memoria RAM (de exemplu, se poate afla la ce regiuni de memorie a avut acces procesul și ce regiuni de memorie au rămas neutilizate), a fost adăugat un mecanism de ajustare automată a agresivității consumului de memorie pe baza cotelor stabilite.
- A fost adăugată suportul pentru paginile de memorie mari cu dimensiuni variate (mTHP — multi-size Transparent Huge Pages), care permit alocarea memoriei în blocuri de dimensiuni mai mari decât pagina de bază, dar mai mici decât pagina tradițională THP.
- A fost adăugat suportul pentru folio-uri mari (page folios, pagini de memorie combinate) pentru memoria anonimă (nelegată de FS, de exemplu, alocată prin malloc). Această modificare vizează îmbunătățirea performanței prin alocarea unor porțiuni mari de memorie în timpul accesării paginilor de memorie nealocate (page faults). De exemplu, utilizarea folio-urilor mari a permis o reducere cu 5% a timpului de recompilare a nucleului (cu o reducere a timpului petrecut la nivelul nucleului cu 40%).
- Fișierului de configurare a nucleului a fost adăugat parametru TRANSPARENT_HUGEPAGE_NEVER, care oferă posibilitatea de a dezactiva utilizarea paginilor mari de memorie (Transparent Huge Pages).
- În apelul de sistem userfaultfd(), care permite crearea de gestionari pentru accesarea paginilor de memorie nealocate (page faults) în spațiul utilizatorului, a fost adăugată operația UFFDIO_MOVE, care permite, în timpul comprimării heap-ului, mutarea paginilor de memorie în spațiul virtual de adresare fără a efectua operația de alocare a paginii de memorie. În testele efectuate, utilizarea UFFDIO_MOVE a permis o reducere cu 40% a timpului de comprimare comparativ cu utilizarea operației UFFDIO_COPY.
- A fost adăugat mecanismul «KSM advisor», care permite optimizarea automată a parametrelor subsystemului pentru fuziunea paginilor de memorie identice (KSM — Kernel Samepage Merging).
- Transferul modificărilor din ramura Rust-for-Linux a continuat, legate de utilizarea limbajului Rust ca al doilea limbaj pentru dezvoltarea driverelor și modulelor nucleului (suportul pentru Rust nu este activat implicit și nu duce la includerea Rust în lista de dependențe de compilare ale nucleului). Noua versiune include modificări care adaugă un wrapper Rust peste nivelul de abstractizare phylib, utilizând acest wrapper, driverul ax88796b_rust, care asigură suportul pentru interfața PHY a controlerului Ethernet Asix AX88772A (100MBit). Funcționalitatea driverului pe Rust este complet echivalentă cu vechiul driver ax88796b, scris în limbajul C, și poate fi utilizat cu plăcile de rețea X-Surf 100, echipate cu cipul AX88796B. Pentru arhitectura LoongArch, a fost oferită posibilitatea scrierii modulelor în limbajul Rust. A fost efectuată trecerea la utilizarea versiunii Rust 1.74.1.
- A fost adăugat mecanismul BPF token, care permite delegarea selectivă a procesării unor capabilități BPF, precum încărcarea programului BPF sau crearea BPF map, către procese neprivilegiate în spațiul utilizatorului, a căror credibilitate este confirmată de un token special.
- Funcționalitatea verificatorului de programe BPF a fost extinsă.
- Utilitarul perf a adăugat suport pentru profilarea datelor, permițând urmărirea citirii și scrierii în structuri de date, de exemplu, în scopul identificării celor mai active câmpuri modificate în structuri. Pe sistemele cu procesoare care suportă colectarea informațiilor despre operațiile cu memorie (Intel, AMD, ARM), pentru acumularea statisticilor ar trebui folosită comanda „perf mem record”, iar pentru generarea unui raport despre accesările structurilor de date — „perf annotate —data-type”.
- A fost optimizată performanța procesării apelurilor de sistem pe arhitectura s390 (IBM Z), ceea ce a dus, în teste, la o accelerare a intrării în apelul de sistem de aproximativ 11%.
- A fost oferită posibilitatea modificării dimensiunii bufferelor de trasare, utilizate pentru tamponarea informațiilor despre evenimentele de trasare transmise în spațiul utilizatorului.
- Mecanismul de distribuție a memoriei SLAB, declarat anterior învechit, a fost eliminat. Acum, în nucleu se utilizează exclusiv SLUB. Cauzele menționate sunt problemele de întreținere, existența erorilor în cod și duplicarea funcționalităților cu un alocator mai avansat, SLUB.
- În timpul compilării nucleului, a fost activat flag-ul „-Wmissing-prototypes”, care generează avertismente pentru apelurile funcțiilor globale care nu au o definiție de prototip.
- Pentru arhitectura RISC-V, pe sistemele care suportă extensia SUSP, SBI a implementat suportul pentru trecerea în modul de așteptare cu păstrarea stării în RAM. A fost oferită posibilitatea utilizării apelului sistemului riscv_hwprobe() pentru a obține informații despre extensiile suportate ale arhitecturii setului de comenzi RISC-V.
- Virtualizare și securitate
- Au fost adăugate noi apeluri de sistem lsm_list_modules(), lsm_get_self_attr() și lsm_set_self_attr() pentru a afișa lista modulelor LSM (Linux Security Modules) încărcate și pentru a obține/seta atributele modulului LSM. A fost adăugată o nouă structură lsm_ctx pentru comunicarea în contextul LSM între spațiul utilizatorului și nucleu.
- Subsitma AppArmor a fost modificată pentru a utiliza algoritmul SHA-256 în verificarea regulilor, în loc de hash-urile SHA-1.
- Implementarea funcției strlcpy() a fost eliminată din nucleu, care a fost inclusă în biblioteca C Glibc 3.38. Strlcpy este o alternativă la funcția strncpy() care oferă protecție împotriva overflow-ului bufferului și asigură în mod obligatoriu terminarea șirului cu un byte zero.
- În hypervisor KVM a fost adăugat suport pentru subsistemul guest_memfd (memorie guest-first), care oferă funcții de gestionare a memoriei, permițând realizarea unor capacități și optimizări inaccesibile prin utilizarea subsistemului de gestionare a memoriei partajate. De exemplu, guest_memfd permite alocarea și reflectarea unei zone de memorie către sistemul guest, inaccesibilă mediului host, ceea ce poate fi folosit pentru a organiza calcule confidențiale.
- Pentru sistemele guest care rulează sub hypervisorul KVM, a fost activat suportul pentru modul LAM (Linear Address Masking) disponibil în procesoarele Intel, care permite utilizarea unei părți din biții adreselor de 64 de biți (de la 57 la 62) pentru stocarea de metadate nesusținute de adresare.
- Hypervisorul KVM pentru sistemele bazate pe arhitectura ARM64 a adăugat suport pentru adrese fizice de 52 de biți (LPA2). Pentru sistemele cu arhitectura x86, a fost oferită posibilitatea de a construi fără emularea apelurilor de hypervizor Hyper-V, ceea ce reduce dimensiunea kernel-ului.
- A fost adăugat driverul iaa (IAA Compression Accelerator) pentru accelerarea operațiunilor de comprimare și decomprimare a datelor prin metoda DEFLATE, utilizând caracteristicile acceleratorilor criptografici Intel Analytics Accelerator (IAA).
- Pe partea de mediu gazdă, s-a realizat suport pentru mecanismul Intel TDX (Trusted Domain Extensions), care permite, prin utilizarea hypervizorului KVM, crearea de medii de găzduire securizate, în care se folosește criptarea memoriei. mașini virtuale.
- În SELinux a fost adăugat identificatorul SID „init”, care permite evidențierea proceselor de pe etapele inițiale de bootare, lansate înainte de aplicarea politicilor SELinux. Interfața /sys/fs/selinux pentru gestionarea SELinux a fost îmbunătățită.
- Subsystema de rețea
- A fost efectuată o reoganizare de nivel jos a structurilor de date de rețea de bază, realizată pentru a crește eficiența cache-ului. Anterior, câmpurile din structurile stivei de rețea socks, netdev, netns și mibs erau plasate pe măsură ce erau adăugate, limitând utilizarea cache-ului procesorului. Revizuirea plasării variabilelor în structuri a dus la o creștere notabilă a vitezei de funcționare a TCP, datorită minimizării utilizării linii de cache în timpul transmiterii datelor și optimizării accesului la variabile. În cazurile de procesare a mai multor conexiuni TCP paralele, accelerarea poate atinge 40%.
- Subsystema bpfilter, care utilizează BPF pentru filtrarea pachetelor, a fost eliminată. Bpfilter a fost livrată începând cu versiunea 4.18, dar nu a fost niciodată adusă la un nivel adecvat pentru utilizarea pe scară largă. În ultimii ani, codul bpfilter din kernel nu a evoluat, iar dezvoltarea a continuat de către Facebook într-un repository separat.
- Echipament
- A fost inclus un nou driver 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. Driverul Xe este conceput ca baza pentru funcționarea noilor cipuri, fără legături cu codul pentru suportul platformelor vechi. Driverul este construit folosind o nouă arhitectură, în care se folosesc mai activ componentele existente ale subsistemului DRM, precum și componente standard ale driverului i915, independente de GPU-uri specifice, cum ar fi codul pentru interacțiunea cu ecranele, modelul de memorie și implementarea execbuf. În Mesa, funcționarea OpenGL și Vulkan deasupra driverului Xe este realizată la nivelul modificărilor aduse driverelor existente Mesa Iris și ANV.
- În driverul i915, s-a continuat implementarea suportului pentru cipurile Intel LunarLake (Xe 2). Suportul pentru cipurile Intel Meteor Lake a fost îmbunătățit.
- În driverul Nouveau, a fost implementată o setare pentru utilizarea implicită a funcțiilor de firmware GSP pentru lucrul cu GPU-uri NVIDIA bazate pe microarhitecturile Turing și Ampere, în care operațiunile de inițializare și control al GPU-ului sunt efectuate de un microcontroler GSP (GPU System Processor) separat. Odată activată setarea, driverul va funcționa prin accesarea firmware-ului, în loc de programarea directă a operațiunilor de interacțiune cu hardware-ul.
- În driverul AMDGPU, a fost implementat suport pentru ACPI WBRF și VPE DPM, a fost modificată gestionarea lățimii de bandă PCIe, în coezile utilizate pentru sincronizare au fost implicate numere de ordine de 64 de biți, a fost adăugat suport pentru mecanismele de control al culorii specifice AMD, iar problema legată de trecerea în modul de suspendare a fost rezolvată.
- A fost adăugată o implementare inițială a driverului pentru GPU Broadcom VideoCore 7.1, utilizat în plăcile Raspberry Pi 5.
- A fost adăugat un driver pentru GPU-urile din seria PowerVR 6 bazate pe microarhitectura Rogue de la Imagination Technologies.
- A fost adăugat suport pentru controladorii Thunderbolt/USB4, integrați în cipurile bazate pe microarhitectura Intel Lunar Lake.
- Au fost adăugate drivere pentru camerele utilizate în SoC Starfive, GalaxyCore GC2145/GC0308, Chips&Media Wave și THine THP7312.
- A fost adăugat suport pentru controlerele de joc NSO (Nintendo Switch Online) – variantele vechilor controlere de la SNES (Super Nintendo), Genesis și N64 (Nintendo 64), adaptate pentru Nintendo Switch. A fost adăugat un driver pentru gamepad-urile Adafruit Seesaw. În driverul xpad a fost adăugat suport pentru controlerele Lenovo Legion Go.
- În driverul dts a fost adăugată suport pentru dispozitivele de joc Powkiddy RK2023, Powkiddy X55 și Anbernic RG351V.
- Support for audio systems used in NXP i.MX8m MICFIL, Qualcomm SM8250, AMD ACP5x, Intel Arrow Lake, SM8550, SM8650, and X1E80100 chips has been added.
- Compania AMD a efectuat modificări legate de suportul pentru viitoarea serie de procesoare bazate pe noua microarhitectură Zen 5.
- A fost adăugat suport pentru SoC ARM64: Qualcomm SM8650 (Snapdragon 8 Gen 3), Qualcomm X1E80100 (Snapdragon X Elite), Samsung Exynos Auto v920, Google GS101 (Tensor G1), MediaTek MT8188 și Unisoc UMS9620 (Tanggula 7).
- A fost adăugat suport pentru plăci și dispozitive ARM: Huashan Pi, Microsoft Lumia, HTC One Mini 2, Motorola MotoG 4G, Huawei Honor 5X/GR5, Anbernic RG351V, Powkiddy RK2023, Powkiddy X55, ComXpress bazat pe Marvell CN913x, Chromebook Lenovo, Asus și Acer bazate pe Mediatek MT8183, Toradex Verdin AM62, plăci bazate pe Allwinner H616/H618.
- Support for ARM11 ARMv6K SMP processors has been discontinued.
În același timp, Fundația Software-ului Liber din America Latină a creat o variantă complet liberă a nucleului 6.8 — Linux-libre 6.8-gnu, curățată de elemente de firmware și drivere care conțin componente sau porțiuni de cod ne-libere, a căror utilizare este restricționată de producător. În versiunea 6.8 a fost actualizat codul de curățare a bloburilor în diferite drivere și subsisteme. A fost efectuată curățarea driverelor Intel qat_420xx, Imagination PowerVR, Intel Xe, Chips&Media Wave5, Intel VSC, Aquantia PHY și Realtek rtw8922a. Odată cu eliminarea din kernel, curățarea driverelor atmel, hermes, orinoco_usb, libertas_cs și zd1201 a fost oprită. A fost efectuată curățarea numelui bloburilor în fișierele dts (devicetree) pentru arhitecturile ARM și Aarch64. Problemele de curățare a driverului i915 au fost rezolvate.
Sursa: opennet.ro
