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

Miguel Ojeda, forfatter til Rust-for-Linux-projektet, foreslog udgivelsen af ​​v8-komponenter til udvikling af enhedsdrivere i Rust-sproget til overvejelse af Linux-kerneudviklere. Dette er den reviderede version af patches, der tager hensyn til den første version, udgivet uden et versionsnummer. Rustunderstøttelse betragtes som eksperimentel, men er allerede inkluderet i linux-next-grenen, hævder at være integreret i efterårsudgivelsen af ​​5.20/6.0 og er moden nok 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 udvikling af teknologier til at forbedre internetsikkerheden.

I den nye version:

  • Værktøjssættet og en variant af alloc-biblioteket, fri for mulig generering af en "panik"-tilstand, når der opstår fejl, er blevet opdateret til udgivelsen af ​​Rust 1.62. Sammenlignet med den tidligere brugte version har Rust-værktøjssættet stabiliseret understøttelse af const_fn_trait_bound-funktionaliteten brugt i kernepatches.
  • Bindingskoden er adskilt i en separat kassepakke "bindinger", hvilket forenkler genopbygningen, hvis der kun foretages ændringer i hovedpakkens "kerne".
  • Implementering af makroen "concat_idents!" omskrevet i form af en proceduremæssig makro, der ikke er bundet til concat_idents funktionaliteten og tillader brugen af ​​referencer til lokale variabler.
  • Makroen "static_assert!" er blevet omskrevet, hvilket tillader brugen af ​​"core::assert!()" i enhver sammenhæng i stedet for konstanter.
  • Makro "build_error!" tilpasset til at fungere, når "RUST_BUILD_ASSERT_{WARN,ALLOW}"-tilstanden er indstillet til moduler.
  • Tilføjet en separat fil med indstillingerne "kernel/configs/rust.config".
  • "*.i"-filerne, der behandles i makroerstatninger, er blevet omdøbt til "*.rsi".
  • Support til bygning af rustkomponenter med optimeringsniveauer, der er forskellige fra dem, der bruges til C-kode, er afbrudt.
  • Tilføjet fs-modul, som giver bindinger til arbejde med filsystemer. Et eksempel på et simpelt filsystem skrevet i Rust er givet.
  • Tilføjet arbejdskømodul til at arbejde med systemkøer (giver bindinger over work_struct og workqueue_struct kernestrukturerne).
  • Udviklingen af ​​kasync-modulet fortsatte med implementering af asynkrone programmeringsmetoder (async). Tilføjet et eksempel på en TCP-server på kerneniveau skrevet i Rust.
  • Tilføjet muligheden for at håndtere afbrydelser i Rust-sproget ved hjælp af typerne [Threaded]Handler og [Threaded]Registration`.
  • Tilføjet proceduremakro "#[vtable]" for at gøre det nemmere at arbejde med tabeller med funktionspointere, såsom file_operations-strukturen.
  • Tilføjet implementering af tovejs linkede lister "unsafe_list::List".
  • Tilføjet indledende understøttelse af RCU (Read-copy-update) og Guard-type for at kontrollere, om en læselås er bundet til den aktuelle tråd.
  • Tilføjet Task::spawn() funktion til at oprette og automatisk starte kernetråde. Tilføjede også Task::wake_up()-metoden.
  • Tilføjet et forsinkelsesmodul, der giver dig mulighed for at bruge forsinkelser (en indpakning over msleep()).

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 som f.eks. 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