Den sjette versjonen av patcher for Linux-kjernen med støtte for Rust-språket

Miguel Ojeda, forfatter av Rust-for-Linux-prosjektet, foreslo utgivelsen av v6-komponenter for utvikling av enhetsdrivere i Rust-språket for vurdering av Linux-kjerneutviklere. Dette er den syvende utgaven av oppdateringene, tatt i betraktning den første versjonen, publisert uten et versjonsnummer. Ruststøtte regnes som eksperimentell, men er allerede inkludert i linux-next-grenen og er tilstrekkelig utviklet til å begynne arbeidet med å lage abstraksjonslag over kjerneundersystemer, samt skrive drivere og moduler. Utviklingen er finansiert av Google og ISRG (Internet Security Research Group), som er grunnleggeren av Let's Encrypt-prosjektet og fremmer HTTPS og utvikling av teknologier for å forbedre sikkerheten til Internett.

I den nye versjonen:

  • Verktøysettet og en variant av alloc-biblioteket, frigjort fra mulig generering av en "panikk"-tilstand når feil oppstår, har blitt oppdatert til utgivelsen av Rust 1.60, som stabiliserer støtten for "maybe_uninit_extra"-modusen som brukes i kjernepatcher.
  • Lagt til muligheten til å kjøre tester fra dokumentasjonen (tester som også brukes som eksempler i dokumentasjonen), gjennom kompileringstidskonvertering av tester knyttet til kjerne-APIet til KUnit-tester utført under kjernelasting.
  • Det er vedtatt krav om at tester ikke skal resultere i en Clippy linter-advarsel, akkurat som Rust-kjernekode.
  • En innledende implementering av "nett"-modulen med nettverksfunksjoner er foreslått. Rustkode har tilgang til kjernenettverksstrukturer som Namespace (basert på struct net kjernestrukturen), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) og deres IPv6-ekvivalenter .
  • Det er innledende støtte for asynkrone programmeringsteknikker (async), implementert i form av kasync-modulen. For eksempel kan du skrive asynkron kode for å manipulere TCP-sockets: async fn echo_server(stream: TcpStream) -> Resultat { let mut buf = [0u8; 1024]; loop { la n = stream.read(&mut buf).await?; hvis n == 0 { returner Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Lagt til net::filtermodul for å manipulere nettverkspakkefiltre. Lagt til eksempel rust_netfilter.rs med en filterimplementering i Rust-språket.
  • Lagt til implementering av en enkel mutex smutex::Mutex, som ikke krever pinning.
  • Lagt til NoWaitLock, som aldri venter på en lås, og hvis den er okkupert av en annen tråd, fører til at en feil rapporteres når du forsøker å skaffe låsen i stedet for å stoppe den som ringer.
  • Lagt til RawSpinLock, identifisert av raw_spinlock_t i kjernen, for å gjelde seksjoner som ikke kan være inaktive.
  • Lagt til ARef-type for referanser til et objekt som referansetellemekanismen brukes på (alltid omregnet).
  • Rustc_codegen_gcc-backend, som lar deg bruke libgccjit-biblioteket fra GCC-prosjektet som en kodegenerator i rustc for å gi rustc støtte for arkitekturer og optimaliseringer tilgjengelig i GCC, har implementert muligheten til å starte rustc-kompilatoren. Kompilatorpromotering betyr muligheten til å bruke en GCC-basert kodegenerator i rustc for å bygge rustc-kompilatoren selv. I tillegg inkluderer den nylige utgivelsen av GCC 12.1 reparasjoner til libgccjit som er nødvendige for at rustc_codegen_gcc skal fungere korrekt. Forberedelser er i gang for å gi muligheten til å installere rustc_codegen_gcc ved hjelp av rustup-verktøyet.
  • Fremgangen i utviklingen av GCC-frontend gccrs med implementeringen av Rust-språkkompilatoren basert på GCC er notert. Det er for tiden to heltidsutviklere som jobber med gccrs.

Husk at de foreslåtte endringene gjør det mulig å bruke Rust som andrespråk for utvikling av drivere og kjernemoduler. Rust-støtte presenteres som et alternativ som ikke er aktivert som standard og resulterer ikke i at Rust inkluderes som en nødvendig byggeavhengighet for kjernen. Å bruke Rust for driverutvikling vil tillate deg å lage tryggere og bedre drivere med minimal innsats, fri for problemer som minnetilgang etter frigjøring, null-pekereferanser og bufferoverskridelser.

Rust håndhever minnesikkerhet ved kompilering gjennom referansesjekking, objekteierskap og objektlevetidssporing (scopes), og ved å evaluere riktigheten av minnetilganger under kjøring. Rust gir også beskyttelse mot heltallsoverløp, krever at variabelverdier initialiseres før bruk, har bedre feilhåndtering i standardbiblioteket, bruker konseptet med uforanderlige referanser og variabler som standard, og tilbyr sterk statisk skriving for å minimere logiske feil.

Kilde: opennet.ru

Legg til en kommentar