Den sjätte versionen av patchar för Linux-kärnan med stöd för språket Rust

Miguel Ojeda, författare till Rust-for-Linux-projektet, föreslog lanseringen av v6-komponenter för utveckling av drivrutiner i Rust-språket för övervägande av Linux-kärnutvecklare. Detta är den sjunde upplagan av patcharna, med hänsyn till den första versionen, publicerad utan versionsnummer. Ruststöd anses vara experimentellt, men ingår redan i linux-next-grenen och är tillräckligt utvecklat för att börja arbeta med att skapa abstraktionslager över kärndelsystem, samt skriva drivrutiner och moduler. Utvecklingen finansieras av Google och ISRG (Internet Security Research Group), som är grundare av Let's Encrypt-projektet och främjar HTTPS och utvecklingen av tekniker för att förbättra Internetsäkerheten.

I den nya versionen:

  • Verktygslådan och en variant av alloc-biblioteket, befriade från eventuell generering av ett "panik"-tillstånd när fel uppstår, har uppdaterats till utgåvan av Rust 1.60, som stabiliserar stödet för läget "maybe_uninit_extra" som används i kärnpatchar.
  • Lade till möjligheten att köra tester från dokumentationen (tester som också används som exempel i dokumentationen), genom kompileringstidskonvertering av tester kopplade till kärnans API till KUnit-tester som körs under kärnladdningen.
  • Det har antagits krav på att tester inte ska resultera i en Clippy linter-varning, precis som Rust-kärnkoden.
  • En första implementering av "nät"-modulen med nätverksfunktioner föreslås. Rustkod har tillgång till kärnnätverksstrukturer som Namespace (baserat på struct net kernel-strukturen), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) och deras IPv6-motsvarigheter .
  • Det finns initialt stöd för asynkron programmeringsteknik (async), implementerad i form av kasync-modulen. Till exempel kan du skriva asynkron kod för att manipulera TCP-sockets: async fn echo_server(ström: TcpStream) -> Resultat { let mut buf = [0u8; 1024]; loop { låt n = stream.read(&mut buf).await?; om n == 0 { returnera Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Tillagd net::filtermodul för att manipulera nätverkspaketfilter. Lade till exempel rust_netfilter.rs med en filterimplementering i Rust-språket.
  • Lade till implementering av en enkel mutex smutex::Mutex, som inte kräver pinning.
  • Lade till NoWaitLock, som aldrig väntar på ett lås, och om det är upptaget av en annan tråd, gör att ett fel rapporteras när man försöker skaffa låset istället för att stoppa den som ringer.
  • Lade till RawSpinLock, identifierat av raw_spinlock_t i kärnan, för att tillämpa på sektioner som inte kan vara lediga.
  • Tillagd ARef-typ för referenser till ett objekt som referensräknemekanismen tillämpas på (alltid återräknat).
  • Rustc_codegen_gcc backend, som låter dig använda libgccjit-biblioteket från GCC-projektet som en kodgenerator i rustc för att förse rustc med stöd för arkitekturer och optimeringar tillgängliga i GCC, har implementerat möjligheten att bootstrapping rustc-kompilatorn. Kompilatorkampanj innebär möjligheten att använda en GCC-baserad kodgenerator i rustc för att bygga rustc-kompilatorn själv. Dessutom innehåller den senaste versionen av GCC 12.1 korrigeringar av libgccjit som är nödvändiga för att rustc_codegen_gcc ska fungera korrekt. Förberedelser pågår för att ge möjligheten att installera rustc_codegen_gcc med hjälp av rustup-verktyget.
  • Framstegen i utvecklingen av GCC:s frontend-gccrs med implementeringen av Rust-språkkompilatorn baserad på GCC noteras. Det finns för närvarande två heltidsutvecklare som arbetar med gccrs.

Kom ihåg att de föreslagna ändringarna gör det möjligt att använda Rust som ett andra språk för att utveckla drivrutiner och kärnmoduler. Ruststöd presenteras som ett alternativ som inte är aktiverat som standard och resulterar inte i att Rust ingår som ett obligatoriskt byggberoende för kärnan. Genom att använda Rust för drivrutinsutveckling kan du skapa säkrare och bättre drivrutiner med minimal ansträngning, utan problem som minnesåtkomst efter frigöring, nollpekarereferenser och buffertöverskridanden.

Minnessäkerhet tillhandahålls i Rust vid kompileringstillfället genom referenskontroll, hålla reda på objektägande och objektlivslängd (scope), samt genom utvärdering av korrektheten av minnesåtkomst under kodexekvering. Rust ger också skydd mot heltalsspill, kräver obligatorisk initiering av variabelvärden innan användning, hanterar fel bättre i standardbiblioteket, tillämpar konceptet med oföränderliga referenser och variabler som standard, erbjuder stark statisk typning för att minimera logiska fel.

Källa: opennet.ru

Lägg en kommentar