Miguel Ojeda, a szerzője a Rust-for-Linux projektnek, javasolta a Linux kernel fejlesztői számára a v6 összetevők kiadását, melyek a Rust nyelvű eszközmeghajtók fejlesztésére vonatkoznak. Ez a hetedik kiadása a patch-eknek, figyelembe véve az első verziót, amely verziószám nélkül jelent meg. A Rust támogatása kísérleti jellegű, de már be van építve a linux-next ágba és elegendően ki van fejlesztve ahhoz, hogy megkezdődjön az absztrakciós rétegek létrehozása a kernel alrendszerek felett, valamint a meghajtók és modulok írása. A fejlesztést a Google és az ISRG (Internet Security Research Group) finanszírozza, amely a Let’s Encrypt projekt alapítója, és támogatja a HTTPS terjesztését valamint az internet biztonságának növelésére irányuló technológiák fejlesztését.
Az új verzióban:
- Az eszközkészlet és az alloc könyvtár verziója, amely megszabadít a lehetséges „panic” állapotok generálásától hibaelhárítás közben, frissítve lett a Rust 1.60 kiadásra, amelyben stabilizálták a „maybe_uninit_extra” mód támogatását, amit a kernel patch-eiben használnak.
- Hozzáadták a lehetőséget a dokumentációban szereplő tesztek futtatására (tesztek, amelyek egyben példák is a dokumentációban), a tesztek fordítási időben történő átalakításán keresztül, amelyek az API-kernelre fektetett, a KUnit tesztekké alakulnak, amelyek a kernel betöltésének időpontjában futnak.
- Elfogadták azokat a követelményeket, amelyek alapján a tesztek nem okozhatnak figyelmeztetést a Clippy lint előírásai szerint, akárcsak a Rust nyelvű kernel kódja.
- Javasolták a „net” modul kezdeti megvalósítását a hálózati funkciók számára. A Rust nyelvű kód számára hozzáférést biztosítanak a kernel hálózati struktúráihoz, mint például: „Namespace” (a kernel „struct net” struktúrájára alapozva), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) és azok IPv6 megfelelői.
- Megvalósították a kezdeti támogatást az aszinkron programozási módszerekhez (async), amely a kasync modul formájában került megvalósításra. Például aszinkron módon működő kódot hozhatunk létre TCP-socketek manipulálására: 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?; } }
- Hozzáadták a net::filter modult, amely a hálózati csomagok szűrésével foglalkozik. Megjelent a rust_netfilter.rs példa, amely a Rust nyelvén írt szűrőt valósít meg.
- Hozzáadva a smutex::Mutex egyszerű megvalósítása, amely nem igényel kötést (pinning).
- Hozzáadva a NoWaitLock zár, amely soha nem okoz várakozást, és ha egy másik szál használja, hibaüzenetet ad vissza a zárolás megszerzésének megkísérlésekor ahelyett, hogy leállítaná a hívót.
- Hozzáadva a RawSpinLock zár, amely a kernelben szereplő raw_spinlock_t-nek felel meg, és olyan szakaszokhoz alkalmazható, amelyek nem várakozhatnak.
- Hozzáadva az ARef típus, amely a referenciák számolásának mechanizmusát alkalmazza (mindig számolt).
- A rustc_codegen_gcc háttérrendszerében, amely lehetővé teszi a GCC projekt libgccjit könyvtárának használatát kódgenerátorként a rustc számára, az elérhető GCC architektúrák és optimalizálások támogatásának biztosítására, megvalósult a rustc fordító (bootstrapping) ciklusának lehetősége. A fordító ciklusa alatt azt értjük, hogy a rustc használhatja a GCC alapú kódgenerátort a rustc compiler saját összeszerelésére. Továbbá a legújabb GCC 12.1 kiadásában javítások kerültek bevezetésre a libgccjit-be, amelyek a rustc_codegen_gcc megfelelő működéséhez szükségesek. Előkészületek folynak a rustc_codegen_gcc rustup segédprogram segítségével történő telepítésének biztosítására.
- Folyamatban van a GCC-felület gccrs fejlesztése, amely a Rust nyelv compilerének GCC alapú megvalósítása. Jelenleg a gccrs-en teljes munkaidőben dolgozó két fejlesztő van.
Ne feledjük, hogy a javasolt változások lehetővé teszik a Rust használatát második nyelvként a meghajtók és modulok fejlesztésében a kernelben. A Rust támogatása lehetőségként van megjelenítve, amely alapértelmezés szerint nem aktív, nem vezetve a Rust kötelező build függőségek közé történő bevonásához a kernelhez. A Rust használata a meghajtók fejlesztésében lehetővé teszi, hogy minimális erőfeszítéssel biztonságosabb és jobb minőségű meghajtókat készítsünk, amelyek mentesek az olyan problémáktól, mint a memória törlés utáni hozzáférés, null pointerek dereferálása és a buffer határai túllépése.
A memória biztonságos kezelése a Rust nyelvben a fordítás során a hivatkozások ellenőrzésével, az objektumok tulajdonlásának nyomon követésével, valamint az objektumok élettartamának (láthatóságának) figyelembevételével történik, továbbá a memóriához való hozzáférés helyességének értékelésével a kód futtatása alatt. A Rust eszközöket is biztosít a egész számok túlfutásának védelmére, kötelezővé teszi a változók értékeinek inicializálását használat előtt, jobban kezeli a hibákat a standard könyvtárban, alkalmazza az immutable (változhatatlan) hivatkozások és változók fogalmát alapértelmezés szerint, valamint erős statikus típust kínál a logikai hibák minimalizálására.
Forrás: opennet.ru
