A Linux kernel javításainak nyolcadik 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 v8-as összetevők kiadását az eszközillesztő-fejlesztéshez Rust nyelven. Ez a javítások felülvizsgált változata, 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, állítása szerint integrálva van az 5.20/6.0 őszi kiadásába, és elég érett ahhoz, hogy elkezdje a kernel alrendszerek feletti absztrakciós rétegek létrehozását, valamint az írási illesztőprogramokat. és modulok. 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:

  • A Rust 1.62 kiadásához frissítve lett az eszközkészlet és az alloc könyvtár egy változata, amely mentes a "pánik" állapot generálásától hiba esetén. A korábban használt verzióhoz képest a Rust eszközkészlet stabilizálta a kernelfoltokban használt const_fn_trait_bound funkciót.
  • A kötési kód külön ládacsomag „kötésekre” van szétválasztva, ami leegyszerűsíti az újraépítést, ha csak a fő csomag „kernel”-en történik változtatás.
  • A „concat_idents!” makró megvalósítása átírva egy eljárási makró formájában, amely nem kapcsolódik a concat_idents funkcióhoz, és lehetővé teszi a helyi változókra való hivatkozások használatát.
  • A „static_assert!” makró átírásra került, lehetővé téve a „core::assert!()” használatát bármilyen környezetben konstansok helyett.
  • Makró "build_error!" akkor működik, ha a „RUST_BUILD_ASSERT_{WARN,ALLOW}” mód be van állítva a modulokhoz.
  • Hozzáadott egy külön fájlt a „kernel/configs/rust.config” beállításokkal.
  • A makróhelyettesítések során feldolgozott „*.i” fájlok „*.rsi”-re lettek átnevezve.
  • A C kódhoz használtaktól eltérő optimalizálási szintekkel rendelkező Rust összetevők építésének támogatása megszűnt.
  • Hozzáadott fs modul, amely kötéseket biztosít a fájlrendszerekkel való munkához. Példa egy Rust nyelven írt egyszerű fájlrendszerre.
  • Hozzáadott munkasor-modul a rendszervárólista-kezeléshez (összerendeléseket biztosít a work_struct és workqueue_struct kernelstruktúrákon).
  • A kasync modul fejlesztése az aszinkron programozási módszerek (async) megvalósításával folytatódott. Példa hozzáadva egy Rust nyelven írt magszintű TCP-kiszolgálóra.
  • Hozzáadtuk a megszakítások kezelésének lehetőségét a Rust nyelvben a [Threaded] Handler típusok és a [Threaded]Registration` típusok használatával.
  • A „#[vtable]” eljárási makró hozzáadása megkönnyíti a függvénymutatókat tartalmazó táblázatokkal való munkavégzést, például a file_operations szerkezettel.
  • A kétirányú linkelt listák "unsafe_list::List" megvalósítása hozzáadva.
  • Az RCU (Read-copy-update) és a Guard típus kezdeti támogatása hozzáadva annak ellenőrzéséhez, hogy az olvasási zárolás az aktuális szálhoz van-e kötve.
  • Feladat::spawn() függvény hozzáadva a kernelszálak létrehozásához és automatikus indításához. Szintén hozzáadta a Task::wake_up() metódust.
  • Hozzáadott egy késleltetési modult, amely lehetővé teszi a késleltetések használatát (a wrapper over msleep()).

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 kötelező összeépí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 a felszabadítás utáni memóriahozzáférés, a nulla mutató hivatkozásai és a puffertúllépés.

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