Miguel Ojeda, författare till projektet Rust-for-Linux, har föreslagit att Linux-kĂ€rnutvecklare övervĂ€ger att slĂ€ppa v6-komponenter för att utveckla enhetsdrivrutiner pĂ„ Rust. Detta Ă€r den sjunde revideringen av patcharna med hĂ€nsyn till den första versionen, som publicerades utan versionsnummer. Stödet för Rust ses som experimentellt, men har redan inkluderats i linux-next-grenen och Ă€r tillrĂ€ckligt utvecklat för att pĂ„börja arbetet med att skapa abstraktionslager över kĂ€rnsystemen samt för att skriva drivrutiner och moduler. Utvecklingen finansieras av Google och organisationen ISRG (Internet Security Research Group), som grundade projektet Letâs Encrypt och frĂ€mjar HTTPS och utvecklingen av teknologier för att öka internets sĂ€kerhet.
I den nya versionen:
- Verktygen och versionen av biblioteket alloc, som har tagits bort frÄn möjliga tillstÄnd av "panic" vid fel, har uppdaterats till release Rust 1.60, dÀr stödet för lÀget "maybe_uninit_extra" stabiliserats, vilket anvÀnds i patcharna för kÀrnan.
- Möjligheten att köra tester frÄn dokumentationen (tester som samtidigt anvÀnds som exempel i dokumentationen) har lagts till, genom att vid kompilering omvandla tester bunden till kÀrnans API till KUnit-tester som körs under uppstarten av kÀrnan.
- Krav har antagits enligt vilka tester inte fÄr leda till varningar frÄn lintern Clippy, precis som koden för kÀrnan pÄ Rust.
- En initial implementation av modulen "net" med nÀtverksfunktioner har föreslagits. För Rust-kod finns tillgÄng till sÄdana nÀtverksstrukturer i kÀrnan som "Namespace" (baserad pÄ kÀrnstrukturen "struct net"), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) och deras motsvarigheter för IPv6.
- Initialt stöd för asynkron programmering (async) har implementerats i form av modulen kasync. Till exempel kan kod för att manipulera TCP-sockets i asynkront lÀge skapas: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- Modulen net::filter för manipulering av nÀtverkspaketfilter har lagts till. Ett exempel rust_netfilter.rs med implementering av ett filter pÄ Rust har lagts till.
- Implementeringen av en enkel mutex smutex::Mutex har lagts till, utan behov av pinning.
- En NoWaitLock-lÄsning har lagts till, som aldrig leder till att vÀnta pÄ frigöring, och om en annan trÄd tar den, ger ett felmeddelande vid försök att erhÄlla lÄsningen istÀllet för att stoppen anroparen.
- En RawSpinLock-lÄsning har lagts till, som motsvarar raw_spinlock_t i kÀrnan, tillÀmpad pÄ sektioner som inte kan befinna sig i vÀntelÀge.
- Typen ARef har lagts till för referenser till objektet, dÀr refcounting-mekanismen tillÀmpas (always-refcounted).
- I backend rustc_codegen_gcc, som möjliggör anvÀndning av libgccjit-biblioteket frÄn GCC-projektet som kodgenerator i rustc för att stödja tillgÀngliga arkitekturer och optimeringar i GCC, har möjligheten för bootstrapping av rustc implementerats. Bootstrapping innebÀr möjligheten att anvÀnda en GCC-baserad kodgenerator i rustc för att bygga sjÀlva rustc-kompilatorn. Dessutom har nylanseringen av GCC 12.1 inkluderat korrigeringar i libgccjit, som Àr nödvÀndiga för korrekt drift av rustc_codegen_gcc. Förberedelser pÄgÄr för att möjliggöra installation av rustc_codegen_gcc via rustup-verktyget.
- Det noteras framsteg i utvecklingen av GCC-frontenden gccrs med implementeringen av en Rust-kompilator baserad pÄ GCC. För nÀrvarande arbetar tvÄ utvecklare med gccrs i fullt arbetslÀge.
Vi pÄminner om att de föreslagna förÀndringarna ger möjlighet att anvÀnda Rust som ett andra sprÄk för utveckling av drivrutiner och moduler för kÀrnan. Stödet för Rust presenteras som ett alternativ, inte aktiverat som standard och inte som en obligatorisk byggberoende för kÀrnan. AnvÀndningen av Rust för utveckling av drivrutiner kommer att möjliggöra skapandet av sÀkrare och högre kvalitetsdrivrutiner med minimala insatser, utan problem som att referera till minnesomrÄden efter att de har frigjorts, dereferera nullpekare och överskridning av buffertgrÀnser.
SÀker minneshantering sÀkerstÀlls i Rust vid kompilering genom kontroll av referenser, spÄrning av Àgande av objekt och beaktande av objektens livstid (synlighet), samt genom utvÀrdering av korrekt tillgÄng till minnet under kodens körning. Rust tillhandahÄller ocksÄ verktyg för skydd mot heltalsöverflöden, krÀver obligatorisk initialisering av variabelvÀrden innan anvÀndning, hanterar fel bÀttre i standardbiblioteket, tillÀmpar konceptet av oförÀnderliga (immutable) referenser och variabler som standard och erbjuder stark statisk typning för att minimera logiska fel.
KĂ€lla: opennet.ru
