Miguel Ojeda, autor projektu Rust-for-Linux, navrhl vývojářům jádra Linux třetí variantu komponentů pro vývoj ovladačů zařízení v jazyce Rust. Podpora Rust je považována za experimentální, ale již byla schválena k začlenění do větve linux-next. Vývoj je financován společností Google a organizací ISRG (Internet Security Research Group), která je zakladatelem projektu Let’s Encrypt a podporuje propagaci HTTPS a rozvoj technologií pro zvýšení bezpečnosti internetu.
Připomínáme, že navržené změny umožňují používat Rust jako druhý jazyk pro vývoj ovladačů a modulů jádra. Podpora Rustu je zvažována jako volba, která není aktivní ve výchozím nastavení a nevede k zahrnutí Rustu mezi povinné závislosti při sestavení jádra. Použití Rustu pro vývoj ovladačů umožní s minimálními námahou vytvářet bezpečné a kvalitnější ovladače, zbavené problémů, jako je přístup k oblasti paměti po jejím uvolnění, dereference nulových ukazatelů a překročení hranic 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.
V nové verzi záplat bylo pokračováno v odstraňování připomínek vznesených během diskuse první a druhé verze záplat. Nejdůležitější změny zahrnují:
- Byl proveden přechod na používání stabilního vydání kompilátoru Rust 1.57 jako referenčního a byla zajištěna vazba na stabilizovanou verzi jazyka Rust 2021. Dříve byly záplaty vázány na beta-větev Rust a využívaly některé funkce jazyka, které spadají do kategorie nestabilních. Přechod na specifikaci Rust 2021 umožnil zahájit práci na odstranění použití v záplatách takových nestabilních funkcí, jako jsou const_fn_transmute, const_panic, const_unreachable_unchecked a core_panic a try_reserve.
- Pokračovalo se v rozvoji varianty Rust-knihovny alloc, upravené tak, aby odstranila funkce správy paměti s možnou generací stavu „panic“ při vzniku chyb, jako je nedostatek paměti. V nové verzi byly implementovány možnosti „no_rc“ a „no_sync“ pro vypnutí funkčnosti, která se v Rust-kódu pro jádro nepoužívá, což dělá knihovnu modulárnější. Pokračuje spolupráce s hlavními vývojáři alloc, zaměřená na přesun nezbytných změn pro jádro do hlavního složení knihovny. Do základní Rust knihovny (core) byla přenesena možnost „no_fp_fmt_parse“, potřebná pro funkci knihovny na úrovni jádra.
- Byla provedena údržba kódu za účelem odstranění možných varování kompilátoru při sestavování jádra v režimu CONFIG_WERROR. Při sestavování kódu v jazyce Rust byly zahrnuty další diagnostické režimy kompilátoru a varování linteru Clippy.
- Byly navrženy abstrakce pro použití v kódu v jazyce Rust, jako jsou seqlock (sekvenční zámky), callbacky pro správu napájení, I/O paměť (readX/writeX), obsluhy přerušení a vláken, GPIO, přístup k zařízením, ovladačům a účtům.
- Byly rozšířeny nástroje pro vývoj ovladačů s využitím přesunovatelných mutexů, bitových iterátorů, zjednodušených obalů nad ukazateli, vylepšené diagnostiky chyb a infrastruktury, která není závislá na datové sběrnici.
- Byla vylepšena práce s odkazy pomocí zjednodušeného typu Ref, založeného na backendu refcount_t, který využívá stejnojmenné API jádra pro počítání odkazů. Podpora typů Arc a Rc, poskytovaných ve standardní knihovně alloc, byla odstraněna a není dostupná v kódu běžícím na úrovni jádra (pro samotnou knihovnu byly připraveny možnosti, které tyto typy deaktivují).
- Do souboru patchů byl přidán variant ovladače PL061 GPIO, přepsaný do Rustu. Vlastností ovladače je, že jeho implementace téměř řádek po řádku odpovídá existujícímu ovladači GPIO v jazyce C. Pro vývojáře, kteří chtějí poznat vytvoření ovladačů v Rustu, bylo připraveno řádkové srovnání, které umožňuje pochopit, do jakých konstrukcí v Rustu byl kód v C přetvořen.
- Do hlavní kódové základny Rustu byl přijat rustc_codegen_gcc, backend rustc pro GCC, který realizuje možnost v předstihu provedené (AOT) kompilace pomocí knihovny libgccjit. Při řádném rozvoji backendu umožní sestavování v jádře používaného Rust kódu pomocí GCC.
- Kromě společností ARM, Google a Microsoft projevila zájem o použití jazyka Rust v jádře Linux společnost Red Hat. Připomeňme, že Google přímo podporuje projekt Rust for Linux, vyvíjí novou implementaci mechanismu meziprocesorové komunikace Binder v Rustu a zvažuje možnost přepracování různých ovladačů v Rustu. Společnost Microsoft zahájila implementaci ovladačů pro Hyper-V v Rustu. Společnost ARM pracuje na vylepšení podpory Rustu pro systémy na bázi procesorů ARM. Společnost IBM realizovala podporu Rustu v jádře pro systémy PowerPC.
Zdroj: opennet.ru
