Efter två månaders utveckling presenterade Linus Torvalds releasen av Linux 6.9-kärnan. Bland de mest anmärkningsvärda förändringarna: dm-vdo-modulen för deduplicering och komprimering av blockenheter, direkt filåtkomstläge i FUSE, stöd för att skapa pidfds för enskilda trådar, BPF-tokenmekanismen, stöd för Rust på ARM64-system, utfasning av Ext2 filsystem, borttagning av gammal NTFS-drivrutin, stöd för Intel FRED-mekanism.
Den nya versionen innehåller 15680 2106 korrigeringar från 54 11825 utvecklare, patchstorleken är 687954 MB (ändringarna påverkade 225344 15641 filer, 2018 44 rader kod lades till, 42 6.9 rader raderades). Den senaste utgåvan hade 17 korrigeringar från 13 utvecklare, patchstorleken var 7 MB. Cirka 4 % av alla ändringar som introduceras i XNUMX är relaterade till drivrutiner, cirka XNUMX % av ändringarna är relaterade till uppdateringskod som är specifik för hårdvaruarkitekturer, XNUMX % är relaterade till nätverksstacken, XNUMX % är relaterade till filsystem och XNUMX % är relaterade till interna kärndelsystem.
Huvudsakliga innovationer i kärnan 6.9:
- Diskundersystem, I/O och filsystem
- En ny dm-vdo-hanterare (virtuell dataoptimerare) har lagts till i Device Mapper (DM), som låter dig implementera en virtuell blockenhet baserad på befintliga blockenheter, som har funktioner som deduplicering av dubbletter av data, datakomprimering, eliminering av tomma block och öka storleken på blockanordningen med allteftersom behovet uppstår (tunn proviantering). Dessa funktioner implementeras på blockenhetsnivå och beror inte på vilket filsystem som används (till exempel med dm-vdo kan du automatiskt slå samman dubbletter av data och lagra information i en komprimerad form för vilket filsystem som helst). Användningen av dm-vdo för fysisk lagring upp till 256TB i storlek och skapandet av logiska volymer upp till 4PB i storlek stöds. Det rekommenderas att använda lvm för att hantera vdo-partitioner. VDO-tekniken utvecklades av Permabit och öppnades efter förvärvet av Red Hat 2017.
- I FUSE-undersystemet, som används för att implementera filsystem i användarutrymmet, har en initial implementering av "passthrough"-läget lagts till, vilket gör att fildata kan erhållas direkt på kärnnivån, förbi en process som körs i användarutrymmet, vilket kan förbättra prestandan avsevärt i vissa situationer. Till exempel kan FUSE-implementationer av ett filsystem som fungerar i skrivskyddat läge och begränsa åtkomst till filer servera innehållet i filer från källfilsystemet utan att överföra dem till FUSE-processen.
- Drivrutinen som implementerar filsystemet Ext2 har flyttats till den föråldrade kategorin. Anledningen är att drivrutinen endast stöder 32-bitars inodtidsräknare, som kommer att svämma över den 19 januari 2038. Istället för ext2-drivrutinen föreslås att man använder ext4-drivrutinen, som stöder arbete med Ext2-filsystemet och är helt kompatibel med det, men kan använda tidsstämplar i ext2-partitioner som inte är föremål för 2038-problemet om filsystemet är skapad med en inod större än 255 byte (i ext2-drivrutinen användes 32-bitars tidsräknare oavsett inodstorlek).
- Den gamla NTFS-filsystemdrivrutinen har tagits bort och har ersatts av den nya NTFS5.15-drivrutinen sedan version 3. Att tillhandahålla två drivrutiner med NTFS-implementering i kärnan ansågs vara olämpligt, med hänsyn till det faktum att den gamla drivrutinen inte har uppdaterats på många år, är i ett bedrövligt tillstånd och bara kan fungera i läsläge.
- Stöd för kartläggning av användar-ID:n för monterade filsystem har lagts till zonefs och hugetlbfs filsystem, som används för att matcha filerna för en specifik användare på en monterad främmande partition med en annan användare på det aktuella systemet.
- NFSv4 ger administratörer möjlighet att rensa öppna och låsta filer.
- För Ext4-filsystemet noteras endast buggfixar och kunit-testuppdateringar.
- Btrfs fortsätter att övergå funktioner för att använda sidfolios.
- I XFS-filsystemet fortsätter arbetet med att implementera möjligheten att använda fsck-verktyget för att kontrollera och korrigera identifierade problem online, utan att avmontera filsystemet.
- Lade till flaggan RWF_NOAPPEND till systemanropet pwritev2() så att du kan ange skrivförskjutningen även om filen öppnades i endast tilläggsläge.
- Nya ioctl-kommandon har lagts till: FS_IOC_GETUUID - returnerar UUID-identifieraren för det angivna filsystemet, och FS_IOC_GETFSSYSFSPATH - bestämmer platsen i /sys/fs för det specificerade monterade filsystemet.
- Filsystemen efs, qnx4 och coda har konverterats för att använda det nya partitionsmonterings-API:et.
- Förbättrad implementering av filoperationer utförda i skiftlägesokänsligt läge. Förbättrad prestanda genom att göra skiftlägeskänsliga jämförelser först och falla tillbaka till skiftlägesokänsliga sökningar. Problem med att montera överlägg över kataloger som är inställda på skiftlägesokänsliga har lösts.
- Minnes- och systemtjänster
- Stöd har implementerats för Intel FRED-mekanismen (Flexible Return and Event Delivery), skapad för att öka effektiviteten och tillförlitligheten av att leverera information om händelser på låg nivå, jämfört med den för närvarande använda IDT-mekanismen (Interrupt Descriptor Table). Förbättrad prestanda och minskad latens genom att returnera händelser genom IRET-processorinstruktionen istället för att skicka händelser genom IDT-tabellen. Ökad tillförlitlighet uppnås tack vare separat bearbetning av händelseankomster i kärnan och användarsammanhang, skydd från kapslad NMI-exekvering och lagring av alla undantagsrelaterade CPU-register i en utökad stackram.
- Lade till möjligheten att optimera åtkomsten till data för individuella CPU-kärnor genom användning av Named Address Spaces i kärnkoden, implementerad i GCC i form av en GNU C-tillägg.
- PIDFD_THREAD-flaggan har lagts till i pidfd_open()-funktionen, vilket gör det möjligt att skapa pidfds för individuella trådar, snarare än att bara använda pidfd i en trådgruppsledare. En implementering av en pseudo-FS för åtkomst till pidfd genom ett virtuellt filsystem föreslås också. Till skillnad från att identifiera processer med pid, är pidfd associerad med en specifik process och ändras inte, medan PID kan associeras med en annan process efter att den aktuella processen avslutas.
- En BPF-tokenmekanism har lagts till BPF-undersystemet, vilket gör att du selektivt kan delegera åtkomsträttigheter till privilegierade BPF-operationer till program, till exempel kan du ge en oprivilegierad applikation åtkomst till individuella BPF-undersystem utan att ge fullständiga CAP_BPF-rättigheter.
- En ny typ av delat minne, bpf_arena, har lagts till i BPF-delsystemet, som definierar ett område som kan delas mellan BPF-program och processer i användarutrymmet. May_goto-instruktionen har lagts till, så att du kan organisera arbetet med loopar som kan avbrytas av verifieraren. Lade till möjligheten att generera godtyckliga TCP SYN-cookies från BPF-program och skapa BPF-hanterare för att bekämpa SYN-översvämningar.
- Fortsatt migrering av ändringar från Rust-for-Linux-grenen relaterade till användningen av Rust-språket som ett andra språk för att utveckla drivrutiner och kärnmoduler (Rust-stöd är inte aktivt som standard och leder inte till inkluderingen av Rust bland nödvändiga monteringsberoenden för kärnan). Tillagt stöd för att använda Rust-språket när det körs på 64-bitars ARM-processorer. Övergången till att använda Rust 1.76-utgåvan har gjorts. Lade till makrot 'container_of!'. Istället för den instabila 'ptr_metadata'-funktionen används den stabila 'byte_sub'-metoden. Lade till 'time'-modul med 'msecs_to_jiffies()' tidskonverteringsfunktion.
- Möjligheten att trunkera filer (ftruncate_file) har lagts till i io_uring-undersystemet.
- Lade till en ny typ av arbetsköer WQ_BH (workqueue Bottom Halves) för asynkron kodexekvering i samband med programvaruavbrott, som syftar till att använda istället för föråldrade tasklets.
- Undersystemet för att arbeta med timern har gjorts om avsevärt, där logiken för att välja den aktiva CPU-kärnan för att exekvera en utlöst timer har förbättrats, för att inte väcka inaktiva kärnor från viloläge.
- Möjligheten att uppdatera kärnenergiförbrukningsmodellen (EM, Energy Model) under drift har implementerats, vilket till exempel kan användas för att ta hänsyn till effekten av driftstemperatur på CPU:ns energieffektivitet. Prestanda för funktionen em_cpu_energy() har förbättrats avsevärt, som nu är 1.43 gånger snabbare i tester på ett stationärt system och 4 gånger snabbare i tester på RockPi 1.69B-kortet.
- Tillagt stöd för att köra system baserade på ARM64-arkitektur i LPA2-läge med ett 52-bitars virtuellt adressutrymme.
- För ARM64-system har stöd för kontinuerliga PTE-poster (Page Table Entry) implementerats, vilket förbättrar prestandan genom att öka effektiviteten i att använda TLB (Translation Lookaside Buffer).
- Patchar har antagits för att förbättra prestandan för minneshanteringsundersystemet genom att minska förekomsten av samtidiga lås i vmalloc().
- För LoongArch-arkitekturen har en mekanism för hot patching av kärnan (live patching) implementerats, vilket gör att patchar kan appliceras på kärnan utan att starta om.
- För RISC-V-system har stöd implementerats för membarrier()-systemanropet, vilket säkerställer att minnesbarriärer installeras för trådar som körs i systemet.
- Kraven för versionen av LLVM/Clang som kan användas för att bygga kärnan har höjts. Bygg nu kräver minst LLVM 13.0.1-version (tidigare stödd bygg i LLVM 11+).
- Mekanismen "Användarspårningshändelser", som låter dig skapa spårningshändelser från användarprocesser för att spåra aktivitet i användarutrymmet, har lagt till stöd för export av händelseinformation i olika format (USER_EVENT_REG_MULTI_FORMAT).
- Möjligheten att spåra tillståndet för inkommande funktionsargument när spårningsfunktionen avslutas har lagts till i spårningsmekanismen för funktionsanrop. Värdena för retursatsen kan nu matchas med argumenten som används i funktionsanropet.
- Perf-verktyget har lagt till stöd för "kluster"-utdataaggregationsläget ("perf stat -a —per-cluster") för att kombinera statistik över delade resurser. Möjligheten att använda libcapstone-biblioteket för att demontera processorinstruktioner ("perf script -F disasm") har implementerats. Minnesförbrukningen har optimerats vid exekvering av kommandona perf report' och 'perf annotate'.
- Virtualisering och säkerhet
- Tillagt skydd mot RFDS (Register File Data Sampling) sårbarhet i Intel Atom-processorer, vilket gör att du kan extrahera restinformation från processorns registerfiler (RF, Register File), som används för att gemensamt lagra innehållet i register i alla uppgifter på samma CPU-kärna. Blockering av sårbarheten kräver uppdatering av mikrokoden och användning av VERW-instruktionen för att rensa innehållet i mikroarkitektoniska buffertar när du återvänder från kärnan till användarutrymmet. För att aktivera skydd när du laddar kärnan kan du ange flaggan "reg_file_data_sampling=on". Information om sårbarheten och förekomsten av mikrokod som är nödvändig för skyddet kan bedömas i filen "/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling".
- Lade till grundläggande stöd för gästsystemskydd med hjälp av AMD SEV-SNP-tillägget (Secure Nested Paging), vilket ger säkert arbete med kapslade minnessidtabeller och skyddar mot attackerna "undeSErVed" och "SEVerity" på AMD EPYC-processorer, vilket gör det möjligt att kringgå AMD SEV-skyddsmekanismen (Secure Encrypted Virtualization). KVM Ändringarna som krävs för att använda SNP:er planeras att läggas till i 6.10-grenen.
- Moduler som implementerar IMA (Integrity Measurement Architecture) och EVM (Extended Verification Module) teknologier har överförts till LSM (Linux Security Modules) ramverket, vilket utan förlust av funktionalitet har gjort det möjligt att avsevärt förenkla koden, kombinera dubblettfunktionalitet och använda standard tillgängliga via LSM. IMA-modulen är utformad för att verifiera integriteten hos operativsystemkomponenter med hjälp av digitala signaturer och hash. EVM-modulen låter dig skydda utökade filattribut (xattrs) från attacker som syftar till att kränka deras integritet (EVM tillåter inte en offlineattack där en angripare kan ändra metadata, till exempel genom att starta från sin enhet).
- Systemanropen lsm_list_modules(), lsm_get_self_attr() och lsm_set_self_attr(), utformade för att visa en lista över laddade LSM-moduler (Linux Security Modules) och get/set LSM-modulattribut, har omdesignats för större kompatibilitet med 32-bitarsmiljöer. Ändringen bryter bakåtkompatibiliteten, men eftersom nya systemanrop lades till i den senaste kärnversionen och ännu inte används i applikationer ansåg Linus Torvalds ändringen vara acceptabel.
- Ett försök har gjorts att återuppta användningen av UBSAN-mekanismen (Undefined Behavior Sanitizer). Kärnan i problemet är att kompilatorer hanterar heltalsöverflöden av signerade och osignerade typer på olika sätt. Signerade och pekarspill klassificeras som odefinierat beteende, medan osignerade spill är trunkerade modulo 2n, behåller endast de låga ordningens bitar av resultatet ("wrap-around") och är inte föremål för odefinierat beteende. För att eliminera situationer där odefinierat beteende uppstår är kärnan byggd med alternativet "-fno-strict-overflow", vilket gör att "wrap-around" används för alla heltalsspill. GCC och Clang kan inte korrekt diagnostisera vissa problem när de använder flaggan -fno-strict-overflow, och inkluderingen av UBSAN är avsedd att arbeta med kompilatorutvecklare för att eliminera falska positiva resultat och identifiera heltalsspill på platser där det inte finns några explicita kontroller.
För att kontrollera eventuella spill, använder kärnan konstruktioner som "var + offset < var" (till exempel "if (pgoff + (storlek > PAGE_SHIFT) < pgoff){..}"), som är knutna till assembly med " -fno-strict" flagga -overflow" och täcker inte all kod som potentiellt skulle kunna svämma över. Problemet är att vid användning av UBSAN resulterade sådana kontroller i ett stort antal falska varningar, och på grund av detta var UBSAN tvungen att inaktiveras i 2021. Den uppdaterade implementeringen föreslår att man använder speciella annoteringar __signed_wrap och __unsigned_wrap, såväl som färdiga makron med add_would_overflow(a, b) och add_wrap(a, b) kontroller, som låter dig separera den avsedda användningen av heltalsöverflöden av utvecklarna från förekomsten av slumpmässiga överflöden som kan leda till sårbarheter. Förslag om en mer omfattande omarbetning av kärnan genom att införa ytterligare typdefinitioner avvisades av Linus Torvalds.
- Nätverksdelsystem
- I nätverksdelsystemet har man arbetat med att minska förekomsten av konkurrerande lås (”lock contention”, ett försök att få ett lås som hålls av en annan tråd). Minskad användning av RTNL-lås.
- Lade till möjligheten att aktivera stöd för aktiv socket polling i samband med individuella epoll-anrop. Poolstorlek och budgetparametrar kan ställas in separat från systemets standardparametrar.
- Implementerade net_hotdata-strukturen för att förbättra effektiviteten i cachelagring av de vanligaste nätverkskonfigurationsvariablerna.
- MPTCP har lagt till stöd för att ställa in alternativet TCP_NOTSENT_LOWAT för sockets, vilket låter dig begränsa storleken på sändbufferten. API:n för MCTP-sockets har lagt till stöd för nätverks-ID, vilket gör det möjligt att använda flera icke-överlappande MCTP-nätverk på en värd.
- IPSec lägger till stöd för omdirigering av ICMP-felmeddelanden (RFC 4301).
- Processen med att skanna rutter med utgått livslängd har påskyndats.
- Förbättrad XDP-prestanda genom att mer aggressivt undvika stora minnesallokeringar.
- Lade till möjligheten att bifoga metadata till netconsole-meddelanden.
- Netfilter tillåter att tabeller definieras från användarutrymmet som är bundna till den styrande bakgrundsprocessen och som inte raderas automatiskt när användarapplikationen avslutas.
- I nftables har det påskyndats att lägga till element i uppsättningar med sammanslagna intervall.
- Оборудование
- I i915-drivrutinen fortsätter arbetet med att implementera stöd för Intel LunarLake (Xe 2)-chips. Nya PCI-identifierare har lagts till för enheter baserade på Intel Arrow Lake och Alder Lake N-chip Stöd för DP-tunnling och bandbreddsallokering har lagts till för Displayport. Fastboot-läget är aktiverat för alla plattformar. Tillagt stöd för felsökning av utdata i förhållande till enskilda enheter.
- AMDGPU-drivrutinen har förberetts för att stödja AMD RDNA3.5 och RDNA4 GPU:er. Lagt till stöd för ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1. och NBIO 6.1.1. ramverk RAS ACA. Parametern freesync_video har lagts till i kärnmodulen för att möjliggöra experimentellt stöd för att optimera videolägesväxling med hjälp av adaptiv synkroniseringsteknik från FreeSync.
- I Nouveau-drivrutinen har skärmkontrollkoden konverterats för att använda funktionen kmemdup().
- Arbetet fortsatte med Xe drm-drivrutinen (Direct Rendering Manager) för GPU:er baserad på Intel Xe-arkitekturen, som används i Intel Arc-familjens grafikkort och integrerad grafik, med början i Tiger Lake-processorer.
- Tillagd DRM-drivrutin för Mediatek MT8188 VDOSYS1-chips.
- Kärninställningar relaterade till videoundersystem har flyttats till avsnittet CONFIG_VIDEO.
- Tillagt stöd för ARM64 SoC: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car J4S), .
- Tillagt stöd för ARM-kort och enheter: Android-telefoner baserade på Tegra30-chippet, Chromebook-modeller baserade på Mediatek MT8186, NAS, surfplattor och spelkonsoler baserade på Rockchips RK35xx, White Hawk-kort baserade på Renesas SoC, kort baserade på Qualcomm SM8550 (Snapdragon 8) Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
- ALSA-ljudsubsystemkoden har omstrukturerats. Tillagt stöd för Microchip SAM9x7, NXP i.MX95 och Qualcomm WCD939x ljudsystem. SoundWire-drivrutinen har lagt till stöd för ASoC med AMD ACP 6.3-ljudsamprocessorer, och DSPless-läge har implementerats för Intel-system. Tillagt stöd för ytterligare Cirrus HD-ljudcodecs. Virtio-drivrutinen har förbättrad hantering av ljudenheter.
- Tillagt stöd för Marvell Octeon PCI Endpoint NIC VF och Intel E825-C 100G Ethernet-kontroller.
Samtidigt bildade Latin American Free Software Foundation en version av den helt fria kärnan 6.9 - Linux-libre 6.9-gnu, rensat från element av firmware och drivrutiner som innehåller icke-fria komponenter eller kodsektioner, vars omfattning är begränsad av tillverkaren. I version 6.9 har blob-rensningskoden i drivrutinerna för amdgpu, ath12k, adreno, btusb och r8169 uppdaterats. Den nya ptp_fc3-drivrutinen har rengjorts. Rensat upp blobnamn i dts-filer (devicetree) för Aarch64-arkitekturen. Fixade problem med rengöring av i915-drivrutinen, vilket ledde till frysning under initieringen. Ändringar har gjorts relaterade till bearbetningen av blobbar som levererats som hex-dumpar.
Källa: opennet.ru
