1 个不稳定版本
0.1.0 | 2023 年 8 月 20 日 |
---|
#1408 在 硬件支持
52KB
1.5K SLoC
ZFI – 零成本且安全的 UEFI 固件接口
ZFI 是一个 Rust 包,用于编写 UEFI 应用程序,以下是其目标:
- 提供与 UEFI 规范几乎相同的基 APIs。
- 提供基于基 APIs 的附加 APIs。
- 基 APIs 是对 UEFI API 的零成本抽象。
- 安全且易于使用。
- 在稳定的 Rust 上工作。
ZFI 只支持单线程环境,与 UEFI 规范相同。
示例
#![no_std]
#![no_main]
use alloc::boxed::Box;
use zfi::{pause, println, DebugFile, Image, Status, SystemTable};
extern crate alloc;
#[no_mangle]
extern "efiapi" fn efi_main(image: &'static Image, st: &'static SystemTable) -> Status {
// This is the only place you need to use unsafe. This must be done immediately after landing
// here.
unsafe {
zfi::init(
image,
st,
Some(|| Box::new(DebugFile::next_to_image("log").unwrap())),
)
};
// Any EFI_HANDLE will be represents by a reference to a Rust type (e.g. image here is a type of
// Image). Each type that represents EFI_HANDLE provides the methods to access any protocols it
// is capable for (e.g. you can do image.proto() here to get an EFI_LOADED_IMAGE_PROTOCOL from
// it). You can download the UEFI specifications for free here: https://uefi.org/specifications
println!("Hello, world!");
pause();
Status::SUCCESS
}
#[cfg(not(test))]
#[panic_handler]
fn panic_handler(info: &core::panic::PanicInfo) -> ! {
zfi::eprintln!("{info}");
loop {}
}
#[cfg(not(test))]
#[global_allocator]
static ALLOCATOR: zfi::PoolAllocator = zfi:PoolAllocator;
要构建上述示例,您需要将 Rust 添加为 UEFI 目标
rustup target add x86_64-unknown-uefi
然后使用以下命令构建
cargo build --target x86_64-unknown-uefi
您可以从 target/x86_64-unknown-uefi/debug
中获取 EFI 文件,并在兼容的机器上启动它。
示例项目
商业支持
如果您需要商业支持,请联系 [email protected]。
许可证
MIT
依赖项
~110KB