După două luni de dezvoltare, Linus Torvalds a lansat versiunea nucleului Linux 6.11. Printre cele mai notabile modificări se numără: suport pentru operații atomice de scriere la nivel de bloc, suport pentru operațiile bind() și listen() în io_uring, un nou mecanism de blocare pentru handlerii de întreruperi, posibilitatea de a scrie în fișiere executabile reflectate în memorie, suport pentru dezvoltarea driverelor pentru dispozitive de bloc în limbajul Rust, optimizarea apelului getrandom(), noua implementare AES-GCM.
Noua versiune conține 15130 de corecții de la 2078 de dezvoltatori, dimensiunea patch-ului fiind de 85 MB (modificările au afectat 13282 de fișiere, au fost adăugate 985857 de linii de cod și șterse 268915 de linii). În versiunea anterioară, au fost 14564 de corecții de la 1989 de dezvoltatori, dimensiunea patch-ului fiind de 41 MB (de două ori mai mică decât patch-ul pentru nucleul 6.11). Aproximativ 46% din toate modificările prezentate în 6.11 sunt legate de driverele dispozitivelor, aproximativ 17% din modificări se referă la actualizări de cod specific arhitecturilor hardware, 10% se leagă de stiva de networking, 5% de sistemele de fișiere și 3% de subsistemele interne ale nucleului.
Principalele noutăți din nucleul 6.11:
- Subsistemul de disc, I/O și sistemele de fișiere
- A fost implementat suportul pentru operații atomice de scriere la nivel de bloc, care permite scrierea fie a întregului set de blocuri specificat, fie a niciunui bloc, protejându-se astfel împotriva situațiilor în care, după o defecțiune hardware, este scrisă doar o parte din blocuri, iar în cealaltă parte rămâne informația veche. Pentru activarea modului atomic de scriere, a fost adăugat un flag RWF_ATOMIC la apelul de sistem pwritev(). Informațiile referitoare la suportul pentru scriere atomică (atomic_write_unit_min, atomic_write_unit_max și atomic_write_segments_max) în legătură cu fișierele individuale pot fi obținute prin funcția statx().
- A fost oferit suport pentru scrierea în fișiere executabile asociate cu procese aflate în execuție. Anterior, la fel ca în alte sisteme Unix-like, nucleul genera o eroare la încercarea de a scrie în fișierul executabil al unui proces care rulează. Această restricție a fost ridicată, deoarece era lipsită de sens practic.
- A fost implementată posibilitatea dezvoltării driverelor pentru dispozitive de bloc în limbajul Rust. Ca exemplu, s-a adăugat în nucleu un driver rnull, care reprezintă un analog al driverului null_blk, scris în limbajul Rust.
- În sistemul de fișiere Btrfs, opțiunea de montare „rescue=” a fost extinsă cu noi moduri „ignoremetacsums” și „ignoresuperflags”, care pot fi utilizate pentru a muta anumite verificări în spațiul utilizatorului în timpul recuperării sistemului de fișiere după o defecțiune. Implementarea operației de returnare dinamică a grupurilor de blocuri a fost reproiectată pentru a exclude apariția situației de lipsă de spațiu liber în condiții de umplere incompletă a sistemului de fișiere.
- În sistemul de fișiere ntfs3, a fost implementată suportul pentru atributele „compressed” și „immutable”, care definesc fișierele comprimate și nemodificabile.
- În sistemele de fișiere F2FS și Ext4, procesarea numelui fișierelor fără a ține cont de registru (casefold) a fost simplificată prin stocarea numelui sub formă de șiruri qstr fără transformări suplimentare ale registrului.
- În sistemul de fișiere Ext4, implementarea funcției jbd2_transaction_committed a fost optimizată pentru a îmbunătăți performanța pe unități de stocare foarte rapide (testele arată o creștere a operațiunilor procesate pe secundă de până la 20%).
- În apelul de sistem statx(), a fost permisă transmiterea unui pointer NULL în locul unui șir gol pentru calea fișierului, în cazul în care este setat flagul AT_EMPTY_PATH.
- În apelul de sistem open_by_handle_at(), verificările de permisiune pentru fișier au fost atenuate în cazul în care nu sunt disponibile privilegii CAP_DAC_READ_SEARCH pentru căutarea în spațiul de nume de bază. Anterior, cerința de a avea privilegii CAP_DAC_READ_SEARCH în spațiul de nume de bază nu permitea utilizarea apelului de sistem open_by_handle_at() în containere.
- Funcționalitatea apelurilor de sistem listmount() și statmount() a fost extinsă. În listmount() a fost adăugat flagul LISTMOUNT_REVERSE pentru a afișa conținutul tabelului punctelor de montare în ordine inversă (cele mai recente înregistrări în partea de sus). În statmount() a fost implementată afișarea opțiunilor setate la montarea sistemului de fișiere. În ambele apeluri de sistem, a fost permisă funcționarea fără acces la spațiul de nume de bază (când este disponibil doar accesul la spațiul de nume local sau extern).
- În sistemul de fișiere Bcachefs, a fost implementat suportul pentru recuperarea automată și transparentă a datelor problematice, folosind coduri de recuperare a erorilor — dacă apare o eroare de intrare/ieșire la citire sau se calculează o discrepanță de sumă de control, blocul problematic de date este rescris automat în prezența redundanței pentru a-l recupera.
- Memorie și servicii de sistem
- Au fost acceptate patch-uri cu implementarea unui nou mecanism de blocare a handlerelor de întrerupere (BH, bottom-half), care asigură blocarea structurilor de date utilizate, dar nu blochează execuția în paralel a codului nerelevant. Se observă că modificația a permis nu doar reducerea întârzierilor pentru nucleele care funcționează în mod real-time, ci și creșterea performanței nuclelor obișnuite (de exemplu, pentru anumite tipuri de sarcini, s-a observat o creștere a performanței subsistemului de rețea de 14,5%).
- În subsistemul de I/O asincron io_uring a fost adăugată suportul pentru operații ce implementează funcțiile bind() și listen(), folosite pentru a crea socketuri de rețea care primesc conexiuni.
- A fost adăugat un set de operații ioctl pentru pseudo-sistemul de fișiere NSFS (NameSpace FS), utilizat pentru a lucra cu spațiile de nume. Noile ioctl permit transformarea identificatorilor de procese și grupuri de fir între diferite spații de nume de identificatori de procese (PID namespace). Au fost adăugate și ioctl similare, care permit identificarea descriptorilor de fișiere ale proceselor în spațiile de nume, pe baza identificatorilor pidfd.
- Pentru programele BPF a fost adăugat suportul pentru un nou iterator pentru a lucra cu măști de biți, care poate fi utilizat, de exemplu, pentru a itera prin biți individuali în zonele de memorie, cum ar fi cpumask. A fost adăugat un mecanism pentru a trimite procesele din spațiul utilizatorului notificări despre deconectarea (detach/unregister) obiectului struct_ops. A fost extins spectrul de tipuri care pot fi utilizate în array-uri (de exemplu, acum se pot declara array-uri cu elemente de tipuri kptr, bpf_rb_root și bpf_list_head). A fost propus un mecanism mai robust Split BTF (BPF Type Format), utilizat pentru verificarea tipurilor în pseudocodul BPF.
- A fost adăugată o subsistemă care permite organizarea alimentării dispozitivelor într-o ordine specifică, în cazul în care un dispozitiv trebuie activat înaintea altuia (de exemplu, la activarea chip-urilor wireless pe platformele Qualcomm).
- A fost adăugat modulul „Sloppy logic analyzer”, care permite crearea de analizoare logice simple de semnal, folosind GPIO și funcționând pe un nucleu CPU separat.
- S-a adăugat suport pentru constante runtime care pot fi utilizate în locul variabilelor inițializate o singură dată. De exemplu, constantele runtime pot fi utilizate în locul variabilelor care stochează un pointer și dimensiunea pentru cache-ul dentry. Aceste variabile sunt stabilite în timpul încărcării și apoi nu se mai schimbă. Ideea este de a înlocui valorile acestor variabile direct în instrucțiunile din cod, eliminând costurile asociate cu manipularea pointerilor.
- Continuăm transferul modificărilor din ramura Rust-for-Linux, legate de utilizarea limbajului Rust ca al doilea limbaj pentru dezvoltarea driverelor și modulelor kernel (suportul Rust nu este activat implicit și nu duce la includerea Rust în dependențele de compilare obligatorii ale kernel-ului). S-a adăugat suport pentru versiunea Rust 1.80 (versiunea minimă acceptată rămâne Rust 1.78). Pe lângă instrumentele anterioare pentru dezvoltarea driverelor de dispozitive block, noua versiune adaugă abstracții pentru încărcarea firmware-ului, accesul la spațiul utilizatorului (uaccess) și lucrul cu structura 'page'.
- Pentru sistemele x86-64, a fost implementat un nou apel de sistem uretprobe(), care optimizează funcționarea mecanismului de trasare uretprobe, permițând urmărirea valorilor returnate de funcții în aplicațiile din spațiul utilizatorului.
- Au fost adăugate opțiuni de linie de comandă ale kernel-ului: „reserve_mem” pentru rezervarea unei zone de memorie denumite în timpul încărcării și „ramoops.mem_name” pentru utilizarea în zona de memorie pstore creată prin reserve_mem.
- În controlerul de memorie bazat pe cgroup, în fișierul memory.reclaim, prin care se definesc setările de eliminare a memoriei, a fost adăugat parametrul „swappiness”, care permite schimbarea echilibrului între derivarea paginilor de memorie anonime în swap și eliberarea paginilor de memorie ocupate de cache-ul de fișiere.
- A fost adăugat un interfață ioctl PROCMAP_QUERY pentru căutarea mai eficientă a domeniilor de memorie virtuală (Virtual Memory Area) în /proc/PID/maps.
- În apelul de sistem mmap() a fost adăugat un flag MAP_DROPPABLE pentru a solicita memorie care nu va fi niciodată eliminată în swap, iar în cazul lipsei de memorie poate fi ștearsă.
- Pentru arhitectura ARM64, a fost implementat suportul pentru conectarea la cald (comutarea între modurile online/offline) a CPU-urilor fizice și virtuale pe sistemele cu ACPI.
- Pentru arhitectura RISC-V, a fost asigurată suport pentru conectarea din mers a memoriei și a fost adăugat suport pentru pluginul GCC STACKLEAK (care inițializează toate variabilele stocate în stivă pentru a preveni scurgerile de informații din nucleu prin variabile neinițializate care pot conține resturi de date salvate anterior în stivă).
- Mecanismul de mapare falsă a memoriei EFI (fake EFI memory map) a fost eliminat în timpul inițializării. Acest mecanism nu a fost utilizat în practică și a împiedicat dezvoltările în domeniul execuției confidențiale. mașini virtuale.
- Suportul pentru platforma PowerPC 40x a fost întrerupt.
- Cerințele pentru versiunea GNU Make au fost crescute — pentru compilarea nucleului este necesar cel puțin o versiune GNU Make publicată în 2013.
- Virtualizare și securitate
- Au fost integrate patch-uri care accelerează semnificativ (de până la 15 ori) obținerea de numere aleatorii prin apelul de sistem getrandom(). Optimizarea se bazează pe utilizarea mecanismului vDSO (virtual dynamic shared object), care permite transferarea gestionării apelului de sistem din nucleu în spațiul utilizatorului și evitarea schimbărilor de context. Implementarea apelului de sistem este încărcată direct în spațiul de adresă al procesului de către nucleu.
- Pentru sistemele x86-64, a fost inclusă o nouă implementare a algoritmului de criptare AES-GCM, care suportă utilizarea instrucțiunilor vectoriale VAES, VPCLMULQDQ și AVX512/AVX10 pentru accelerarea calculului. Testele efectuate au arătat o creștere a performanței de până la 156% după trecerea la noua implementare. Implementarea în asamblare a AES-GCM a fost complet rescrisă luând în considerare corectitudinea, performanța, dimensiunea și documentarea exhaustivă a codului.
- A fost implementată posibilitatea de a rula nucleul ca sistem invitat în medii virtualizate care folosesc extensia de procesor AMD SEV-SNP (Secure Nested Paging), destinată să asigure funcționarea în siguranță cu tabele de pagini de memorie imbricate. Pentru o izolare suplimentară a accesului la resurse din mașinile virtuale, poate fi utilizat modulul SVSM (Linux Secure VM Service Module). KVM A fost adăugat suport inițial pentru rularea sistemelor invitate protejate prin AMD SEV-SNP.
- A fost adăugat un allocator slab bucket separat, activat prin parametrul CONFIG_SLAB_BUCKETS, care asigură protecție împotriva atacurilor folosind tehnica „heap spraying”.
- În hypervizorul KVM a fost adăugat un apel ioctl pentru alocarea anticipată a memoriei pentru sistemul invitat, înainte de lansarea efectivă a acestuia.
- Subsystema de rețea
- A fost adăugat parametrul sysctl net.tcp_rto_min_us, prin care se poate configura timpul minim de așteptare pentru retransmiterea (retransmission timeout) pentru conexiunile TCP.
- Utilitarul ethtool a fost îmbunătățit cu o opțiune de ajustare fină a configurației manipulatoarelor de întreruperi pentru interfețele de rețea care utilizează interfața Net DIM.
- Echipament
- În driverul AMDGPU a fost activată suportul inițial pentru GPU AMD RDNA4 („GFX12”). A fost adăugată suportul pentru tehnologiile DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 și MMHUB 4.1.
- Continuăm lucrările la driverul drm (Direct Rendering Manager) Xe pentru GPU-uri bazate pe arhitectura Intel Xe, care sunt folosite în plăcile grafice Intel din seria Arc și în grafica integrată, începând cu procesoarele Tiger Lake. Suportul pentru GPU-uri bazate pe microarhitecturile Battlemage, Arrow Lake și Lunar Lake a fost îmbunătățit.
- În subsistemul DRM (Direct Rendering Manager) a fost rescris handler-ul pentru parametrii EDID (Extended Display Identification Data) furnizați de monitor.
- Driverul i915 a fost actualizat pentru a include suport pentru GPU Battlemage Xe2 și modul CMRR (Content Match Refresh Rate) a fost activat implicit.
- În driverul DRM msm (GPU Qualcomm Adreno) a fost adăugat suport pentru platforma SM7150 și GPU X185 și a505.
- A fost adăugat suport pentru panourile de display Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
- În subsistemul audio a fost adăugat suport pentru cipurile și codec-urile Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 și Texas Instruments PCM5242.
- Au fost implementate modificările finale care oferă suport pentru ARM SoC Snapdragon X Elite, care utilizează un CPU Qualcomm Oryon cu 12 nuclee și GPU Qualcomm Adreno. Chip-ul este destinat utilizării în laptopuri și PC-uri și depășește în multe teste de performanță cipurile Apple M3 și Intel Core Ultra 155H. Modificările adăugate în kernelul 6.11 sunt legate de suportul pentru GPU Adreno X1-85 și gestionarea consumului de energie. Laptopurile ASUS Vivobook S15 și Lenovo Yoga Slim7x sunt anunțate ca fiind bazate pe SoC Snapdragon X Elite.
La Fundación Latina pentru Software Liber a dezvoltat simultan o variantă complet liberă a nucleului 6.11 — Linux-libre 6.10-gnu, curățată de elemente de firmware și drivere care conțin componente nesigure sau porțiuni de cod, utilizarea cărora este limitată de producător. În versiunea 6.11, codul de curățare a blob-urilor în driverele mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth și tas2781 a fost actualizat. A fost efectuată curățarea noilor drivere amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 și pcie-rcar-gen4. A fost realizată curățarea denumirilor blob-urilor în fișierele dts (devicetree) pentru arhitectura Aarch64. A fost adăugată o versiune a primitivului pentru încărcarea firmware-ului care nu generează avertizări și solicitări (nowait-nowarn). A fost adăugat cod pentru a detecta primitivii de încărcare a firmware-ului în codul scris în Rust.
Sursa: opennet.ro
