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_STATUS
UefiMain (
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 = 0x00010006
BASE_NAME = UefiMain
FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 0.1
ENTRY_POINT = UefiMain
[Sources]
UefiMain.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiApplicationEntryPoint
UefiLib
[FixedPcd]
gEfiMdePkgTokenSpaceGuid.PcdFSBClock|600000000
gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength
[FeaturePcd]
gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE
gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable
[PatchPcd]
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangCodes
[BuildOptions]
MSFT:DEBUG_*_IA32_CC_FLAGS = /Od

之后修改 Nt32Pkg\Nt32Pkg.dsc, 在 356 行添加一行

infs/UefiMain/UefiMain.inf

之后编译, 运行模拟器

edksetup.bat --nt32
build -p Nt32Pkg\Nt32Pkg.dsc -a IA32
build run

进入模拟器后,

cd fs0:
UefiMain.efi

看到结果:

020626

使用 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 = 0x00010006
BASE_NAME = UefiMain
FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 0.1
ENTRY_POINT = ShellCEntryLib
[Sources]
main.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
StdLib/StdLib.dec
[LibraryClasses]
LibC
LibStdio
ShellCEntryLib

之后修改 Nt32Pkg\Nt32Pkg.dsc, 在 最后再添加一行

!include StdLib/StdLib.inc

之后编译, 运行模拟器

edksetup.bat --nt32
build -p Nt32Pkg\Nt32Pkg.dsc -a IA32
build run

进入模拟器后,

cd fs0:
UefiMain.efi

可以看到同样的结果:

Shell App

修改文件: UefiMain.c, 内容如下:

#include <Uefi.h>
#include <Library/UefiBootServicesTableLib.h>
INTN
EFIAPI
ShellAppMain (
IN UINTN Argc,
IN CHAR16 **Argv
)
{
gST -> ConOut-> OutputString(gST -> ConOut, L"HelloWorld\n");
return 0;
}

修改文件: UefiMain.inf, 内容如下:

[Defines]
INF_VERSION = 0x00010006
BASE_NAME = UefiMain
FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 0.1
ENTRY_POINT = ShellCEntryLib
#
# VALID_ARCHITECTURES = IA32 X64 IPF
#
[Sources]
Main.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
[LibraryClasses]
ShellCEntryLib
UefiLib
[BuildOptions]

之后修改 Nt32Pkg\Nt32Pkg.dsc, 在 最后再添加一行

!include StdLib/StdLib.inc

之后编译, 运行模拟器

edksetup.bat --nt32
build -p Nt32Pkg\Nt32Pkg.dsc -a IA32
build run

进入模拟器后,

cd fs0:
UefiMain.efi

也可以看到同样的结果:

历史记录

VersionActionTime
1.0Init2019-12-25 20:29
1.0迁移至 blog2020-04-27 02:04
随便写写 © 2022 acdzh