Tovább fejlődik a Rust támogatása a QEMU projektben

Segítséget kaptál? Szívesen töltöd itt az idődet? Visszajársz hozzánk? Támogasd a munkákat: Ko-fi és Paypal!

kami911 képe

Paolo Bonzini, a Red Hat fejlesztője 2025. május 3-án közölt frissítést a Rust támogatás helyzetéről. Az elmúlt három hónapban a fejlesztések főként a Rust-hoz készült kötések (bindings) megtisztítására és a biztonságos Rust kódból elérhető funkcionalitás bővítésére összpontosultak. A Rust egyre több helyen váltja ki a meglévő C kódot, különösen az eszközmeghajtók (device models) területén. A cél, hogy új QEMU-eszközmodellek biztonságos Rust nyelven készüljenek, elkerülve a nem biztonságos (unsafe) memóriakezelést és tipikus C hibákat.

QEMU 10.0 és a Rust

A Rust támogatás be van építve a QEMU 10.0 kódbázisába, de továbbra sem engedélyezett alapértelmezés szerint. A Rust kód lefordul minden támogatott platformon, és több teszt is lefut (pl. make check-unit, make check-qtests), többek között a Rust-alapú pl011 UART és HPET eszközmodellekre is. A pl011 implementációja szinte teljes egészében safe Rust kóddal készült, kivéve a migrációs logikát és néhány qdev tulajdonságot. A HPET modell néhány helyen használ unsafe részeket, de ezek jól körülhatároltak és minimalizáltak. Jelenleg a Rust-alapú eszközmodellek kódja (pl011, HPET) még nem egységes stílusban íródott. Peter Maydell javaslatot tett a Rust kód egységesítésére: például a bitek elnevezése, a regiszterek kezelése és a kódstruktúra (pl. külön State és Registers szerkezetek) még eltérő lehet eszközönként. A fejlesztők javasolják egy ajánlott Rust stílus kidolgozását QEMU eszközmodellekhez, hogy a jövőben egységes, jól olvasható, karbantartható Rust kód jöhessen létre.

  • A Rust támogatása már fordíthatóvá és futtathatóvá vált az összes hivatalosan támogatott platformon, amennyiben a --enable-rust kapcsolóval építik. A Rustban írt pl011 és HPET eszközmodellek sikeresen átestek a CI és egységtesztek jelentős részén, beleértve a migrációs teszteket is.
  • Bindgen és saját típusok szétválasztása: különválasztották a C-ből generált típusokat a Rustban ténylegesen használt struktúráktól, így lehetővé vált például a Send, Sync, Zeroable traitek rugalmasabb használata.
  • Clippy, rustfmt és rustdoc támogatás már elérhető ninja használatával.
  • A Meson 1.8 nativ támogatást nyújt ezekhez, de az 1.8.0 verzióban található hibák miatt a teljes kihasználás még várat magára.
  • A Rust kód jelenleg statikusan linkeli a standard könyvtárat, ami a bináris méretét jelentősen növeli – ez disztribúciókban problémás lehet. Egy függőben lévő Meson patch ezt orvosolná.
  • C ↔ Rust interfész tisztítás: új konverziós modul készült a C hibakódok és a Rust Result típusa között, ami különösen a karakteres eszközöknél hasznos.
  • A HPET élő migrációja elkészült, beolvasztás előtt áll.
  • A pl011 Rust verziója még nem tartalmaz minden legfrissebb változtatást.
  • Nyomkövetés (tracepoints) és naplózás (logging) továbbra is hiányzik – ezek a funkciók döntőek a Rust eszközmodellek gyakorlati használatához.
  • A VMState pre_save és post_load visszahívásai továbbra is unsafe, de a Rust 1.83.0 verzióval ez biztonságosan is megvalósítható lenne.
  • A pl011 és HPET maradék unsafe részei biztonságosan kiválthatók – kivéve az instance_init inicializációs logikáját, amely külön figyelmet igényel.
  • A vm-memory crate lehetővé teheti a biztonságos memóriakezelést DMA-hoz, bár ezt még nem integrálták.

További tervek és korlátozások

A közeljövő feladatai között szerepel:

  • Logolás és tracepontok Rust-os támogatása
  • DMA kezelése biztonságos Rust használatával
  • VMState migráció Rust 1.83 nyelvi funkcióinak bevezetésével
  • A qemu_api crate szétbontása eszközkódra és általános használatra
  • Döntés a használt Rust makrókról és könyvtárakról (pl. bitflags, bilge)

Egyes funkciók (pl. instance_init vagy DMA) jelenleg még unsafe Rust kódot igényelnek, de ezek is fokozatosan lecserélhetők lesznek biztonságos megoldásokra. A vm-memory crate például ígéretes alternatívát kínálhat.

Támogatott Rust verziók

A minimálisan támogatott Rust verzió emelésére is sor kerül: jelenleg 1.77.0 az ajánlott, de hamarosan 1.83.0 lehet a minimum, mivel az újabb verzió lehetővé teszi statikus konstansokra való hivatkozást – amely a migráció támogatásához elengedhetetlen. Ez a változás azonban azzal járhat, hogy egyes disztribúciók (pl. Debian bookworm) esetében a --enable-rust opció nem lesz elérhető a csomagolt fordítóval.