1. 下载UEFI代码:
git clone https://github.com/tianocore/edk2.git
如果使用git比较慢,也可以直接在网站上下载源代码打包文件。
2. UEFI目录结构大体如下:(随版本更新可能有变,本文源代码在2016年8月14日下载)
3. 本文主要使用的是CorebootPayloadPkg这个目录,通过其中的dsc来编译生成UEFI Payload。
4. 首先需要生成编译工具。进入BaseTools目录,运行make命令即可。
不过为了在Ubuntu下编译成功,还需要安装一些工具包:
apt install build-essential uuid-dev
5. BaseTools编译完成后,返回主目录。并source主目录下的edksetup.sh文件:
source edksetup.sh
注意不能直接执行,而是需要source,因为edksetup.sh中有设置环境变量的操作。
6. 另外编译的时候会需要用到nasm,所以还需要安装nasm:
apt install nasm
7. 通过以上几个步骤,基本的准备工作就做好了。之后可以通过build命令来进行编译了。
方法有两种,一种通过长命令:
build -a IA32 -a X64 -p CorebootPayloadPkg/CorebootPkgIa32X64.dsc
另外一种是通过修改Conf目录下的target.txt文件,来指定平台和编译文件等信息,之后直接使用build,后面就可以不带参数了。
8. 编译得到的文件会在Build目录下,默认的名字是UEFIPAYLOAD.fd:
UEFI Payload的运行依赖于coreboot,所以首先要将UEFI Payload包含到coreboot中。
关于coreboot的编译和运行,请参考coreboot基础——coreboot编译和运行。
对于包含UEFI Payload的情况,编译coreboot前需要先修改一下coreboot的config文件,修改Payload选项:
之后将UEFIPAYLOAD.fd放到coreboot的根目录,并修改名称为payload.elf。
编译仍然是make,得到的文件也没有变化,之后通过qemu加载coreboot,最后也会跳转到UEFI中。
不过目前的版本有个问题,进入UEFI后并没有什么打印。需要修改dsc文件:
主要有下面几个地方:
DEFINE SOURCE_DEBUG_ENABLE = FALSE
需要改成TRUE。
有几个地方的LibraryClasses选项下的DebugLib需要修改:
DebugLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
需要改成:
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
之后再编译新的UEFI Payload版本,就会出现打印:
注意:
文中使用的Ubuntu系统为16.04。
上述部分命令可能需要在root下执行。