Egy fejlesztői kísérletnek köszönhetően a GRUB rendszerbetöltőt megfogta a rozsda

A cikk címe így önmagában nehezen értelmezhető, ha csak nem tudunk a szavak eredeti jelentése között olvasni, ugyanis jelen esetben arról a kisérletről van szó, amelyet egy Vladimir Serbinenko nevű fejesztő vetett fel a GRUB fejlesztői levelezőlistában. Serbinenko egy kísérleti fejlesztésben bevezette a Rust nyelven írt modulok támogatását a rendszerbetöltőbe. A fejlesztő a kísérleti verziót két különböző GitHub-tárhelyen osztotta meg. A Rust kódja a grub-rust-hello projektben található, míg a rendszerbetöltőt érintő módosítások a GRUB Rust ágában érhetők el. A fejlesztés jelenleg az i386-pc architektúrát támogatja, bár más architektúrák is implementálásra kerülhetnek a jövőben.

Egy fejlesztői kísérletnek köszönhetően a GRUB rendszerbetöltőt megfogta a rozsda

A GRUB új modulformátuma

A fejlesztő fontos változtatást hajtott végre a rendszerbetöltőben, amely a modulok formátumát érinti. A korábbi, ET_REL (.o) típusú binárisok helyett mostantól az ET_DYN (.so) típusú binárisokat használják. Ez lehetővé teszi, hogy a GRUB modulokat Rust nyelven is könnyedén beágyazhassunk, és dinamikusan töltsük be őket. Ezzel a megoldással a Rust nyújtotta előnyök, mint a memória kezelés és a típusbiztonság, könnyen kihasználhatók a szoftverben.

A mregparm=3 problémája

A fejlesztés során egy fontos problémával találkozott a fejlesztő a mregparm=3 beállítással kapcsolatban. Bár a Rust -Z regparm=3 opciója működik, a hívások a memcpy() függvényhez még mindig a regparm=0 konvencióval történnek. Ez vagy a Rust hibájának, vagy a GRUB oldalán szükséges adapter hiányának tudható be. A jövőbeni fejlesztések részeként ezt a problémát meg kell oldani ahhoz, hogy teljes mértékben kompatibilis legyen a Rust és GRUB közötti interakció.

A panik kezelése és a futtatókörnyezet

A Rust kivételek kezeléséhez szükséges rust_eh_personality még nem került implementálásra, ezért a kódot panic=abort beállítással fordították. Ez biztosítja, hogy a program a hiba esetén azonnal leálljon, azonban az igazi hiba kezeléshez a kivételkezelés megfelelő implementálására van szükség. A kód stabilitásának javítása érdekében elengedhetetlen a Rust kivételkezelési mechanizmusának beépítése.

A kód struktúrája és jövőbeli fejlesztések

A projektben az src/lib.rs fájl egy egyszerű „Hello, World!” példát tartalmaz, míg a grub_lib.rs egy adapter szerepét tölti be, amely összekapcsolja a rendszerbetöltő szoftvert és a Rust-ot. A fejlesztő megjegyzi, hogy ideálisan ezek külön Rust csomagokban lennének, hogy jobban megfeleljenek a Rust ökoszisztémájának. Azonban a jelenlegi megoldás is működőképes, és bemutatja a Rust és GRUB integrálásának alapjait.

Rust futtatókörnyezet és a megosztott runtime kérdése

Jelenleg minden modul a saját Rust futtatókörnyezetét hozza magával. Ez azt jelenti, hogy minden egyes modul önállóan tartalmazza a szükséges runtime-ot, ami növeli a memóriahasználatot és csökkenti a hatékonyságot. A fejlesztő nem tudja, hogyan lehetne közös, megosztott futtatókörnyezetre váltani, de ez egy fontos terület lehet a jövőbeli fejlesztések során. A megoldás megtalálása segíthet optimalizálni a rendszer működését.

Ez a projekt inkább egy kísérletként és véleménykérésként tekinthető, mintsem egy kész termékként. A fejlesztő kíváncsi a közösség visszajelzéseire, különösen a Rust közösség véleményére arról, hogy miként lehetne a kódot a nyelv idiómáinak megfelelően átírni. Az integráció további fejlesztése és finomítása révén egy hatékonyabb és modernebb rendszer jöhet létre, amely jobban kihasználja a Rust nyújtotta előnyöket.