UEFI实战SlimBootloader集成UEFI Payload
Posted jiangwei0512
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UEFI实战SlimBootloader集成UEFI Payload相关的知识,希望对你有一定的参考价值。
综述
SBL本身不是UEFI,但是它支持UEFI作为Payload。在EDKII的开源代码中,就提供了一个UefiPayloadPkg用来生成Payload。
这里使用https://gitee.com/jiangwei0512/edk2-beni.git作为编译UEFI Payload使用的源代码,构建UEFI Payload的方法如下(使用Windows Cmd而不是PowerShell,后者似乎会出问题):
- 进入EDKII源码目录,执行edksetup.bat,构建编译环境:
edksetup.bat
默认EDKII源码中没有构建工具,则需要先生成工具,命令如下:
edksetup.bat rebuild
- 执行如下命令进行Payload构建:
build -a IA32 -a X64 -p UefiPayloadPkg/UefiPayloadPkg.dsc -b DEBUG -t VS2019 -D BOOTLOADER=SBL
成功之后的结果大致如下:
GenFfs -t EFI_FV_FILETYPE_APPLICATION -g 7C04A583-9E3E-4f1c-AD65-E05268D0B4D1 -o f:\\gitee\\edk2-beni\\Build\\UefiPayloadPkgX64\\DEBUG_VS2019\\FV\\Ffs\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1Shell\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1.ffs -oi f:\\gitee\\edk2-beni\\Build\\UefiPayloadPkgX64\\DEBUG_VS2019\\FV\\Ffs\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1Shell\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1SEC1.1.pe32 -oi f:\\gitee\\edk2-beni\\Build\\UefiPayloadPkgX64\\DEBUG_VS2019\\FV\\Ffs\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1Shell\\ShellOffset.raw -oi f:\\gitee\\edk2-beni\\Build\\UefiPayloadPkgX64\\DEBUG_VS2019\\FV\\Ffs\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1Shell\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1SEC2.ui -oi f:\\gitee\\edk2-beni\\Build\\UefiPayloadPkgX64\\DEBUG_VS2019\\FV\\Ffs\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1Shell\\7C04A583-9E3E-4f1c-AD65-E05268D0B4D1SEC3.ver
Fd File Name:UEFIPAYLOAD (f:\\gitee\\edk2-beni\\Build\\UefiPayloadPkgX64\\DEBUG_VS2019\\FV\\UEFIPAYLOAD.fd)
Generate Region at Offset 0x0
Region Size = 0x410000
Region Name = FV
Generating PLDFV FV
Generating DXEFV FV
######
Generating DXEFV FV
####
GUID cross reference file can be found at f:\\gitee\\edk2-beni\\Build\\UefiPayloadPkgX64\\DEBUG_VS2019\\FV\\Guid.xref
FV Space Information
PLDFV [85%Full] 4259840 (0x410000) total, 3656992 (0x37cd20) used, 602848 (0x932e0) free
DXEFV [99%Full] 3629056 (0x376000) total, 3628792 (0x375ef8) used, 264 (0x108) free
- Done -
Build end time: 13:02:44, Dec.05 2021
Build total time: 00:00:10
最终生成的是UEFIPAYLOAD.fd,将它放到SBL的PayloadPkg\\PayloadBins目录下(默认情况下该目录可能不存在,新建即可),然后在原有的编译命令基础上增加-p "UEFIPAYLOAD.fd:UEFI:Lzma"
。-p
之后的参数按照如下的规则声明:
<PAYLOAD_FILE>:<PAYLOAD_ID>:<COMPRESSION_ALGORITHM>;...
可以声明多个,中间用;
分隔。下面是一个完整的示例:
python BuildLoader.py build qemu -p "UEFIPAYLOAD.fd:UEFI:Lzma"
这里是将Payload集成到QEMU中,命令执行时会报错,原因是QEMU声明的容量太小了:
Generating redundant components
Traceback (most recent call last):
File "D:\\gitee\\sbl\\BuildLoader.py", line 1526, in <module>
main()
File "D:\\gitee\\sbl\\BuildLoader.py", line 1523, in main
args.func(args)
File "D:\\gitee\\sbl\\BuildLoader.py", line 1428, in cmd_build
Build(board).build()
File "D:\\gitee\\sbl\\BuildLoader.py", line 1288, in build
self.post_build()
File "D:\\gitee\\sbl\\BuildLoader.py", line 1369, in post_build
self.create_bootloader_image (layout_name)
File "D:\\gitee\\sbl\\BuildLoader.py", line 1008, in create_bootloader_image
align_pad_file(src_path, dst_path, val, mode, pos)
File "D:\\gitee\\sbl\\BootloaderCorePkg\\Tools\\BuildUtility.py", line 756, in align_pad_file
raise Exception ("File '%s' size 0x%X is greater than padding size 0x%X !" % \\
Exception: File 'PAYLOAD.lz' size 0xEB5C8 is greater than padding size 0x20000 !
这时就需要修改QEMU的大小配置,位于Platform\\QemuBoardPkg\\BoardConfig.py,需要修改的是:
self.PAYLOAD_SIZE = 0x00100000
self.NON_REDUNDANT_SIZE = 0x600000
此外还需要修改SBL默认的Payload为UEFI Payload,这通过修改dlt文件来完成(对于QEMU平台来说对应需要修改的文件是Platform\\QemuBoardPkg\\CfgData\\CfgDataExt_Brd1.dlt):
GEN_CFG_DATA.PayloadId | 'UEFI'
之后构建就能够成功,不过QEMU本身似乎还不支持UEFI Payload,所以会报错:
不过这不是重点,这里只是介绍如何在SBL中包含UEFI Payload,从上面的示例中可以看出来已经包含成功了。
以上是关于UEFI实战SlimBootloader集成UEFI Payload的主要内容,如果未能解决你的问题,请参考以下文章