După două luni de dezvoltare, Linus Torvalds a prezentat versiunea kernel-ului Linux 5.18. Printre cele mai notabile schimbări se numără: o curățare extinsă a funcționalităților depășite, declararea sistemului de fișiere Reiserfs ca fiind învechit, implementarea evenimentelor de urmărire a proceselor utilizator, adăugarea suportului pentru mecanismul de blocare a exploiturilor Intel IBT, activarea modului de detectare a overflow-ului buffer-ului în utilizarea funcției memcpy(), adăugarea unui mecanism de urmărire a apelurilor funcțiilor fprobe, îmbunătățirea performanței planificatorului de sarcini pe CPU AMD Zen, includerea unui driver pentru gestionarea funcționalității CPU Intel (SDS), integrarea unor patch-uri pentru restructurarea fișierelor header și aprobată aplicarea standardului C11.
Noua versiune include 16.206 de corecții din partea a 2.127 de dezvoltatori (în versiunea anterioară erau 14.203 corecții de la 1.995 de dezvoltatori), dimensiunea patch-ului fiind de 108 MB (modificările au afectat 14.235 de fișiere, fiind adăugate 1.340.982 de linii de cod și șterse 593.836 de linii). Aproximativ 44% din toate modificările din 5.18 sunt legate de driverele de dispozitive, aproximativ 16% se referă la actualizarea codului specific arhitecturilor hardware, 11% sunt legate de stiva de rețea, 3% de sistemele de fișiere și 3% de subsistemele interne ale kernel-ului.
Principalele nouăți din kernel 5.18:
- Subsistemul de disc, I/O și sistemele de fișiere
- În sistemul de fișiere Btrfs a fost adăugat suportul pentru transmiterea datelor compresate în timpul operațiunilor send și receive. Anterior, utilizarea send/receive implica ca partea emitentă să dezarhiveze datele stocate în format comprimat, în timp ce partea receptor recontraia înainte de a scrie. În kernel 5.18, aplicațiile din spațiul utilizator care utilizează apelurile send/receive au acum posibilitatea de a transmite date comprimate fără reambalare. Funcționalitatea a fost implementată prin noi operațiuni ioctl BTRFS_IOC_ENCODED_READ și BTRFS_IOC_ENCODED_WRITE, care permit citirea și scrierea directă a informațiilor în extent.
În plus, în Btrfs a fost îmbunătățită performanța fsync. A fost adăugată posibilitatea de deduplicare și executare a reflink (clonarea metadatelor fișierului cu crearea unei legături către datele deja existente, fără a le copia efectiv) pentru întreaga stocare, fără a se limita la punctele de montare.
- În modul de acces direct (Direct I/O), este posibilă accesarea fișierelor criptate utilizând fscrypt pentru criptare inline, în care operațiile de criptare și decriptare sunt realizate de controlerul de stocare, nu de nucleu. În cazul criptării de către nucleu, accesul la fișierele criptate prin Direct I/O rămâne imposibil, deoarece accesul la fișiere se face ocolind mecanismul de bufferare din nucleu.
- Pe serverul NFS, suportul pentru protocolul NFSv3 este activat implicit, fără a necesita o activare separată, fiind disponibil cu activarea generală a NFS. NFSv3 este considerat versiunea principală și întotdeauna suportată a NFS, iar suportul pentru NFSv2 ar putea fi întrerupt în viitor. Eficiența citirii conținutului directorilor a fost semnificativ crescută.
- Sistemul de fișiere ReiserFS a fost clasificat ca fiind învechit și va fi eliminat în 2025. Clasificarea ReiserFS ca învechit va reduce eforturile de întreținere a modificărilor comune pentru sistemele de fișiere legate de suportul pentru noul API de montare, iomap și foliante.
- Pentru FS F2FS, a fost implementată posibilitatea de mapare a identificatorilor utilizatorilor pentru sistemele de fișiere montate, folosită pentru a asocia fișierele unui anumit utilizator pe o partiție străină cu un alt utilizator din sistemul curent.
- Codul pentru calcularea statisticilor în gestionarii Device-mapper a fost refăcut, ceea ce a permis creșterea semnificativă a acurateței contorizării în astfel de gestionari, cum ar fi dm-crypt.
- Pentru dispozitivele NVMe, a fost implementat suportul pentru sume de control pe 64 de biți pentru verificarea integrității.
- Pentru sistemul de fișiere exfat, a fost propusă o nouă opțiune de montare "keep_last_dots", care interzice ștergerea punctelor de la sfârșitul numelui fișierului (în Windows, punctele de la sfârșitul numelui sunt șterse implicit).
- În EXT4, performanța modulului fast_commit a fost îmbunătățită și scalabilitatea a fost crescută. Opțiunea de montare "mb_optimize_scan", care îmbunătățește performanța în condiții de fragmentare mare a FS, a fost adaptată pentru a funcționa cu fișiere cu extenturi.
- Suportul pentru fluxurile de scriere (write stream) a fost oprit în subsistemul care asigură funcționarea dispozitivelor bloc. Această capacitate a fost propusă pentru SSD-uri, dar nu a fost adoptată și în prezent nu există dispozitive care să suporte acest mod, iar apariția lor în viitor este puțin probabilă.
- În sistemul de fișiere Btrfs a fost adăugat suportul pentru transmiterea datelor compresate în timpul operațiunilor send și receive. Anterior, utilizarea send/receive implica ca partea emitentă să dezarhiveze datele stocate în format comprimat, în timp ce partea receptor recontraia înainte de a scrie. În kernel 5.18, aplicațiile din spațiul utilizator care utilizează apelurile send/receive au acum posibilitatea de a transmite date comprimate fără reambalare. Funcționalitatea a fost implementată prin noi operațiuni ioctl BTRFS_IOC_ENCODED_READ și BTRFS_IOC_ENCODED_WRITE, care permit citirea și scrierea directă a informațiilor în extent.
- Memorie și servicii de sistem
- A început integrarea unui set de patch-uri care permite o reducere semnificativă a timpului de recompilare a nucleului prin restructurarea ierarhiei fișierelor header și reducerea numărului de dependențe încrucișate. În nucleul 5.18 au fost incluse patch-uri care optimizează structura fișierelor header ale planificatorului de sarcini (kernel/sched). Comparativ cu versiunea anterioară, consumul de timp de procesor la compilarea codului kernel/sched a scăzut cu 61%, iar timpul efectiv a fost redus cu 3,9% (de la 2,95 la 2,84 secunde).
- În codul nucleului a fost permisă utilizarea standardului C11, publicat în 2011. Codul adăugat anterior în nucleu trebuia să respecte specificația ANSI C (C89), formulată încă din 1989. În scripturile de compilare ale nucleului 5.18, opțiunea ‘—std=gnu89’ a fost înlocuită cu ‘—std=gnu11 -Wno-shift-negative-value’. A fost luată în considerare posibilitatea utilizării standardului C17, dar în acest caz ar fi fost necesară creșterea versiunii minime acceptate a GCC, deși includerea suportului pentru C11 se încadrează în cerințele curente pentru versiunea GCC (5.1).
- Performanța planificării sarcinilor pe procesoarele AMD cu microarhitectură Zen a fost îmbunătățită, având în vedere că pentru fiecare nod cu canale locale de memorie sunt furnizate mai multe cache-uri de ultim nivel (LLC, Last Level Cache). În noua versiune, a fost corectată dezechilibrul LLC între nodurile NUMA, ceea ce, în unele tipuri de sarcini, a dus la o creștere semnificativă a performanței.
- Unelte pentru trasarea aplicațiilor în spațiul utilizatorului au fost extinse. În noua versiune a nucleului, a fost adăugată capacitatea proceselor utilizatorului de a crea evenimente de trasare (User events) și de a înregistra date în bufferul de trasare, care pot fi vizualizate prin utilitare de trasare de tip kernel, cum ar fi ftrace și perf. Evenimentele de trasare din spațiul utilizatorului sunt izolate de evenimentele de trasare ale nucleului. Starea evenimentelor poate fi vizualizată prin fișierul /sys/kernel/debug/tracing/user_events_status, iar înregistrarea unui eveniment și înregistrarea datelor se face prin fișierul /sys/kernel/debug/tracing/user_events_data.
- A fost adăugat un mecanism de urmărire (probe) a apelurilor de funcții — fprobe. API-ul fprobe se bazează pe ftrace, dar este limitat doar la capacitatea de a atașa callback-uri la punctele de intrare și ieșire ale funcției. Spre deosebire de kprobes și kretprobes, noul mecanism permite utilizarea unui singur handler pentru mai multe funcții simultan.
- Suportul pentru vechile procesoare ARM (ARMv4 și ARMv5), care nu sunt echipate cu unități de gestionare a memoriei (MMU), a fost întrerupt. Suportul pentru sistemele ARMv7-M fără MMU este menținut.
- Suportul pentru arhitectura de tip RISC NDS32, utilizată în procesoarele companiei Andes Technologies, a fost întrerupt. Codul a fost eliminat din cauza lipsei de întreținere și nevoii reduse de suport NDS32 în nucleul principal al Linux (utilizatorii rămași folosesc versiuni specializate ale nucleului oferite de producătorii de hardware).
- Construcția nucleului cu suport pentru formatul de fișiere executabile a.out pentru arhitecturile alpha și m68k, în care acest format este încă folosit, este dezactivată în mod implicit. Este posibil ca suportul pentru formatul învechit a.out să fie eliminat complet din nucleu în curând. Planurile de eliminare a formatului a.out sunt discutate din 2019.
- Pentru arhitectura PA-RISC, a fost implementat un suport minim pentru mecanismul vDSO (virtual dynamic shared objects), care oferă un set limitat de apeluri de sistem accesibile în spațiul utilizatorului fără comutarea contextului. Suportul vDSO a permis posibilitatea execuției cu un stivă neexecutabilă.
- A fost adăugat suportul pentru mecanismul Intel HFI (Hardware Feedback Interface), care permite hardware-ului să transmită nucleului informații despre performanța curentă și eficiența energetică a fiecărui CPU.
- A fost adăugat un driver pentru mecanismul Intel SDSi (Software-Defined Silicon), care permite gestionarea activării unor funcționalități suplimentare în procesor (de exemplu, instrucțiuni specializate și memorie cache suplimentară). Ideea este că cipurile cu funcționalități extinse blocate pot fi livrate la un preț mai mic, iar acestea pot fi apoi «achiziționate» și activate fără a necesita înlocuirea hardware-ului.
- A fost adăugat driverul amd_hsmp pentru suportul interfeței AMD HSMP (Host System Management Port), care oferă acces la funcțiile de gestionare a procesorului printr-un set special de registre, apărute în procesoarele server AMD EPYC începând cu generația Fam19h. De exemplu, prin HSMP se pot obține date despre consumul de energie și temperatură, se pot stabili limite de frecvență, activa diferite moduri de creștere a performanței și gestiona parametrii de funcționare a memoriei.
- În interfața de intrare/ieșire asincronă io_uring a fost implementată opțiunea IORING_SETUP_SUBMIT_ALL pentru înregistrarea într-un buffer circular a unui set de descriptorii de fișiere, precum și operația IORING_OP_MSG_RING, care permite trimiterea unui semnal dintr-un buffer circular în alt buffer circular.
- În mecanismul DAMOS (Data Access Monitoring-based Operation Schemes), care permite eliberarea memoriei în funcție de frecvența accesării acesteia, au fost extinse capacitățile de control asupra operațiunilor de memorie din zona utilizatorului.
- A fost integrată a treia serie de patch-uri cu implementarea conceptului de folio-uri de memorie (page folios), care sunt asemănătoare cu paginile de memorie combinate (compound pages), dar se deosebesc prin semantică îmbunătățită și o organizare mai clară a funcționării. Utilizarea folio-urilor permite accelerarea gestionării memoriei în anumite subsisteme ale nucleului. În patch-urile propuse a fost efectuată tranziția la folio-uri a funcțiilor interne de gestionare a memoriei, inclusiv variantele funcției get_user_pages(). A fost oferit suport pentru crearea de folio-uri mari în codul de citire anticipată a datelor.
- În sistemul de construire a fost adăugată suportul pentru variabilele de mediu USERCFLAGS și USERLDFLAGS, prin care se pot transmite flage suplimentare compilatorului și linker-ului.
- În subsistemul eBPF, în mecanismul BTF (BPF Type Format), care oferă informații pentru verificarea tipurilor în pseudocodul BPF, a fost implementată posibilitatea de a adăuga note la variabile care fac referire la zonele de memorie din spațiul utilizatorului. Notările ajută sistemul de verificare BPF să identifice și să verifice mai calitativ accesurile la memorie.
- A fost propus un nou handler pentru alocarea memoriei pentru stocarea programelor BPF încărcate, care permite o utilizare mai eficientă a memoriei în situații de încărcare a unui număr mare de programe BPF.
- În apelul de sistem madvise(), a fost adăugat un flag MADV_DONTNEED_LOCKED, care completează deja existentul flag MADV_DONTNEED, prin care nucleul poate fi informat din timp despre eliberarea unui bloc de memorie, adică despre faptul că acest bloc nu mai este necesar și poate fi utilizat de nucleu. Spre deosebire de MADV_DONTNEED, utilizarea flagului MADV_DONTNEED_LOCKED este permisă pentru paginile de memorie blocate în RAM, care, la apelul madvise, sunt înlocuite fără a-și schimba statutul de blocare, iar în cazul unei accesări ulterioare a blocului și generării unui „page fault”, sunt returnate cu păstrarea legăturii. De asemenea, a fost adăugat o modificare care permite utilizarea flagului MADV_DONTNEED cu pagini mari de memorie în HugeTLB.
- Virtualizare și securitate
- Pentru arhitectura x86, a fost adăugată suport pentru mecanismul de protecție a fluxului de execuție Intel IBT (Indirect Branch Tracking), care împiedică utilizarea tehnicilor de exploitare bazate pe programarea orientată pe returnare (ROP, Return-Oriented Programming), în care exploitul este format sub formă de lanțuri de apeluri ale porțiunilor de instrucțiuni deja existente în memorie, care se termină cu o instrucțiune de returnare a controlului (de obicei, acestea sunt sfârșiturile funcțiilor). Esența metodei de protecție implementate constă în blocarea salturilor indirecte către corpul funcției prin adăugarea, la începutul funcției, a unei instrucțiuni speciale ENDBR și permiterea executării prin salt indirect doar în cazul în care se sărindă la această instrucțiune (apelurile indirecte prin JMP și CALL trebuie să ajungă întotdeauna la instrucțiunea ENDBR, care este plasată chiar la începutul funcției).
- A fost activată o verificare mai strictă a limitelor bufferelor în funcțiile memcpy(), memmove() și memset(), efectuată în timpul compilării atunci când este activat modul CONFIG_FORTIFY_SOURCE. Modificarea adăugată se reduce la verificarea ieșirii din limitele elementelor structurilor, ale căror dimensiuni sunt cunoscute. Se subliniază că această implementare ar permite blocarea tuturor supraaglomerărilor de buffer asociate cu memcpy() în nucleu, identificate cel puțin în ultimii trei ani.
- A fost adăugată a doua parte a codului pentru implementarea actualizată a generatorului de numere pseudo-aleatoare RDRAND, care este responsabil pentru funcționarea dispozitivelor /dev/random și /dev/urandom. Noua implementare este remarcabilă prin unificarea funcționării /dev/random și /dev/urandom, adăugând protecție împotriva apariției duplicatelor în fluxul de numere aleatorii la pornire. mașini virtuale și trecerea la utilizarea funcției hash BLAKE2s în loc de SHA1 pentru operațiile de amestecare a entropiei. Această modificare a sporit securitatea generatorului de numere pseudo-aleatoare, eliminând algoritmul problematic SHA1 și excluzând rescrierea vectorului de inițializare RNG. Deoarece algoritmul BLAKE2s depășește SHA1 în performanță, utilizarea sa a avut, de asemenea, un impact pozitiv asupra performanței.
- Pentru arhitectura ARM64 a fost adăugată suport pentru un nou algoritm de autentificare a pointerelor — „QARMA3”, care este mai rapid decât algoritmul QARMA, menținând un nivel adecvat de protecție. Tehnologia permite utilizarea instrucțiunilor specializate ARM64 pentru verificarea adreselor de întoarcere prin semnături digitale, care sunt stocate în biții superioare neutilizați ai pointerului însuși.
- Pentru arhitectura ARM64 a fost implementat suportul pentru compilarea cu activarea în GCC 12 a modului de protecție împotriva rescrierii adresei de întoarcere din funcție în cazul unui overflow al buffer-ului pe stivă. Esența protecției constă în salvarea, după predarea controlului unei funcții, a adresei de întoarcere într-o stivă „umbrită” separată și extragerea acestei adrese înainte de ieșirea din funcție.
- A fost adăugat un nou depozit de chei (keyring) — „machine”, care conține cheile proprietarului sistemului (MOK, Machine Owner Keys), acceptate în bootloader-ul shim. Cheile specificate pot fi folosite pentru a semna digital componentele nucleului care sunt încărcate în etapa de după încărcarea inițială (de exemplu, modulele nucleului).
- A fost eliminat suportul pentru cheile private asimetrice pentru TPM, care au fost propuse în versiunea veche a TPM, au probleme de securitate cunoscute și nu au avut o adoptare semnificativă în practică.
- A fost adăugată protecția datelor de tip size_t împotriva overflow-urilor întregi. În cod sunt utilizate handler-e size_mul(), size_add() și size_sub(), care permit efectuarea în siguranță a înmulțirii, adunării și scăderii dimensiunilor de tip size_t.
- În cadrul compilării nucleului, au fost incluse flagurile '-Warray-bounds' și '-Wzero-length-bounds', care generează avertismente atunci când un index depășește limitele unui tablou sau când se utilizează tablouri de lungime zero.
- Dispozitivul virtio-crypto a primit suport pentru criptarea folosind algoritmul RSA.
- Subsystema de rețea
- În implementarea podurilor de rețea a fost adăugat suport pentru modul de blocare a porturilor (locked mode), în care utilizatorul poate trimite trafic printr-un port doar cu adresa MAC permisă. De asemenea, a fost posibilă utilizarea mai multor structuri pentru evaluarea stării protocolului STP (Spanning Tree Protocol). Anterior, pentru VLAN se putea face doar o legare directă la STP (1:1), în care fiecare VLAN era gestionat independent. În noua versiune a fost adăugat parametrul mst_enable, care, atunci când este activat, permite monitorizarea stării VLAN-urilor prin modulul MST (Multiple Spanning Trees), iar legăturile VLAN-urilor pot corespunde modelului M:N.
- A fost continuată munca de integrare în stiva de rețea a unor instrumente pentru monitorizarea cauzelor respingerii pachetelor (codes reason). Codul motivului este transmis în timpul eliberării memoriei asociate cu pachetul și permite luarea în considerare a unor situații, cum ar fi respingerea unui pachet din cauza erorilor de completare a câmpurilor din antet, detectarea spoofing-ului de către filtrul rp_filter, checksum invalid, lipsa de memorie, activarea regulilor IPSec XFRM, număr de secvență TCP greșit etc.
- A fost oferită posibilitatea de a transmite pachete de rețea din programe BPF, executate din spațiul utilizatorului în modul BPF_PROG_RUN, în care programele BPF sunt rulate în nucleu, dar returnează rezultatul în spațiul utilizatorului. Pachetele sunt transmise utilizând subsistemul XDP (eXpress Data Path). Este suportat modul live de procesare a pachetelor, în care handler-ul XDP poate redirecționa în timp real pachetele de rețea în stiva de rețea sau către alte dispozitive. De asemenea, este posibilă crearea de generatoare de trafic extern sau amortizarea cadrelor de rețea în stiva de rețea.
- Pentru programele BPF, atașate la cgroups rețea, au fost propuse funcții auxiliare pentru setarea explicită a valorii returnate de apelurile de sistem, ceea ce permite transmiterea unor informații mai complete despre cauzele blocării apelului de sistem.
- În subsistemul XDP (eXpress Data Path) a fost adăugată suport pentru pachete fragmentate, plasate în mai multe bufere, permițând procesarea cadrelor Jumbo în XDP și aplicarea TSO/GRO (TCP Segmentation Offload/Generic Receive Offload) pentru XDP_REDIRECT.
- Procesul de eliminare a spațiilor de nume de rețea a fost semnificativ accelerat, ceea ce a fost solicitat în unele sisteme mari cu un volum mare de trafic.
- Echipament
- În driverul amdgpu, tehnologia de sincronizare adaptivă FreeSync este activată prin default, permițând corectarea frecvenței de actualizare a informațiilor pe ecran, asigurând fluiditate și absența tăieturilor de imagine în timpul jocurilor și vizionării video. A fost anunțat suport stabil pentru GPU Aldebaran.
- În driverul i915 a fost adăugat suport pentru cipurile Intel Alderlake N și plăcile grafice discrete Intel DG2-G12 (Arc Alchemist).
- În driverul nouveau a fost asigurat suport pentru rate de bit mai mari pentru interfețele DP/eDP și suport pentru extensiile de cablu lttprs (Link-Training Tunable PHY Repeaters).
- În subsistemul drm (Direct Rendering Manager) în driverele armada, exynos, gma500, hyperv, imx, ingenic, mcde, mediatek, msm, omap, rcar-du, rockchip, sprd, sti, tegra, tilcdc, xen și vc4 a fost adăugat suport pentru parametrul nomodeset, permițând dezactivarea comutării modurilor video la nivel de kernel și utilizarea resurselor pentru accelerarea hardware a redării, lăsând doar funcționalitatea legată de framebufferul sistemului.
- A fost adăugat suport pentru SoC ARM Qualcomm Snapdragon 625/632 (utilizat în smartphone-urile LG Nexus 5X și Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (utilizat în Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (tabletă Prestigio PMT5008 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD, TI K3/AM62 și i.MXRTxxxx.
- A fost adăugat suport pentru dispozitivele ARM și plăcile Broadcom (Raspberry Pi Zero 2 W), Qualcomm (Google Herobrine R1 Chromebook, SHIFT6mq, Samsung Galaxy Book2), Rockchip (Pine64 PineNote, Bananapi-R2-Pro, STM32 Emtrion emSBS, Samsung Galaxy Tab S, tabletă Prestigio PMT5008 3G), Allwinner (A20-Marsboard), Amlogic (Amediatek X96-AIR, CYX A95XF3-AIR, Haochuangy H96-Max, Amlogic AQ222 și OSMC Vero 4K+), Aspeed (Quanta S6Q, ASRock ROMED8HM3), Marvell MVEBU/Armada (Ctera C200 V1 și V2 NAS), Mstar (DongShanPiOne, Miyoo Mini), NXP i.MX (Protonic PRT8MM, emCON-MX8M Mini, Toradex Verdin, Gateworks GW7903).
- A fost adăugat suport pentru sisteme audio și codecuri AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek MT8181, nVidia Tegra234, Qualcomm SC7280, Renesas RZ/V2L, Texas Instruments TAS585M. A fost implementată o versiune inițială a driverului audio pentru chipul DSP Intel AVS. Suportul pentru drivere pentru Intel ADL și Tegra234 a fost actualizat, de asemenea, au fost efectuate modificări pentru îmbunătățirea suportului audio pe dispozitivele Dell, HP, Lenovo, ASUS, Samsung și Clevo.
În același timp, Fondul Latino-American de Software Liber a format o variantă complet liberă a nucleului 5.18 — Linux-libre 5.18-gnu, curățată de elemente de firmware și drivere care conțin componente sau secțiuni de cod ne-libere, ale căror domenii de aplicare sunt limitate de producător. În această nouă versiune, au fost curățate driverele pentru panourile MIPI DBI, VPU Amphion, WiFi MediaTek MT7986 WMAC, Mediatek MT7921U (USB) și Realtek 8852a/8852c, cipurile audio Intel AVS și Texas Instruments TAS5805M. De asemenea, au fost curățate fișierele DTS pentru diferite SoC Qualcomm cu procesoare bazate pe arhitectura AArch64. Codul de curățare a blob-urilor în driverele și subsistemele AMD GPU, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectru Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART a fost, de asemenea, actualizat.
Sursa: opennet.ro
