Miguel Ojeda, de auteur van het Rust-for-Linux-project, heeft een derde variant van componenten voor de ontwikkeling van apparaatdrivers in de programmeertaal Rust ter overweging aangeboden aan de Linux-kernelontwikkelaars. De ondersteuning voor Rust wordt als experimenteel beschouwd, maar is al goedgekeurd voor opname in de linux-next tak. De ontwikkeling wordt gefinancierd door Google en de 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 een veiliger internet.
Laten we niet vergeten dat de voorgestelde wijzigingen het mogelijk maken om Rust als tweede taal te gebruiken voor het ontwikkelen van stuurprogramma's en kernelmodules. Ondersteuning voor Rust wordt gepresenteerd als een optie die standaard niet is ingeschakeld en die niet leidt tot het opnemen van Rust in de verplichte build afhankelijkheden van de kernel. Het gebruik van Rust voor het ontwikkelen van stuurprogramma's zal het mogelijk maken om met minimale inspanning veilige en kwalitatief hoogwaardige stuurprogramma's te creëren, vrij van problemen zoals het aanspreken van geheugengebieden na vrijgave, het de-referencen van null-pointers en buffer-overflows.
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.
In de nieuwe versie van de patches is de afhandeling van opmerkingen, gemaakt tijdens de discussie over de eerste en tweede versies van de patches, voortgezet. De meest opvallende wijzigingen zijn:
- De overstap is gemaakt naar het gebruik van de stabiele release van Rust 1.57 als referentiecompilator en er is een koppeling tot stand gebracht met de gestabiliseerde editie van de programmeertaal Rust 2021. Eerder waren de patches gekoppeld aan de bètaversie van Rust en gebruikten ze enkele functies van de taal die onder de categorie instabiel vallen. De overstap naar de Rust 2021-specificatie heeft het mogelijk gemaakt om te beginnen met het verwijderen van het gebruik van instabiele functies in de patches, zoals const_fn_transmute, const_panic, const_unreachable_unchecked en core_panic en try_reserve.
- De ontwikkeling van de Rust-bibliotheek alloc, die deel uitmaakt van de patches, is voortgezet, waarbij functies voor het toewijzen van geheugen zijn aangepast om mogelijke generaties van de status ‘panic’ te vermijden bij fouten zoals geheugengebrek. In de nieuwe versie zijn de opties ‘no_rc’ en ‘no_sync’ geïmplementeerd om functionaliteit uit te schakelen die niet in de Rust-code voor de kernel wordt gebruikt, waardoor de bibliotheek modulaire wordt. De samenwerking met de hoofdontwikkelaars van alloc gaat door, gericht op de integratie van de noodzakelijke wijzigingen voor de kernel in de hoofdversie van de bibliotheek. De optie ‘no_fp_fmt_parse’, die nodig is voor de werking van de bibliotheek op kernelniveau, is overgebracht naar de basisbibliotheek van Rust (core).
- De code is opgeschoond om mogelijke compilatorwaarschuwingen te vermijden bij het bouwen van de kernel met de CONFIG_WERROR-instelling. Tijdens de compilatie van de Rust-code zijn aanvullende diagnostische modi van de compilator en waarschuwingen van de linter Clippy ingeschakeld.
- Abstracties zijn voorgesteld voor gebruik in Rust-code voor seqlock-blokkeringen (sequence locks), callback-aanroepen voor stroombeheer, I/O-geheugen (readX/writeX), interrupt handlers en threads, GPIO, toegang tot apparaten, stuurprogramma's en gegevens.
- De middelen voor het ontwikkelen van stuurprogramma's zijn uitgebreid met verplaatsbare mutexen, bit-iterators, vereenvoudigde wrappers over pointers, verbeterde foutdiagnose en een infrastructuur die onafhankelijk is van de data bus.
- De werking met verwijzingen is verbeterd met een vereenvoudigd type Ref, gebaseerd op de backend refcount_t, dat de gelijknamige kernel-API voor referentietelling gebruikt. Ondersteuning voor de types Arc en Rc, die in de standaardbibliotheek alloc beschikbaar zijn, is verwijderd en niet beschikbaar in code die op kernniveau wordt uitgevoerd (voor de bibliotheek zijn opties voorbereid om deze types uit te schakelen).
- De patches bevatten een versie van de PL061 GPIO-stuurprogramma, herschreven in Rust. Kenmerkend voor de stuurprogramma is dat de implementatie vrijwel regel voor regel de bestaande GPIO-stuurprogramma in C herhaalt. Voor ontwikkelaars die kennis willen maken met het maken van stuurprogramma's in Rust, is een regel-voor-regel vergelijking voorbereid die laat zien in welke constructies de C-code is omgezet naar Rust.
- De belangrijkste codebasis van Rust bevat nu rustc_codegen_gcc, de GCC backend voor rustc, die proactieve (AOT) compilatie mogelijk maakt met behulp van de libgccjit-bibliotheek. Met de juiste ontwikkeling van de backend zal het mogelijk zijn om de in de kernel gebruikte Rust-code te compileren met GCC.
- Naast de bedrijven ARM, Google en Microsoft heeft ook Red Hat interesse getoond in het gebruik van Rust in de Linux-kernel. Ter herinnering: Google biedt rechtstreeks ondersteuning voor het project Rust for Linux, ontwikkelt een nieuwe implementatie van het inter-process communication-mechanisme Binder in Rust en overweegt de herschrijving van verschillende stuurprogramma's naar Rust. Microsoft is begonnen met de implementatie van stuurprogramma's voor Hyper-V in Rust. ARM werkt aan het verbeteren van de ondersteuning voor Rust voor systemen op basis van ARM-processors. IBM heeft ondersteuning voor Rust in de kernel geïmplementeerd voor PowerPC-systemen.
Bron: opennet.ru
