Miguel Ojeda, autor projektu Rust-for-Linux, navrhol pre vývojárov jadra Linux vydanie v6 komponentov na vývoj ovládačov zariadení v jazyku Rust. Toto je siedma edícia záplat s ohľadom na prvú verziu, ktorá bola publikovaná bez čísla verzie. Podpora Rust sa považuje za experimentálnu, ale už je zahrnutá vo vetve linux-next a je dostatočne rozvinutá na začatie práce na vytváraní abstraktných vrstiev nad subsystémami jadra, ako aj na písaní ovládačov a modulov. Vývoj je financovaný spoločnosťou Google a organizáciou ISRG (Internet Security Research Group), ktorá je zakladateľom projektu Let’s Encrypt a podporuje propagáciu HTTPS a rozvoj technológií na zvýšenie bezpečnosti internetu.
V novej verzii:
- Nástroje a verzia knižnice alloc, zbavené možných generácií stavu „panic“ pri vzniku chýb, boli aktualizované na vydanie Rust 1.60, v ktorom bola stabilizovaná podpora režimu „maybe_uninit_extra“, ktorý sa používa vo záplatách pre jadro.
- Bola pridaná možnosť vykonávania testov z dokumentácie (testy, ktoré sú zároveň príkladmi v dokumentácii), prostredníctvom transformácie počas kompilácie testov, viazaných na API jadra, na testy KUnit, ktoré sa vykonávajú počas zavádzania jadra.
- Boli prijaté požiadavky, v súlade s ktorými testy nesmú viesť k výstupu varovania linterského nástroja Clippy, ako ani kódu pre jadro v jazyku Rust.
- Bola navrhnutá základná implementácia modulu „net“ s prístupom k sieťovým funkciám. Pre kód v jazyku Rust bol poskytnutý prístup k takým sieťovým štruktúram jadra, ako sú „Namespace“ (na báze štruktúry jadra „struct net“), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) a ich ekvivalentom pre IPv6.
- Bola implementovaná základná podpora asynchrónneho programovania (async) vo forme modulu kasync. Napríklad je možné vytvárať asynchrónne fungujúci kód na manipuláciu s TCP-socketmi: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- Bol pridaný modul net::filter na manipuláciu s filtrami sieťových paketov. Bol pridaný príklad rust_netfilter.rs s implementáciou filtra v jazyku Rust.
- Pridaná implementácia jednoduchého mutexu smutex::Mutex, ktorý nevyžaduje viazanie (pinning).
- Pridaná blokácia NoWaitLock, ktorá nikdy nevedie k čakaniu na uvoľnenie, a v prípade obsadenia iným vláknom spôsobí zobrazenie chyby pri pokuse o získanie blokácie namiesto zastavenia volajúceho.
- Pridaná blokácia RawSpinLock, ktorá sa zhoduje s raw_spinlock_t v jadre, používaná v sekciách, ktoré sa nemôžu nachádzať v stave čakania.
- Pridaný typ ARef pre odkazy na objekt, ktorému sa aplikuje mechanizmus počítania odkazov (always-refcounted).
- V backendu rustc_codegen_gcc, ktorý umožňuje používať knižnicu libgccjit z projektu GCC ako generátor kódu v rustc a zabezpečuje v rustc podporu dostupných architektúr a optimalizácií v GCC, bola implementovaná možnosť bootstrappingu kompilátora rustc. Pod bootstrappingom kompilátora sa rozumie možnosť používať v rustc generátor kódu založený na GCC na zostavenie samotného kompilátora rustc. Okrem toho, v nedávnej verzii GCC 12.1 boli zahrnuté opravy v libgccjit, ktoré sú potrebné pre správnu funkciu rustc_codegen_gcc. Prebieha príprava na poskytnutie možnosti inštalácie rustc_codegen_gcc pomocou nástroja rustup.
- Sleduje sa pokrok vo vývoji GCC front-endu gccrs s implementáciou kompilátora jazyka Rust na báze GCC. V súčasnosti na gccrs v režime plnej prevádzky pracujú dvaja vývojári.
Pripomeňme, že navrhované zmeny umožňujú používať Rust ako druhý jazyk na vývoj ovládačov a modulov jadra. Podpora Rust sa prezentuje ako možnosť, ktorá nie je predvolene aktívna a nevedie k zaradeniu Rustu medzi povinné zostavovacie závislosti jadra. Použitie Rustu na vývoj ovládačov umožní s minimálnym úsilím vytvárať bezpečné a kvalitnejšie ovládače, zbavené takých problémov ako je prístup do pamäte po jej uvoľnení, dereferencovanie nulových ukazovateľov a pretečenie vyrovnávacej pamäte.
Bezpečná práca s pamäťou je v Rust zabezpečená počas kompilácie prostredníctvom overovania referencií, sledovania vlastníctva objektov a zohľadnenia životnosti objektov (oblasti viditeľnosti), ako aj prostredníctvom hodnotenia správnosti prístupu k pamäti počas vykonávania kódu. Rust tiež poskytuje prostriedky na ochranu pred pretečením celočíselných hodnôt, vyžaduje povinnú inicializáciu hodnôt premenných pred ich použitím, lepšie spracováva chyby v štandardnej knižnici, aplikuje koncept nemennosti (immutable) odkazov a premenných ako predvolených a ponúka silnú statickú typizáciu na minimalizáciu logických chýb.
Zdroj: opennet.ru
