De zesde versie van patches voor de Linux-kernel met ondersteuning voor de Rust-taal

Miguel Ojeda, auteur van het Rust-for-Linux-project, stelde de release voor van v6-componenten voor het ontwikkelen van apparaatstuurprogramma's in de Rust-taal, ter overweging door Linux-kernelontwikkelaars. Dit is de zevende editie van de patches, rekening houdend met de eerste versie, gepubliceerd zonder versienummer. Rust-ondersteuning wordt als experimenteel beschouwd, maar is al opgenomen in de linux-next branch en is voldoende ontwikkeld om te beginnen met het creëren van abstractielagen over kernelsubsystemen, en met het schrijven van stuurprogramma's en modules. De ontwikkeling wordt gefinancierd door Google en de ISRG (Internet Security Research Group), de oprichter van het Let's Encrypt-project en promoot HTTPS en de ontwikkeling van technologieën om de internetbeveiliging te verbeteren.

In de nieuwe versie:

  • De toolkit en een variant van de alloc-bibliotheek, bevrijd van de mogelijke generatie van een "paniek"-status wanneer er fouten optreden, zijn bijgewerkt naar de release van Rust 1.60, die de ondersteuning stabiliseert voor de "maybe_uninit_extra"-modus die wordt gebruikt in kernelpatches.
  • De mogelijkheid toegevoegd om tests uit te voeren vanuit de documentatie (tests die ook als voorbeelden in de documentatie worden gebruikt), door tijdens het compileren conversie van tests die aan de kernel-API zijn gekoppeld, naar KUnit-tests die worden uitgevoerd tijdens het laden van de kernel.
  • Er zijn eisen aangenomen dat tests niet mogen resulteren in een Clippy-linterwaarschuwing, net als Rust-kernelcode.
  • Er wordt een eerste implementatie van de “net”-module met netwerkfuncties voorgesteld. Rust-code heeft toegang tot kernelnetwerkstructuren zoals Namespace (gebaseerd op de struct net-kernelstructuur), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) en hun IPv6-equivalenten .
  • Er is initiële ondersteuning voor asynchrone programmeertechnieken (async), geïmplementeerd in de vorm van de kasync-module. U kunt bijvoorbeeld asynchrone code schrijven om TCP-sockets te manipuleren: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; als n == 0 { retourneer Ok(()); } stream.write_all(&buf[..n]).wachten?; } }
  • Net::filter-module toegevoegd voor het manipuleren van netwerkpakketfilters. Voorbeeld rust_netfilter.rs toegevoegd met een filterimplementatie in de Rust-taal.
  • Implementatie toegevoegd van een eenvoudige mutex smutex::Mutex, waarvoor geen vastzetten vereist is.
  • NoWaitLock is toegevoegd, dat nooit op een vergrendeling wacht en, als het door een andere thread wordt bezet, ervoor zorgt dat er een fout wordt gerapporteerd wanneer wordt geprobeerd de vergrendeling te verkrijgen in plaats van de beller te stoppen.
  • RawSpinLock toegevoegd, geïdentificeerd door raw_spinlock_t in de kernel, om toe te passen op secties die niet inactief kunnen zijn.
  • ARef-type toegevoegd voor verwijzingen naar een object waarop het referentietellingsmechanisme wordt toegepast (altijd opnieuw geteld).
  • De rustc_codegen_gcc backend, waarmee u de libgccjit-bibliotheek uit het GCC-project kunt gebruiken als codegenerator in rustc om rustc ondersteuning te bieden voor architecturen en optimalisaties die beschikbaar zijn in GCC, heeft de mogelijkheid geïmplementeerd om de rustc-compiler op te starten. Compilerpromotie betekent de mogelijkheid om een ​​op GCC gebaseerde codegenerator in rustc te gebruiken om de rustc-compiler zelf te bouwen. Bovendien bevat de recente release van GCC 12.1 reparaties aan libgccjit die nodig zijn om rustc_codegen_gcc correct te laten werken. Er worden voorbereidingen getroffen om de mogelijkheid te bieden om rustc_codegen_gcc te installeren met behulp van het rustup-hulpprogramma.
  • De voortgang in de ontwikkeling van de GCC frontend gccrs met de implementatie van de Rust-taalcompiler op basis van GCC wordt genoteerd. Er werken momenteel twee fulltime ontwikkelaars aan gccrs.

Bedenk dat de voorgestelde wijzigingen het mogelijk maken om Rust als tweede taal te gebruiken voor het ontwikkelen van stuurprogramma's en kernelmodules. Rust-ondersteuning wordt gepresenteerd als een optie die niet standaard is ingeschakeld en die er niet toe leidt dat Rust wordt opgenomen als een vereiste build-afhankelijkheid voor de kernel. Door Rust te gebruiken voor de ontwikkeling van stuurprogramma's kunt u met minimale inspanning veiligere en betere stuurprogramma's maken, vrij van problemen zoals geheugentoegang na het vrijmaken, null pointer-dereferenties en bufferoverruns.

Rust dwingt de geheugenveiligheid af tijdens het compileren door referentiecontrole, objecteigendom en het volgen van de levensduur van objecten (scopes), en door de juistheid van geheugentoegang tijdens runtime te evalueren. Rust biedt ook bescherming tegen overflows van gehele getallen, vereist dat variabelewaarden vóór gebruik worden geïnitialiseerd, heeft een betere foutafhandeling in de standaardbibliotheek, gebruikt standaard het concept van onveranderlijke referenties en variabelen en biedt sterke statische typering om logische fouten te minimaliseren.

Bron: opennet.ru

Voeg een reactie