Den sjette version af patches til Linux-kernen med understøttelse af Rust-sproget

Miguel Ojeda, forfatter til Rust-for-Linux-projektet, foreslog udgivelsen af ​​v6-komponenter til udvikling af enhedsdrivere i Rust-sproget til overvejelse af Linux-kerneudviklere. Dette er den syvende udgave af patches, idet der tages hensyn til den første version, udgivet uden et versionsnummer. Rustunderstøttelse betragtes som eksperimentel, men er allerede inkluderet i linux-next-grenen og er tilstrækkeligt udviklet til at begynde arbejdet med at skabe abstraktionslag over kerneundersystemer, samt skrive drivere og moduler. Udviklingen er finansieret af Google og ISRG (Internet Security Research Group), som er grundlæggeren af ​​Let's Encrypt-projektet og promoverer HTTPS og udviklingen af ​​teknologier til at forbedre internetsikkerheden.

I den nye version:

  • Værktøjssættet og en variant af alloc-biblioteket, frigjort fra mulig generering af en "panik"-tilstand, når der opstår fejl, er blevet opdateret til udgivelsen af ​​Rust 1.60, som stabiliserer understøttelsen af ​​"maybe_uninit_extra"-tilstanden, der bruges i kernepatches.
  • Tilføjet muligheden for at køre test fra dokumentationen (test, der også bruges som eksempler i dokumentationen), gennem kompileringstidskonvertering af test knyttet til kerne-API'en til KUnit-test udført under kerneindlæsning.
  • Der er vedtaget krav om, at test ikke skal resultere i en Clippy linter-advarsel, ligesom Rust-kernekode.
  • En indledende implementering af "net"-modulet med netværksfunktioner foreslås. Rustkode har adgang til kernenetværksstrukturer såsom Namespace (baseret på struct net-kernestrukturen), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) og deres IPv6-ækvivalenter .
  • Der er indledende understøttelse af asynkrone programmeringsteknikker (async), implementeret i form af kasync-modulet. For eksempel kan du skrive asynkron kode for at manipulere TCP-sockets: async fn echo_server(stream: TcpStream) -> Resultat { let mut buf = [0u8; 1024]; loop { lad n = stream.read(&mut buf).await?; hvis n == 0 { returner Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Tilføjet net::filtermodul til at manipulere netværkspakkefiltre. Tilføjet eksempel rust_netfilter.rs med en filterimplementering i Rust-sproget.
  • Tilføjet implementering af en simpel mutex smutex::Mutex, som ikke kræver pinning.
  • Tilføjet NoWaitLock, som aldrig venter på en lås, og hvis den er optaget af en anden tråd, forårsager en fejl, der rapporteres, når man forsøger at erhverve låsen i stedet for at stoppe den, der ringer.
  • Tilføjet RawSpinLock, identificeret af raw_spinlock_t i kernen, for at gælde for sektioner, der ikke kan være inaktive.
  • Tilføjet ARef-type for referencer til et objekt, hvorpå referencetællemekanismen er anvendt (altid gentællet).
  • Rustc_codegen_gcc-backend, som giver dig mulighed for at bruge libgccjit-biblioteket fra GCC-projektet som en kodegenerator i rustc for at give rustc understøttelse af arkitekturer og optimeringer, der er tilgængelige i GCC, har implementeret muligheden for at bootstrapping rustc-kompileren. Compilerpromovering betyder muligheden for at bruge en GCC-baseret kodegenerator i rustc til at bygge rustc-kompileren selv. Derudover indeholder den seneste udgivelse af GCC 12.1 rettelser til libgccjit, som er nødvendige for at rustc_codegen_gcc kan fungere korrekt. Forberedelser er i gang for at give mulighed for at installere rustc_codegen_gcc ved hjælp af rustup-værktøjet.
  • Fremskridtet i udviklingen af ​​GCC-frontend-gccr'erne med implementeringen af ​​Rust-sprogkompileren baseret på GCC bemærkes. Der er i øjeblikket to fuldtidsudviklere, der arbejder på gccrs.

Husk at de foreslåede ændringer gør det muligt at bruge Rust som et andet sprog til udvikling af drivere og kernemoduler. Rust-understøttelse præsenteres som en mulighed, der ikke er aktiveret som standard og resulterer ikke i, at Rust inkluderes som en påkrævet build-afhængighed for kernen. Brug af Rust til driverudvikling vil give dig mulighed for at skabe sikrere og bedre drivere med minimal indsats, fri for problemer såsom hukommelsesadgang efter frigørelse, nul pointer-dereferencer og bufferoverskridelser.

Hukommelsessikker håndtering leveres i Rust på kompileringstidspunktet gennem referencekontrol, holde styr på objektejerskab og objektlevetid (scope), samt gennem evaluering af korrektheden af ​​hukommelsesadgang under kodeudførelse. Rust giver også beskyttelse mod heltalsoverløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med uforanderlige referencer og variabler som standard, tilbyder stærk statisk skrivning for at minimere logiske fejl.

Kilde: opennet.ru

Tilføj en kommentar