Miguel Ojeda, forfatteren af Rust-for-Linux-projektet, har foreslået, at Linux-kernens udviklere overvejer udgivelsen af v8 komponenter til udvikling af enhedsdrivere i Rust. Dette er en revideret version af patches, der tager højde for den første version, der blev offentliggjort uden versionsnummer. Støtten til Rust betragtes som eksperimentel, men er allerede inkluderet i linux-next-grenen, sigter mod integration i efterårsudgaven 5.20/6.0 og er tilstrækkeligt udviklet til at begynde arbejdet med at skabe abstraheringslag over kernelens undersystemer samt til at skrive drivere og moduler. Udviklingen finansieres af Google og organisationen ISRG (Internet Security Research Group), som er grundlæggeren af Let’s Encrypt-projektet og fremmer HTTPS samt udvikling af teknologier for at øge internettets sikkerhed.
I den nye version:
- Værktøjerne og versionen af alloc-biblioteket, der er fri for mulige panik-genereringer ved fejl, er blevet opdateret til Rust 1.62. Sammenlignet med den tidligere anvendte version er støtten til const_fn_trait_bound-funktionaliteten blevet stabiliseret i Rust-værktøjerne, som anvendes i patches til kernen.
- Bindingskoden er blevet adskilt i en separat crate-pakke kaldet 'bindings', hvilket forenkler genopbygningen, hvis der kun laves ændringer i hovedpakken 'kernel'.
- Implementeringen af makroen 'concat_idents!' er blevet omskrevet som en procedurel makro, der ikke er bundet til concat_idents-funktionaliteten og tillader brug af referencer til lokale variabler.
- Makroen 'static_assert!' er blevet omskrevet, hvilket gør det muligt at bruge 'core::assert!()' i enhver kontekst i stedet for konstanter.
- Makroen 'build_error!' er blevet tilpasset til at fungere under indstillingen for modulerne 'RUST_BUILD_ASSERT_{WARN,ALLOW}'.
- Der er tilføjet en separat fil med indstillinger 'kernel/configs/rust.config'.
- Filene, der behandles i makropatændinger, '*.i', er blevet omdøbt til '*.rsi'.
- Støtten til opbygning af Rust-komponenter med optimeringsniveauer, der adskiller sig fra dem, der anvendes til C-kode, er ophørt.
- Der er tilføjet en fs-modul, der giver bindings til arbejde med filsystemer. Der er givet et eksempel på et simpelt filsystem skrevet i Rust.
- Der er tilføjet en workqueue-modul til arbejde med systemkøer (giver bindings over kernel-strukturerne work_struct og workqueue_struct).
- Udviklingen af modulet kasync er fortsat med implementeringen af metoder til asynkron programmering (async). Et eksempel på en fungerende TCP-server på kerne-niveau, skrevet i Rust, er tilføjet.
- Muligheden for at håndtere afbrydelser i Rust-sprog ved hjælp af traits [Threaded]Handler og typer [Threaded]Registration` er blevet tilføjet.
- Der er tilføjet en procedure-makro "#[vtable]", der forenkler arbejdet med tabeller af funktionspointere, såsom strukturen file_operations.
- Implementeringen af to-vejs kædede lister "unsafe_list::List" er blevet tilføjet.
- Indledende støtte til RCU (Read-copy-update) og typen Guard til at kontrollere bindingen af låsning til læsning til den nuværende tråd er tilføjet.
- Funktionen Task::spawn() til at oprette og automatisk starte kerne-tråde er blevet tilføjet. Metoden Task::wake_up() er også blevet tilføjet.
- Modulet delay er tilføjet, hvilket muliggør brug af forsinkelser (en wrapper over msleep()).
De foreslåede ændringer giver mulighed for at bruge Rust som det andet sprog til udvikling af drivere og kernemoduler. Rust-understøttelse præsenteres som en valgmulighed, der ikke er aktiv som standard og ikke får Rust til at blive en del af de obligatoriske byggemæssige afhængigheder for kernen. Brug af Rust til udvikling af drivere vil give mulighed for at skabe sikre og bedre kvalitetsdrivere med minimal indsats, fri for problemer som adgang til hukommelsesområder efter frigivelse, dereferering af nul-pegepunkter og buffer-overløb.
Sikker hukommelseshåndtering sikres i Rust under kompileringen gennem referencekontrol, overvågning af ejerskab af objekter og livscyklus (scope) af objekter, samt evaluering af korrekt hukommelsestilgang under kodeudførelse. Rust tilbyder også midler til beskyttelse mod heltalsoverskridelser, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med immutability (uændrede) referencer og variabler som standard, og tilbyder stærk statisk typekontrol for at minimere logiske fejl.
Kilde: opennet.ru
