最近在移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的变种?
Overviewedk2里的代码最小组成都是按模块(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|0x00015005EFI_STATUSDisplayUnlockMenu (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,就这么多,其他用法看代码足矣。
参考文档https://uefi.org/https://www.tianocore.org/https://github.com/tianocore/tianocore.github.io/wikiEDK_II Module Writer_s Guide_0_7.pdfEDK_II_UserManual_0_7.pdfedk-ii-dec-specification.pdfedk-ii-dsc-specification.pdfedk-ii-inf-specification.pdfedk-ii-pcd-specification.pdfhttps://microsoft.github.io/mu/版权