#efi #run-time #kernel #linux #protocols #boot #random

no-std efiloader

一个实现EFI运行时库,可以启动Linux内核和相关可执行文件

1个不稳定版本

0.0.1 2023年11月7日

#24 in #efi

GPL-2.0 许可证

145KB
4K SLoC

此crate实现了一个精简的EFI运行时,可以被引导加载程序实现使用,以提供操作系统加载器(如EFIstub Linux内核、systemd-boot UKI映像或甚至GRUB+shim)所需的EFI上下文。

EFI运行时实现了以下特性和API:

  • 内存映射和相关的页面和池分配例程,以及实现GetMemoryMap() EFI引导服务以将最终内存映射传递给操作系统;
  • 支持安装和卸载协议、定位句柄和协议缓冲区以及定位设备路径的EFI协议数据库;
  • EFI配置表数据库

以下EFI功能不支持:

  • UEFI驱动程序模型
  • 异步事件和通知

与时间维护、EFI变量存储和重置/关机相关的运行时服务留给调用者实现,因为它们不能以通用方式实现。同样适用于Stall()引导服务。

示例

fn run_efi_image(
    image: impl efiloader::FileLoader + Send + 'static,
    mapper: impl efiloader::MemoryMapper + 'static,
    random: impl efiloader::Random + 'static,
) {
    let ram = 0..0x100_0000;
    let memmap = efiloader::memmap::MemoryMap::new();
    memmap.declare_memory_region(&ram).unwrap();

    let efi = efiloader::init(
        None::<&dyn efiloader::SimpleConsole>,
        memmap,
        mapper,
        Some(random),
    )
    .expect("Failed to init EFI runtime");

    if let Some(mut li) = efi.load_image(&image) {
        let ret = li.start_image();
        println!("EFI app returned {ret:?}\n");
    }
}

依赖关系

~1MB
~12K SLoC