相关资料
- UEFI原理与编程_戴正华 第二章
 - EDK2开发环境搭建
 - UEFI社区
 - TianoCore
 - TianoCore Wiki
 
参考文章下载地址:
链接: https://pan.baidu.com/s/1LjrydEzCACG3ohpx7mMKKg 提取码: 4i3j 
学习目标
本节主要目标:
- 下载和编译EDK2
 - 用qemu模拟运行EDK2
 - 制作一个U盘EDK2
 - 制作U盘让UEFI进入到SHELL中
 
学会环境部署,便于以后使用
UEFI和EDK2介绍
不同的厂商对UEFI有不同的实现, 一种比较常用的开源实现是EDK2. EDK2是一个遵循UEFI标准和PI标准的跨平台固件开发环境. 
所以我们这里看下EDK2即可。
TianoCore介绍
TianoCore社区支持统一可扩展固件接口(UEFI)的开源实现。
EDK II是现代的,功能丰富的跨平台固件开发环境,适用于UEFI和UEFI平台初始化(PI)规范。
详细资料参考: TianoCore Wiki。
TianoCore Wiki内容
EDK2 环境
开发环境搭建(Ubuntu)
# 下载安装git clone https://github.com/tianocore/edk2.gitcd edk2git checkout --track origin/UDK2018sudo apt-get install build-essential uuid-dev nasm# 编译工具toolsexport WORKSPACE=$(realpath ./)echo $WORKSPACEmake -C $WORKSPACE/BaseTools# set environmentcd $WORKSPACEsource edksetup.sh# 编译模拟器build -p $WORKSPACE/EmulatorPkg/EmulatorPkg.dsc -a X64 -b DEBUG -t GCC5 -D BUILD_64 -D UNIX_SEC_BUILD -n 3# Shell已经有了: edk2\EdkShellBinPkg\FullShell 各版本的Shell都有,放到U盘改名: /EFI/BOOT/BOOTx64.EFI启动即可# 建立仿真环境export WORKSPACE=$(realpath ./)source edksetup.shbuild -p OvmfPkg/OvmfPkgX64.dsc -a X64 -b DEBUG -t GCC5 -D BUILD_64 -n 3# 直接运行仿真环境qemu-system-x86_64 -bios ./Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -debugcon \file:debug.log -global isa-debugcon.iobase=0x402 -m 512 -enable-kvm# 建立仿真环境并与Qemu文件交互这里先创建一个共享盘,用来方便在进入UEFI Shell后共享自己的文件dd if=/dev/zero of=app.disk bs=1 count=1 seek=1024Ksudo mkfs.vfat app.disksudo mkdir /mnt/mnt_app -psudo mount app.disk /mnt/mnt_app/# sudo cp ../edk2/Build/OptionRomPkg/DEBUG_GCC5/X64/OromHello.rom /mnt/mnt_app/ 自己得测试程序sudo qemu-system-x86_64 -bios ./Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -debugcon \file:debug.log -global isa-debugcon.iobase=0x402 \-serial file:serial.log -hda app.disk -m 512 -enable-kvm
UEFI启动(TBD)
UEFI Shell制作(TBD)
目录说明
edk2中子目录介绍 中描述了各个PKG目录的作用,以及对应平台;
Coreboot和UEFI的关系

下边详情列举下目录(持续更新中)
(base) baiy@inno-MS-7B89:edk2$ git remote -vorigin https://github.com/tianocore/edk2.git (fetch)origin https://github.com/tianocore/edk2.git (push)(base) baiy@inno-MS-7B89:edk2$ git br* UDK2018# 注: 下边调整了下目录顺序,并删了暂时OvmfPkg无用的包,因为有很多架构相关包 单独分离出来(base) baiy@inno-MS-7B89:edk2$ tree -L 1.!!! 通用模块package├── AppPkg UEFI Application Development Kit是一系列用来进行uefi app开发的套件,标准依赖库,工具以及demo,目标是降低UEFI app的开发门槛。├── MdePkg “Module Development Environment Package”,这是一个特殊的package,包含了用于开发一个module所需要的最小环境。一个module可能也会依赖于其他的Package,但是所有modules必须依赖于MdePkg。├── MdeModulePkg 提供符合UEFI/PI工业标准的模块,也提供该标准相关的开发环境,PPIs/PROTOCOLs/GUIDs和依赖库。├── BaseTools 提供编译相关的工具用于EDK和EDK2,比如:AutoGen, Build, GenSec, GenFV, GenFW, GenRds工具。├── CorebootModulePkg Coreboot原本和UEFI/BIOS是竞争关系,但是现在Coreboot也逐渐向UEFI标准靠拢,目前依靠此包可以轻松从coreboot启动到UEFI,Coreboot Support Modules包含了如下代码:用来解析coreboot table的代码,报告存储器/IO资源的代码,安装acpi table和smbios table 到EFI系统表中的代码。它位于uefi环境和hardware的中间层。├── CorebootPayloadPkg 用来加载上层UEFI环境的中间层,Hardware->Coreboot->CorebootPayloadPkg->UEFI->HLOS├── CryptoPkg UEFI定义了HLOS(high level OS)和平台固件之间的接口,多个安全特性也在2.2版本之后加入其中,此包是用来提供加密支持的。├── ShellBinPkg // EDK Shell开发包以及一个官方的EDK Shell实现,这两个包已经在被Shell 2.x逐渐取代了。├── ShellPkg Shell 2.x版本开发包以及一个官方的UEFI Shell 实现。├── OvmfPkg // X86下仿真 使用OvmfPkg├── BeagleBoardPkg├── Build // !!! 编译程序的目标位置,就放在这里├── BuildNotes2.txt├── Conf├── Contributions.txt├── DuetPkg├── EdkCompatibilityPkg├── edksetup.bat├── edksetup.sh // !!! 环境变量,测试前必须西安执行这个脚本├── EdkShellBinPkg├── EdkShellPkg├── EmbeddedPkg├── EmulatorPkg├── FatBinPkg├── FatPkg├── FmpDevicePkg├── IntelFrameworkModulePkg├── IntelFrameworkPkg├── IntelFsp2Pkg├── IntelFsp2WrapperPkg├── IntelFspPkg├── IntelFspWrapperPkg├── IntelSiliconPkg├── License.txt├── Maintainers.txt├── NetworkPkg├── Nt32Pkg├── Omap35xxPkg├── OptionRomPkg├── PcAtChipsetPkg├── QuarkPlatformPkg├── QuarkSocPkg├── Readme.md├── SecurityPkg├── SignedCapsulePkg├── SourceLevelDebugPkg├── StdLib├── StdLibPrivateInternalFiles├── UefiCpuPkg├── UnixPkg├── Vlv2DeviceRefCodePkg└── Vlv2TbltDevicePkg
FAQ:
找不到Trim:
Trim命令在EDKII中,将命令放到环境变量中,一了百了
PATH=/home/share/workspace/edk2/BaseTools/BinWrappers/PosixLike/:$PATH
找不到xlib.h
include 
切换ubuntu本地源,sudo apt-get install libghc-x11-dev
