通常情况下,我们需要使用 EDK2 来进行 UEFI Shell Application 的开发。这次介绍的是一个用来开发 UEFI Shell Application的框架。项目地址如下:
https://github.com/VioletGiraffe/UEFI-Bootloader
从名字可以看出,作者的目标是用来开发BootLoader,类似的我们可以用来开发UEFI Shell Application。
相比EDK2,这种方法的优点主要是:
- 小巧简单。容量只有十几兆,编译起来非常快,另外方便我们研究具体的实现;
- 编译环境时 Visual Studio,方便我们阅读代码
具体使用方法是:
1.在 https://github.com/VioletGiraffe/UEFI-Bootloader 下载代码
2.在https://github.com/VioletGiraffe/UEFI-CPP-headers 下载需要的头文件
3.将2下载的内容解压到 UEFI-CPP-headers目录下
4.Visual Studio 打开bootloader.sln文件
5.这个项目作者使用 VS2017,所以需要修改一下 Platform Toolset 为你当前使用的编译器。这里我是用的是 VS2019,修改如下:
6.直接 Build即可生成 BootX64.efi
在WinHost 模拟环境中运行这个程序可以看到屏幕上输出了信息:
有兴趣的朋友可以直接去前面提到的项目主页或者在这里直接下载:
2023年11月9日
同样这个框架,研究了一下如何在命令行下编译,以 X64 为例,具体操作如下:
1.代码上只需要准备 gfx.c 和 UEFI-CPP-headers 目录
2.打开 X64 Native Tools Command Prompt for VS2019 (如果你要build IA32 的 EFI 则需要使用 X86 的窗口)
3.下面命令生成 gfx.obj
cl /c /I"C:\\BuildBs\\CppStudy\\1\\UEFI-CPP-headers" /Zi /W4 /WX- /diagnostics:column /Od /D _UNICODE /D UNICODE /D HAVE_USE_MS_ABI /D GNU_EFI_USE_EXTERNAL_STDARG /D _UNICODE /D UNICODE /Gm- /MDd /GS- /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Fo"C:\\BuildBs\\CppStudy\\1\\" /Fd"C:\\BuildBs\\CppStudy\\1\\vc142.pdb" /external:W4 /Gd /TP /wd4229 /FC /errorReport:prompt /Oi- gfx.cpp
4. Link 生成 EFI 文件
link "/OUT:C:\\BuildBs\\CppStudy\\1\\bootx64.efi" /VERBOSE /INCREMENTAL:NO "/LIBPATH:C:\\BuildBs\\CppStudy\\1\\" libcmtd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NODEFAULTLIB /MANIFEST:NO /DEBUG:FULL "/PDB:C:\\BuildBs\\CppStudy\\1\\bootx64.pdb" /SUBSYSTEM:EFI_APPLICATION /OPT:REF /TLBID:1 "/ENTRY:efi_main" /NXCOMPAT:NO "/IMPLIB:C:\\BuildBs\\CppStudy\\1\\bootx64.lib" /MACHINE:X64 "C:\\BuildBs\\CppStudy\\1\\gfx.obj"