1个不稳定版本
0.0.1 | 2023年11月7日 |
---|
#24 in #efi
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