Miguel Ojeda, autor projektu Rust-for-Linux, navrženo k posouzení vývojáři jádra Linux Třetí verze komponent pro vývoj ovladačů zařízení v Rustu. Podpora Rustu je považována za experimentální, ale již byla schválena k zařazení do větve linux-next. Vývoj je financován společností Google a ISRG (Internet Security Research Group), zakladatelem projektu Let's Encrypt, který propaguje HTTPS a vývoj technologií pro zlepšení internetové bezpečnosti.
Připomeňme, že navrhované změny umožňují použít Rust jako druhý jazyk pro vývoj ovladačů a modulů jádra. Podpora Rust je prezentována jako možnost, která není ve výchozím nastavení povolena a nevede k zahrnutí Rust mezi požadované závislosti sestavení jádra. Použití Rustu k vývoji ovladačů vám umožní vytvářet bezpečnější a lepší ovladače s minimálním úsilím, bez problémů, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů a přetečení vyrovnávací paměti.
Bezpečnost paměti je v Rustu poskytována v době kompilace prostřednictvím kontroly referencí, sledováním vlastnictví objektu a životnosti objektu (rozsahu) a také prostřednictvím vyhodnocování správnosti přístupu do paměti během provádění kódu. Rust také poskytuje ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, standardně aplikuje koncept neměnných referencí a proměnných, nabízí silné statické typování pro minimalizaci logických chyb.
Nová verze záplaty i nadále řeší obavy vznesené během diskuse o první a druhé verzi záplaty. Mezi nejvýznamnější změny patří:
- Přechod na používání stabilní verze Rustu 1.57 jako referenčního kompilátoru byl dokončen a byla zajištěna vazba na stabilní jazykovou edici Rust 2021. Dříve byly záplaty vázány na beta větev Rustu a používaly některé jazykové funkce klasifikované jako nestabilní. Přechod na specifikaci Rust 2021 nám umožnil zahájit práci na odstranění nestabilních funkcí, jako jsou const_fn_transmute, const_panic, const_unreachable_unchecked, core_panic a try_reserve, z záplat.
- Vývoj verze knihovny alloc pro Rust, která je součástí oprav, pokračuje. Tato verze byla upravena tak, aby se zabránilo potenciálnímu generování paniky ze strany funkcí alokace paměti při výskytu chyb, jako je například nedostatek paměti. Nová verze implementuje možnosti „no_rc“ a „no_sync“ pro deaktivaci funkcí, které nejsou použity v jádru kódu Rustu, čímž se knihovna stává modulárnější. Pokračují práce s vývojáři jádra knihovny alloc na migraci změn potřebných pro jádro knihovny. Možnost „no_fp_fmt_parse“, která je nezbytná pro fungování knihovny na úrovni jádra, byla migrována do jádra knihovny Rust.
- Kód byl vyčištěn, aby se eliminovala možná varování kompilátoru při sestavování jádra v režimu CONFIG_WERROR. Při sestavování kódu Rustu jsou povoleny další diagnostické režimy kompilátoru a varování Clippy linter.
- Abstrakce jsou navrženy pro použití v kódu Rust pro seqlocky (sekvenční zámky), zpětná volání pro správu napájení, I/O paměť (readX/writeX), obslužné rutiny přerušení a vláken, GPIO, přístup k zařízením, ovladačům a přihlašovacím údajům.
- Nástroje pro vývoj ovladačů byly rozšířeny o pohyblivé mutexy, bitové iterátory, zjednodušené obaly ukazatelů, vylepšenou diagnostiku selhání a infrastrukturu nezávislou na datové sběrnici.
- Zpracování referencí bylo vylepšeno pomocí zjednodušeného typu Ref založeného na backendu refcount_t, který pro počítání referencí používá stejnojmenné API jádra. Podpora pro typy Arc a Rc poskytovaná standardní knihovnou alloc byla odstraněna a není dostupná v kódu na úrovni jádra (možnosti pro zakázání těchto typů byly poskytnuty pro samotnou knihovnu).
- Záplaty obsahují verzi ovladače PL061 GPIO přepsanou v Rustu. Unikátní vlastností tohoto ovladače je, že jeho implementace je téměř řádek po řádku identická se stávajícím ovladačem GPIO v jazyce C. Pro vývojáře, kteří se chtějí naučit vytvářet ovladače v Rustu, je k dispozici řádkové srovnání, které jim pomůže pochopit konstrukce Rustu, na které byl kód v jazyce C převeden.
- Základní kódová základna Rustu využívá rustc_codegen_gcc, což je backend pro GCC, který implementuje kompilaci ahead-of-time (AOT) pomocí knihovny libgccjit. S odpovídajícím vývojem umožní backend kompilaci kódu Rustu používaného v jádře pomocí GCC.
- Kromě společností ARM, Google a Microsoft je o použití jazyka Rust v jádře zájem. Linux uvedl Red Hat. Pro připomenutí, Google přímo podporuje projekt Rust. Linux, vyvíjí novou implementaci mechanismu meziprocesové komunikace Binder v Rustu a zvažuje přepsání různých ovladačů v Rustu. Microsoft začal implementovat ovladače pro Hyper-V v Rustu. ARM pracuje na vylepšení podpory Rustu pro systémy založené na procesorech ARM. IBM implementovala podporu Rustu do jádra pro systémy PowerPC.
Zdroj: opennet.ru
