1 个不稳定版本

0.1.0 2023 年 8 月 20 日

#1408硬件支持

MIT 许可证

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