最近在移BL到UEFI, 来大概看下基础。

UEFI(Unified Extensible Firmware Interface)是Intel提出的一种规范(specification),由PC BIOS而来,如下图(阿桑的wikipedia打不开?画个txt pic),介于OS和FW之间,QCOM Android BL似乎用它来代替LK。UEFI is based on EFI。

        ------
| OS |
--/|\--
___________|____________________
extensible firmware interface
___________|____________________
|
----\|/-----
| Firmware |
------------
| Hardware |
-------------

TianoCore是一种UEFI的开源实现, edk/edk2(based on edk)一种开发环境for UEFI,用的tinaocore。

微软的Project Mu是另一个实现,edk2的变种?

Overview

edk2里的代码最小组成都是按模块(module)来划分,n个模块可以组成一个包(package),平台(platform)是一种特殊的package,一般都是编译的入口。

module有个inf文件描述这个module,package有个dec文件,platform则是dsc文件。还有个fdf文件用作flash用。

module可以是application,library,or driver。

Library有个class和instance,class就是一个抽象,instance负责具体实现,不同平台可以定义不同实现。

Driver只接触了DXE drv, 提供protocol供其他module使用。

Application和Driver区别是是否退出。

package之间还可以互相引用,just like C calling eath other.

另外feature宏用PCD来代替,看个例子:

[PcdsFixedAtBuild.common]
# LinuxLoaderCommon
gQcomTokenSpaceGuid.EnableDisplayMenu|TRUE|BOOLEAN|0x00015005
EFI_STATUS
DisplayUnlockMenu (INTN Type, BOOLEAN Value)
{
EFI_STATUS Status = EFI_SUCCESS;
OPTION_MENU_INFO *OptionMenuInfo;
OptionMenuInfo = &gMenuInfo;

if (FixedPcdGetBool (EnableDisplayMenu)) {
DrawMenuInit ();

just like Linux kernel IS_ENABLED(),rt?

plz remember library和pcd都是给module自定义用的。

makefile在edk2是中间文件了,可以用inf/dsc提供的build option来修改。

ok,就这么多,其他用法看代码足矣。

参考文档