Miguel Ojeda, de auteur van het Rust-for-Linux-project, heeft aan de ontwikkelaars van de Linux-kernel voorgesteld om versie 8 van de componenten voor het ontwikkelen van stuurprogramma's in Rust te overwegen. Dit is een herziene versie van de patches, die rekening houdt met de eerste versie die zonder versienummer is gepubliceerd. Ondersteuning voor Rust wordt als experimenteel beschouwd, maar is al opgenomen in de linux-next tak, heeft de ambitie om te worden geïntegreerd in de herfstrelease 5.20/6.0 en is voldoende ontwikkeld voor het starten van het werk aan abstractie lagen boven de subsysteems van de kernel, evenals voor het schrijven van stuurprogramma's en modules. De ontwikkeling wordt gefinancierd door Google en de organisatie ISRG (Internet Security Research Group), die de oprichter is van het Let’s Encrypt-project en bijdraagt aan de promotie van HTTPS en de ontwikkeling van technologieën voor het verbeteren van de veiligheid van het internet.
In de nieuwe versie:
- De toolkit en de variant van de alloc bibliotheek, vrijgesteld van mogelijke generatie van de status 'panic' bij fouten, zijn bijgewerkt naar Rust versie 1.62. In vergelijking met de eerder gebruikte versie is de ondersteuning voor de functionaliteit const_fn_trait_bound in de Rust-toolkit gestabiliseerd, die wordt gebruikt in de patches voor de kernel.
- De verbindingscode is verplaatst naar een afzonderlijk crate-pakket 'bindings', waardoor het eenvoudiger wordt om opnieuw te bouwen als er alleen wijzigingen in het hoofdpakket 'kernel' zijn.
- De implementatie van de macro 'concat_idents!' is herschreven in de vorm van een procedurele macro, niet gebonden aan de functionaliteit van concat_idents en die het gebruik van verwijzingen naar lokale variabelen toestaat.
- De macro 'static_assert!' is herschreven, waardoor 'core::assert!()' in elke context kan worden gebruikt in plaats van constanten.
- De macro 'build_error!' is aangepast voor gebruik bij het instellen van modules in de modus 'RUST_BUILD_ASSERT_{WARN,ALLOW}'.
- Er is een apart configuratiebestand toegevoegd 'kernel/configs/rust.config'.
- De in de macro-substituties verwerkte bestanden '*.i' zijn hernoemd naar '*.rsi'.
- De ondersteuning voor het bouwen van Rust-componenten met optimalisatieniveaus die verschillen van diegene die voor C-code worden gebruikt, is stopgezet.
- Er is een fs-module toegevoegd, die bindingen biedt voor het werken met bestandssystemen. Er is een voorbeeld van een eenvoudig bestandssysteem geschreven in Rust voorgesteld.
- Er is een workqueue-module toegevoegd voor het werken met systeemqueues (biedt bindingen bovenop de kernelstructuren work_struct en workqueue_struct).
- De ontwikkeling van de kasync-module is voortgezet met de implementatie van methoden voor asynchrone programmering (async). Er is een voorbeeld toegevoegd van een TCP-server die op kernel-niveau is geschreven in Rust.
- De mogelijkheid om onderbrekingen in de programmeertaal Rust te verwerken, is toegevoegd met behulp van trait [Threaded]Handler en type [Threaded]Registration.
- De procedurele macro ‘#[vtable]’ is toegevoegd, waardoor het werken met functiepointer-tabellen, zoals de structuur file_operations, eenvoudiger wordt.
- De implementatie van bidirectionele gekoppelde lijsten ‘unsafe_list::List’ is toegevoegd.
- Beginondersteuning voor RCU (Read-copy-update) en type Guard is toegevoegd om de binding van het leeslock aan de huidige thread te controleren.
- De functie Task::spawn() is toegevoegd voor het maken en automatisch starten van kernel-threads. Ook is de methode Task::wake_up() toegevoegd.
- De module delay is toegevoegd, waarmee vertragingen kunnen worden gebruikt (een wrapper over msleep()).
De voorgestelde wijzigingen maken het mogelijk om Rust te gebruiken als een tweede taal voor de ontwikkeling van stuurprogramma's en kernelmodules. De ondersteuning voor Rust wordt gepresenteerd als een optie die standaard niet is ingeschakeld en niet leidt tot de opname van Rust als een verplichte bouwafhankelijkheid van de kernel. Het gebruik van Rust voor de ontwikkeling van stuurprogramma's maakt het mogelijk om met minimale inspanning veilige en hoogwaardige stuurprogramma's te creëren, vrij van problemen zoals het aanspreken van geheugen na vrijgave, het derefereren van null pointers en buffer overflow.
Veilige geheugentoegang wordt in Rust tijdens de compilatie gegarandeerd door middel van referentietests, objecteigenaarschap en het bijhouden van de levensduur van objecten (scope), evenals door het evalueren van de geldigheid van geheugentoegang tijdens het uitvoeren van code. Rust biedt ook middelen om te beschermen tegen gehele getallenoverflows, vereist dat variabelen verplicht worden geïnitialiseerd voordat ze worden gebruikt, behandelt fouten beter in de standaardbibliotheek, past het concept van onveranderlijkheid (immutable) van verwijzingen en variabelen standaard toe en biedt sterke statische typecontrole om logische fouten te minimaliseren.
Bron: opennet.ru
