Šestá verze záplat pro linuxové jádro s podporou jazyka Rust

Miguel Ojeda, autor projektu Rust-for-Linux, navrhl vydání komponent v6 pro vývoj ovladačů zařízení v jazyce Rust ke zvážení vývojářům linuxového jádra. Toto je sedmé vydání záplat, s přihlédnutím k první verzi, publikované bez čísla verze. Podpora rzi je považována za experimentální, ale je již zahrnuta ve větvi linux-next a je dostatečně rozvinutá, aby mohla začít pracovat na vytváření abstraktních vrstev nad subsystémy jádra, stejně jako na psaní ovladačů a modulů. 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.

V nové verzi:

  • Sada nástrojů a varianta knihovny alloc, zbavená možného generování „panického“ stavu při výskytu chyb, byly aktualizovány na vydání Rust 1.60, které stabilizuje podporu pro režim „možná_uninit_extra“ používaný v záplatách jádra.
  • Přidána možnost spouštět testy z dokumentace (testy, které jsou v dokumentaci také používány jako příklady), prostřednictvím převodu testů spojených s API jádra v době kompilace na testy KUnit prováděné během načítání jádra.
  • Byly přijaty požadavky, aby testy nevedly k varování Clippy linter, stejně jako kód jádra Rust.
  • Je navržena počáteční implementace modulu „net“ se síťovými funkcemi. Rust kód má přístup ke strukturám sítě jádra, jako je jmenný prostor (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 ekvivalenty IPv6 .
  • Počáteční podpora pro techniky asynchronního programování (async), implementovaná ve formě modulu kasync. Můžete například napsat asynchronní kód pro manipulaci se sokety TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).wait?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).wait?; } }
  • Přidán modul net::filter pro manipulaci s filtry síťových paketů. Přidán příklad rust_netfilter.rs s implementací filtru v jazyce Rust.
  • Přidána implementace jednoduchého mutexu smutex::Mutex, který nevyžaduje připínání.
  • Přidán NoWaitLock, který nikdy nečeká na zámek a je-li obsazen jiným vláknem, způsobí, že při pokusu o získání zámku místo zastavení volajícího dojde k nahlášení chyby.
  • Přidán RawSpinLock, identifikovaný raw_spinlock_t v jádře, pro použití na sekce, které nemohou být nečinné.
  • Přidán typ Aref pro odkazy na objekt, na který je aplikován mechanismus počítání odkazů (vždy refcounted).
  • Backend rustc_codegen_gcc, který vám umožňuje používat knihovnu libgccjit z projektu GCC jako generátor kódu v rustc, který poskytuje rustc podporu pro architektury a optimalizace dostupné v GCC, implementoval možnost bootstrapping kompilátoru rustc. Propagace kompilátoru znamená možnost použít generátor kódu založený na GCC v rustc k sestavení samotného kompilátoru rustc. Kromě toho nedávné vydání GCC 12.1 obsahuje opravy knihovny libgccjit nezbytné pro správnou funkci rustc_codegen_gcc. Probíhají přípravy na poskytnutí možnosti nainstalovat rustc_codegen_gcc pomocí nástroje rustup.
  • Je zaznamenán pokrok ve vývoji GCC frontendu gccrs s implementací jazykového kompilátoru Rust založeného na GCC. V současnosti na gccrs pracují dva vývojáři na plný úvazek.

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.

Zdroj: opennet.ru

Přidat komentář