Šesta verzija zakrpa za Linux kernel sa podrškom za Rust jezik

Miguel Ojeda, autor projekta Rust-for-Linux, predložio je izdavanje v6 komponenti za razvoj drajvera uređaja na jeziku Rust za razmatranje programera Linux kernela. Ovo je sedmo izdanje zakrpa, uzimajući u obzir prvu verziju, objavljenu bez broja verzije. Podrška za Rust se smatra eksperimentalnom, ali je već uključena u linux-next granu i dovoljno je razvijena da započne rad na kreiranju slojeva apstrakcije nad podsistemima kernela, kao i pisanju drajvera i modula. Razvoj finansiraju Google i ISRG (Internet Security Research Group), koji je osnivač projekta Let's Encrypt i promoviše HTTPS i razvoj tehnologija za poboljšanje internet sigurnosti.

U novoj verziji:

  • Komplet alata i varijanta biblioteke alloc, oslobođeni mogućeg generisanja "paničnog" stanja kada se pojave greške, ažurirani su na izdanje Rusta 1.60, koji stabilizuje podršku za "maybe_uninit_extra" način rada koji se koristi u zakrpama kernela.
  • Dodata je mogućnost pokretanja testova iz dokumentacije (testovi koji se takođe koriste kao primeri u dokumentaciji), kroz konverziju testova vezanih za API kernela u vremenu prevođenja u KUnit testove koji se izvršavaju tokom učitavanja kernela.
  • Usvojeni su zahtjevi da testovi ne bi trebali rezultirati upozorenjem Clippy lintera, baš kao Rust kernel kod.
  • Predložena je početna implementacija “net” modula sa mrežnim funkcijama. Rust kod ima pristup mrežnim strukturama kernela kao što su Namespace (zasnovan na strukturi struct net kernel), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) i njihovi IPv6 equivalenti .
  • Postoji početna podrška za tehnike asinhronog programiranja (async), implementirane u obliku kasync modula. Na primjer, možete napisati asinhroni kod za manipuliranje TCP utičnicama: async fn echo_server(stream: TcpStream) -> Rezultat { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Dodan net::filter modul za manipuliranje filterima mrežnih paketa. Dodan primer rust_netfilter.rs sa implementacijom filtera na Rust jeziku.
  • Dodata implementacija jednostavnog mutexa smutex::Mutex, koji ne zahtijeva zakačenje.
  • Dodan je NoWaitLock, koji nikada ne čeka zaključavanje i ako ga zauzme druga nit, uzrokuje prijavu greške prilikom pokušaja preuzimanja zaključavanja umjesto zaustavljanja pozivaoca.
  • Dodan RawSpinLock, identificiran sa raw_spinlock_t u kernelu, za primjenu na sekcije koje ne mogu biti u mirovanju.
  • Dodan tip ARef za reference na objekt na koji je primijenjen mehanizam brojanja referenci (uvijek-refcounted).
  • Pozadina rustc_codegen_gcc, koja vam omogućava da koristite biblioteku libgccjit iz GCC projekta kao generator koda u rustc-u kako biste pružili rustc-u podršku za arhitekture i optimizacije dostupne u GCC-u, implementirao je mogućnost pokretanja rustc kompajlera. Promocija kompajlera znači mogućnost korištenja GCC-baziranog generatora koda u rustc-u za izgradnju samog rustc kompajlera. Pored toga, nedavno izdanje GCC 12.1 uključuje ispravke za libgccjit neophodne za ispravan rad rustc_codegen_gcc. U toku su pripreme kako bi se omogućila instalacija rustc_codegen_gcc pomoću uslužnog programa rustup.
  • Zapažen je napredak u razvoju GCC frontend gccrs sa implementacijom kompajlera Rust jezika zasnovanog na GCC-u. Trenutno na gccrs-u rade dva programera s punim radnim vremenom.

Podsjetimo da predložene izmjene omogućavaju korištenje Rusta kao drugog jezika za razvoj drajvera i modula kernela. Podrška za Rust je predstavljena kao opcija koja nije omogućena prema zadanim postavkama i ne dovodi do uključivanja Rusta među potrebne ovisnosti o izgradnji za kernel. Korišćenje Rusta za razvoj drajvera omogućiće vam da kreirate sigurnije i bolje drajvere uz minimalan napor, bez problema kao što je pristup memorijskom području nakon što se oslobodi, dereferenciranje nul pokazivača i prekoračenje bafera.

Sigurnost memorije je obezbeđena u Rustu u vreme kompajliranja kroz proveru referenci, praćenje vlasništva nad objektom i životnog veka objekta (opsega), kao i kroz procenu ispravnosti pristupa memoriji tokom izvršavanja koda. Rust također pruža zaštitu od prekoračenja cijelih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli po defaultu, nudi snažno statičko kucanje kako bi se minimizirale logičke greške.

izvor: opennet.ru

Dodajte komentar