A Linux kernel javításainak hatodik verziója a Rust nyelv támogatásával

Miguel Ojeda, a Rust-for-Linux projekt szerzője azt javasolta, hogy a Linux kernel fejlesztői megfontolják a v6-os összetevők kiadását az eszközillesztő-fejlesztéshez Rust nyelven. Ez a javítások hetedik kiadása, az első verzió figyelembevételével, verziószám nélkül megjelent. A Rust támogatás kísérleti jellegűnek tekinthető, de már benne van a linux-next ágban, és kellően fejlett ahhoz, hogy megkezdődjön a kernel alrendszerek feletti absztrakciós rétegek létrehozása, valamint az illesztőprogramok é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 a HTTPS-t és az internet biztonságát javító technológiák fejlesztését népszerűsíti.

Az új verzióban:

  • Az eszközkészlet és az alloc könyvtár egy változata, amely felmentett a „pánik” állapot esetleges generálásától hiba esetén, a Rust 1.60 kiadásra frissült, amely stabilizálja a kernelfoltokban használt „maybe_uninit_extra” mód támogatását.
  • Hozzáadtuk a dokumentációból a tesztek futtatásának lehetőségét (a dokumentációban példaként is használt tesztek), a kernel API-hoz kötött tesztek fordítási idejű konvertálásával a kernel betöltése során végrehajtott KUnit tesztekké.
  • Elfogadták azokat a követelményeket, amelyek szerint a tesztek nem eredményezhetnek Clippy linter figyelmeztetést, akárcsak a Rust kernelkód.
  • Javasoljuk a „net” modul kezdeti megvalósítását hálózati funkciókkal. A Rust kód hozzáféréssel rendelkezik olyan kernelhálózati struktúrákhoz, mint például a névtér (a struct net kernel struktúra alapján), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 ( struct sockaddr_in) és ezek IPv6 megfelelői. .
  • Az aszinkron programozási technikák (async) kezdeti támogatása a kasync modul formájában valósul meg. Például írhat aszinkron kódot a TCP socketek kezeléséhez: async fn echo_server(stream: TcpStream) -> Eredmény { let mut buf = [0u8; 1024]; ciklus { let n = stream.read(&mut buf).várakozik?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).várakozik?; } }
  • Net::filter modul hozzáadva a hálózati csomagszűrők kezeléséhez. Példa hozzáadva a Rust_netfilter.rs szűrő megvalósításához a Rust nyelven.
  • Egy egyszerű mutex smutex::Mutex megvalósítása hozzáadva, amely nem igényel rögzítést.
  • Hozzáadott NoWaitLock, amely soha nem vár a zárolásra, és ha egy másik szál foglalja el, hibajelentést okoz a zárolás megszerzésekor a hívó leállítása helyett.
  • Hozzáadott RawSpinLock, amelyet a raw_spinlock_t a kernelben azonosít, és olyan szakaszokra vonatkozik, amelyek nem lehetnek tétlen.
  • ARef típus hozzáadva egy olyan objektum hivatkozásaihoz, amelyre a hivatkozásszámláló mechanizmust alkalmazzák (mindig újraszámolva).
  • A rustc_codegen_gcc háttérrendszer, amely lehetővé teszi a GCC projekt libgccjit könyvtárának használatát kódgenerátorként a rustc-ben, hogy a rustc számára támogassa a GCC-ben elérhető architektúrákat és optimalizációkat, megvalósította a rustc fordító rendszerindításának lehetőségét. A fordító promóciója azt jelenti, hogy a rustc-ben GCC-alapú kódgenerátort használhatunk magának a rustc fordítónak az elkészítéséhez. Ezenkívül a GCC 12.1 legutóbbi kiadása tartalmazza a libgccjit javításait, amelyek a rustc_codegen_gcc megfelelő működéséhez szükségesek. Folyamatban vannak az előkészületek a rustc_codegen_gcc telepítésének lehetőségének biztosítására a rustup segédprogrammal.
  • Figyelemre méltó a GCC frontend gccrs fejlesztése a GCC-n alapuló Rust nyelvi fordító megvalósításával. Jelenleg két főállású fejlesztő dolgozik a gccrs-n.

Emlékezzünk vissza, hogy a javasolt változtatások lehetővé teszik a Rust második nyelvként való használatát illesztőprogramok és kernelmodulok fejlesztéséhez. A Rust támogatása olyan opcióként jelenik meg, amely alapértelmezés szerint nincs engedélyezve, és nem eredményezi, hogy a Rust szerepeljen a kernel szükséges összeállítási függőségeként. A Rust használata az illesztőprogramok fejlesztésére lehetővé teszi, hogy minimális erőfeszítéssel biztonságosabb és jobb illesztőprogramokat hozzon létre, olyan problémáktól mentesen, mint például a memória felszabadítása utáni hozzáférés, nullmutató hivatkozások és puffertúllépések.

A memóriabiztos kezelést a Rust fordítási időben biztosítja a referenciaellenőrzés, az objektum tulajdonjogának és az objektum élettartamának (hatókörének) nyomon követésével, valamint a kódvégrehajtás során a memória-hozzáférés helyességének értékelésével. A Rust védelmet nyújt az egész számok túlcsordulása ellen is, megköveteli a változó értékek kötelező inicializálását használat előtt, jobban kezeli a hibákat a szabványos könyvtárban, alapértelmezés szerint alkalmazza a megváltoztathatatlan hivatkozások és változók koncepcióját, erős statikus gépelést kínál a logikai hibák minimalizálása érdekében.

Forrás: opennet.ru

Hozzászólás