Miguel Ojeda, autor projektu Rust-for-Linux, navrhl pro vývojáře jádra Linux vydání v8 komponentů pro vývoj zařízení pomocí jazyka Rust. Toto je revize patchů s ohledem na první verzi, která byla publikována bez číslování verze. Podpora Rustu je považována za experimentální, ale již byla zahrnuta do větve linux-next, přičemž se očekává integrace do podzimního vydání 5.20/6.0 a je dostatečně rozvinutá pro zahájení práce na vytváření abstrahujících vrstev nad subsystémy jádra, stejně jako pro psaní ovladačů a modulů. Vývoj je financován společností Google a organizací ISRG (Internet Security Research Group), která je zakladatelem projektu Let’s Encrypt a podporuje prosazování HTTPS a rozvoj technologií pro zvýšení bezpečnosti internetu.
V nové verzi:
- Nástroje a verze knihovny alloc, zbavené možných generací stavu 'panic' při vzniku chyb, byly aktualizovány na verzi Rust 1.62. Ve srovnání s dříve používanou verzí byla v nástrojích Rust stabilizována podpora funkcionality const_fn_trait_bound, používané v patchích pro jádro.
- Kód vazeb byl přesunut do samostatného crate-balíčku 'bindings', což usnadňuje znovu sestavení v případě změn pouze v hlavním balíčku 'kernel'.
- Implementace makra 'concat_idents!' byla přepracována na formu procedurálního makra, které není vázáno na funkcionalitu concat_idents a umožňuje použití odkazů na lokální proměnné.
- Makro 'static_assert!' bylo přepracováno, což umožnilo použití 'core::assert!()' v jakémkoli kontextu místo konstant.
- Makro 'build_error!' bylo přizpůsobeno pro práci v režimu 'RUST_BUILD_ASSERT_{WARN,ALLOW}' pro moduly.
- Přidán samostatný soubor s nastavením 'kernel/configs/rust.config'.
- Zpracovávané v makropodstatě soubory '*.i' byly přejmenovány na '*.rsi'.
- Byla ukončena podpora sestavení Rust-komponent s úrovněmi optimalizace odlišnými od těch, které se používají pro kód psaný v jazyce C.
- Přidán modul fs, který poskytuje vazby pro práci se souborovými systémy. Byl navržen příklad jednoduchého souborového systému napsaného v jazyce Rust.
- Přidán modul workqueue pro práci se systémovými frontami (poskytuje vazby na struktury jádra work_struct a workqueue_struct).
- Pokračovalo se ve vývoji modulu kasync s implementací metod asynchronního programování (async). Přidán příklad funkčního jádrového TCP serveru napsaného v Rustu.
- Přidána možnost zpracování přerušení v jazyce Rust pomocí typů [Threaded]Handler a [Threaded]Registration.
- Přidán procedurální makro „#[vtable]“, které zjednodušuje práci s tabulkami ukazatelů na funkce, jako je struktura file_operations.
- Implementovány obousměrné propojené seznamy „unsafe_list::List“.
- Přidána počáteční podpora RCU (Read-copy-update) a typ Guard pro kontrolu vazby zamykání na čtení na aktuálním vlákně.
- Přidána funkce Task::spawn() pro vytváření a automatické spouštění jaderných vláken. Také přidána metoda Task::wake_up().
- Přidán modul delay, který umožňuje používat zpoždění (obal kolem msleep()).
Navrhované změny umožňují použít Rust jako druhý jazyk pro vývoj ovladačů a modulů jádra. Podpora Rustu je prezentována jako volba, která není aktivní ve výchozím nastavení a nevyžaduje zahrnutí Rustu mezi povinné závislosti pro sestavení jádra. Použití Rustu pro vývoj ovladačů umožní s minimálním úsilím vytvářet bezpečné a kvalitnější ovladače, zbavené problémů jako je přístup do oblasti paměti po jejím uvolnění, dereference nulových ukazatelů a přetečení bufferu.
Bezpečná práce s pamětí je zajištěna v Rustu během kompilace prostřednictvím kontroly odkazů, sledování vlastnictví objektů a zohlednění doby života objektů (oblastí viditelnosti), stejně jako hodnocením správnosti přístupu k paměti během vykonávání kódu. Rust také poskytuje prostředky k ochraně před přetečením celočíselných hodnot, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) odkazů a proměnných ve výchozím nastavení, a nabízí silnou statickou typizaci pro minimalizaci logických chyb.
Zdroj: opennet.ru
