一套标准,定义了一堆接口,提供给引导程序使用。

事实标准是Intel写的 https://github.com/tianocore/edk2 ,提供了很多现成的驱动可以使用

十分建议在分析UEFI题目的时候把源码clone下来,许多API可以在里面找到用法

这项目一股M$味,配置是INF,用GUID标识,文件格式是PE,调用约定是Microsoft x64,API也有点Windows的感觉

API

所有的API返回值类型基本都是 EFI_STATUS ,用于标识操作是否成功,具体错误码信息可以参考:

4. Status Codes — UEFI Specification 2.10 documentation

例如 0x800000000000000f 先看 Range 属于 Error codes reserved for use by UEFI main spec. ,再根据低bit 0xf 查到 EFI_ACCESS_DENIED

首先最重要的结构就是 SystemTable,从里面读出BootServices这个结构的指针(源码里这部分可能被宏藏起来了,变量gBS就是BootServices指针)

内部的 LocateProtocol 是一个最常用的API,用于加载其他 Protocol,类似于 Windows 下的 LoadLibrary ,第三个参数的类型根据 Protocol 变化,但基本都是一个struct里面一堆函数指针。

typedef
EFI_STATUS
(EFIAPI *EFI_LOCATE_PROTOCOL)(
  IN  EFI_GUID  *Protocol,
  IN  VOID      *Registration  OPTIONAL,
  OUT VOID      **Interface
  );

其他更多API列表可以参考:7. Services — Boot Services — UEFI Specification 2.10 documentation

System Manage Mode