UEFI 原理与编程 4 - 三种方式实现 HelloWorld
by acdzh · 2019年12月25日12:29 · 42 WORDS · ~ 1 mins reading time · 0 Visitors |
UEFI工程模块文件
在工作区新建目录 infs/UefiMain
添加文件: UefiMain.c
, 内容如下:
#include <Uefi.h>EFI_STATUSUefiMain (IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable){SystemTable -> ConOut-> OutputString(SystemTable->ConOut, L"HelloWorld\n");return EFI_SUCCESS;}
再添加一个文件: UefiMain.inf
, 内容如下:
[Defines]INF_VERSION = 0x00010006BASE_NAME = UefiMainFILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5fMODULE_TYPE = UEFI_APPLICATIONVERSION_STRING = 0.1ENTRY_POINT = UefiMain[Sources]UefiMain.c[Packages]MdePkg/MdePkg.dec[LibraryClasses]UefiApplicationEntryPointUefiLib[FixedPcd]gEfiMdePkgTokenSpaceGuid.PcdFSBClock|600000000gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength[FeaturePcd]gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSEgEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable[PatchPcd]gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangCodes[BuildOptions]MSFT:DEBUG_*_IA32_CC_FLAGS = /Od
之后修改 Nt32Pkg\Nt32Pkg.dsc
, 在 356 行添加一行
infs/UefiMain/UefiMain.inf
之后编译, 运行模拟器
edksetup.bat --nt32build -p Nt32Pkg\Nt32Pkg.dsc -a IA32build run
进入模拟器后,
cd fs0:UefiMain.efi
看到结果:
使用 C 标准库
修改文件: UefiMain.c
, 内容如下:
#include <Uefi.h>#include <stdio.h>int main (int argc, char **argv ){printf("HelloWorld\n");return 0;}
修改文件: UefiMain.inf
, 内容如下:
## @file main.inf[Defines]INF_VERSION = 0x00010006BASE_NAME = UefiMainFILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5fMODULE_TYPE = UEFI_APPLICATIONVERSION_STRING = 0.1ENTRY_POINT = ShellCEntryLib[Sources]main.c[Packages]MdePkg/MdePkg.decShellPkg/ShellPkg.decStdLib/StdLib.dec[LibraryClasses]LibCLibStdioShellCEntryLib
之后修改 Nt32Pkg\Nt32Pkg.dsc
, 在 最后再添加一行
!include StdLib/StdLib.inc
之后编译, 运行模拟器
edksetup.bat --nt32build -p Nt32Pkg\Nt32Pkg.dsc -a IA32build run
进入模拟器后,
cd fs0:UefiMain.efi
可以看到同样的结果:
Shell App
修改文件: UefiMain.c
, 内容如下:
#include <Uefi.h>#include <Library/UefiBootServicesTableLib.h>INTNEFIAPIShellAppMain (IN UINTN Argc,IN CHAR16 **Argv){gST -> ConOut-> OutputString(gST -> ConOut, L"HelloWorld\n");return 0;}
修改文件: UefiMain.inf
, 内容如下:
[Defines]INF_VERSION = 0x00010006BASE_NAME = UefiMainFILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5fMODULE_TYPE = UEFI_APPLICATIONVERSION_STRING = 0.1ENTRY_POINT = ShellCEntryLib## VALID_ARCHITECTURES = IA32 X64 IPF#[Sources]Main.c[Packages]MdePkg/MdePkg.decShellPkg/ShellPkg.dec[LibraryClasses]ShellCEntryLibUefiLib[BuildOptions]
之后修改 Nt32Pkg\Nt32Pkg.dsc
, 在 最后再添加一行
!include StdLib/StdLib.inc
之后编译, 运行模拟器
edksetup.bat --nt32build -p Nt32Pkg\Nt32Pkg.dsc -a IA32build run
进入模拟器后,
cd fs0:UefiMain.efi
也可以看到同样的结果:
历史记录
Version | Action | Time |
---|---|---|
1.0 | Init | 2019-12-25 20:29 |
1.0 | 迁移至 blog | 2020-04-27 02:04 |