Třetí vydání patchů pro linuxové jádro s podporou jazyka Rust

Miguel Ojeda, autor projektu Rust-for-Linux, navrhl třetí komponentu pro vývoj ovladačů zařízení v jazyce Rust pro vývojáře linuxového jádra. Podpora Rust je považována za experimentální, ale již byla dohodnuta pro zahrnutí do větve linux-next. Vývoj financuje Google a ISRG (Internet Security Research Group), která je zakladatelem projektu Let's Encrypt a propaguje HTTPS a vývoj technologií pro zlepšení bezpečnosti internetu.

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 oprav nadále odstraňuje komentáře vznesené během diskuse o první a druhé verzi oprav. Nejvýraznější změny:

  • Byl proveden přechod na používání stabilního vydání Rust 1.57 jako referenčního kompilátoru a byl poskytnut odkaz na stabilizované vydání jazyka Rust 2021. Dříve byly záplaty vázány na beta větev Rust a používaly některé jazykové funkce, které byly klasifikovány jako nestabilní. Přechod na specifikaci Rust 2021 nám umožnil zahájit práci, abychom se vyhnuli použití takových nestabilních funkcí v opravách, jako je const_fn_transmute, const_panic, const_unavailable_unchecked a core_panic a try_reserve.
  • Vývoj alokační verze knihovny Rust zahrnuté v záplatách pokračoval, upraven tak, aby zbavil funkce alokace paměti možného generování „panického“ stavu, když dojde k chybě, jako je nedostatek paměti. Nová verze implementuje volby „no_rc“ a „no_sync“ pro deaktivaci funkcí nepoužívaných v kódu jádra Rust, díky čemuž je knihovna modulárnější. Pokračuje práce s hlavními vývojáři alloc, zaměřená na přenos změn potřebných pro jádro do hlavní knihovny. Volba „no_fp_fmt_parse“, potřebná pro fungování knihovny na úrovni jádra, byla přesunuta do základní knihovny (jádra) Rust.
  • Kód byl vyčištěn, aby se zbavil možných varování kompilátoru při sestavování jádra v režimu CONFIG_WERROR. Při vytváření kódu v 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), volání zpětného volání pro správu napájení, I/O paměť (readX/writeX), obsluhu přerušení a vláken, GPIO, přístup k zařízením, ovladačům a pověřením.
  • Nástroje pro vývoj ovladačů byly rozšířeny o přemístitelné mutexy, bitové iterátory, zjednodušené vazby ukazatelů, vylepšenou diagnostiku chyb a infrastrukturu nezávislou na datové sběrnici.
  • Vylepšená práce s odkazy pomocí zjednodušeného typu Ref, založeného na backendu refcount_t, který pro počítání referencí používá stejnojmenné kernel API. Podpora typů Arc a Rc poskytovaná ve standardní knihovně alloc byla odstraněna a není dostupná v kódu spouštěném na úrovni jádra (pro samotnou knihovnu byly připraveny možnosti, které tyto typy zakazují).
  • Záplaty obsahují verzi ovladače PL061 GPIO, přepsanou v Rustu. Zvláštností ovladače je, že jeho implementace téměř řádek po řádku opakuje stávající ovladač GPIO v jazyce C. Pro vývojáře, kteří se chtějí seznámit s tvorbou ovladačů v Rustu, bylo připraveno řádkové srovnání, které jim umožní pochopit, do kterých konstrukcí v Rustu se kód C převádí.
  • Hlavní kódová základna Rust přijala rustc_codegen_gcc, rustc backend pro GCC, který implementuje předběžnou kompilaci (AOT) pomocí knihovny libgccjit. Při správném vývoji backendu vám to umožní sbírat kód Rust zapojený do jádra pomocí GCC.
  • Kromě ARM, Googlu a Microsoftu projevil zájem o použití jazyka Rust v linuxovém jádře i Red Hat. Připomeňme, že Google přímo poskytuje podporu projektu Rust pro Linux, v Rustu vyvíjí novou implementaci meziprocesového komunikačního mechanismu Binder a zvažuje možnost přepracování různých ovladačů v Rustu. Microsoft začal implementovat ovladače pro Hyper-V v Rustu. ARM pracuje na vylepšení podpory Rust pro systémy založené na ARM. IBM implementovalo podporu Rust v jádře pro systémy PowerPC.

Zdroj: opennet.ru

Přidat komentář