Šestá verze patchů pro jádro Linux s podporou jazyka Rust

Miguel Ojeda, autor projektu Rust-for-Linux, navrhl, aby vývojáři jádra Linux zvážili vydání verze 6 komponent pro vývoj ovladačů zařízení v jazyce Rust. Toto je sedmá edice patchů s ohledem na první verzi, která byla publikována bez číselné verze. Podpora Rustu se považuje za experimentální, ale již je zahrnuta ve větvi linux-next a je dostatečně vyvinuta pro zahájení práce na vytváření vrstev abstrakce 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 šíření HTTPS a rozvoj technologií pro zvýšení bezpečnosti internetu.

V nové verzi:

  • Nástroj a varianta knihovny alloc, zbavená možných generací stavu „panic“ při výskytu chyb, byly aktualizovány na verzi Rust 1.60, ve které je stabilizována podpora režimu „maybe_uninit_extra“, používaného v patchech pro jádro.
  • Byla přidána možnost provádění testů z dokumentace (testy, které jsou současně příklady v dokumentaci), prostřednictvím transformace během kompilace testů vázaných na API jádra na testy KUnit prováděné během startu jádra.
  • Byly přijaty požadavky, podle kterých testy nesmí vést k výstupu varování linteru Clippy, stejně jako kódy pro jádro napsané v jazyce Rust.
  • Byla navržena počáteční implementace modulu „net“ se síťovými funkcemi. Kód v jazyce Rust má přístup k takovým síťovým strukturám jádra, jako jsou „Namespace“ (na základě struktury jádra „struct net“), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) a jejich ekvivalentům pro IPv6.
  • Byla implementována počáteční podpora metod asynchronního programování (async), realizovaná ve formě modulu kasync. Například lze vytvářet kód fungující v asynchronním režimu pro manipulaci s TCP sockety: 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?; } }
  • Byl přidán modul net::filter pro manipulaci s filtry síťových paketin. Byl přidán příklad rust_netfilter.rs s implementací filtru v jazyce Rust.
  • Byla přidána implementace jednoduchého mutexu smutex::Mutex, který nevyžaduje přiřazení (pinning).
  • Byla přidána blokace NoWaitLock, která nikdy nevede k čekání na uvolnění, a v případě obsazení jiným vláknem vyvolá chybu při pokusu o získání blokace místo zastavení volajícího.
  • Byla přidána blokace RawSpinLock, která odpovídá raw_spinlock_t v jádře a používá se v sekcích, které nemohou být ve stavu čekání.
  • Byl přidán typ ARef pro odkazy na objekt, na který se používá mechanismus počítání odkazů (always-refcounted).
  • V backendu rustc_codegen_gcc, který umožňuje používat knihovnu libgccjit z projektu GCC jako generátor kódu pro rustc, byla implementována možnost bootstrapování rustc. Pod bootstrapováním kompilátoru se rozumí schopnost používat v rustc generátor kódu založený na GCC pro sestavení samotného kompilátoru rustc. Kromě toho byly v nedávné vydání GCC 12.1 zahrnuty opravy v libgccjit potřebné pro správnou funkčnost rustc_codegen_gcc. Probíhá příprava na zajištění instalace rustc_codegen_gcc pomocí nástroje rustup.
  • Byl zaznamenán pokrok ve vývoji frontendu GCC gccrs s implementací kompilátoru jazyka Rust na bázi GCC. V současné době na gccrs pracují v režimu plného zaměstnání dva vývojáři.

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.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster