一、 Windows 平台
一、 编写源代码
1. 编写C:\edkii\OvmfPkg\HelloWorld\HelloWorld.c
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
//ShellCEntryLib call user interface ShellAppMain
EFI_STATUS
EFIAPI
HelloWorldEntry(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status = EFI_SUCCESS;
Print (L"[Console] HelloWorldEntry Start..\n");
Print (L"[Console] HelloWorldEntry End ... \n");
return Status;
}
2. 编写C:\edkii\OvmfPkg\HelloWorld\HelloWorld.inf
[Defines]
INF_VERSION = 0x00010007
BASE_NAME = HelloWorld
FILE_GUID = 69A6DE6D-FA9F-485E-9A4E-EA70FDCFD82F
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = HelloWorldEntry
[Sources]
HelloWorld.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
UefiShellCEntryLib
BaseLib
BaseMemoryLib
DebugLib
PrintLib
UefiBootServicesTableLib
MemoryAllocationLib
UefiLib
- 修改
C:\edkii\OvmfPkg\OvmfPkgX64.dsc
#
[Components]
OvmfPkg/HelloWorld/HelloWorld.inf
二、 编译生成EFI文件
1. 编译UFI文件
运行edksetup.bat
编译整个OvmfPkg Package
build -a X64 -p OvmfPkg\OvmfPkgX64.dsc -D DEBUG_ON_SERIAL_PORT
2. 检查efi文件
三、 运行HelloWorld.efi
-
创建虚拟U盘
1)下载安装UltraISO.exe 创建镜像文件HDD_BOOT.img,
2)下载安装osfmount,挂载HDD_BOOT.img ,然后将 HelloWorld.efi 拷贝到HDD_BOOT.img
-
挂载虚拟U盘启动QEMU
1) 改写启动脚本setup-qemu-x64.bat
,
C:\qemu>echo "C:\Program Files\qemu\qemu-system-x86_64.exe" -bios "OVMF.fd" -M "pc" -m 256 -cpu "qemu64" -boot order=dc -usbdevice disk:HDD_BOOT.img -serial stdio > setup-qemu-x64.bat
-
运行HelloWorld.efi
启动后运行结果如下,
二、 Linux 平台
一、 编写源代码(shell下输入以下命令既可以)
# 新建 HelloWorld 目录
mkdir -p OvmfPkg/HelloWorld/
# 新建HelloWorld.c
echo '
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
//ShellCEntryLib call user interface ShellAppMain
EFI_STATUS
EFIAPI
HelloWorldEntry(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status = EFI_SUCCESS;
Print (L"[Console] HelloWorldEntry Start..\n");
Print (L"[Console] HelloWorldEntry End ... \n");
return Status;
}
' >> OvmfPkg/HelloWorld/HelloWorld.c
# 新建HelloWorld.inf
echo '
[Defines]
INF_VERSION = 0x00010007
BASE_NAME = HelloWorld
FILE_GUID = 69A6DE6D-FA9F-485E-9A4E-EA70FDCFD82F
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = HelloWorldEntry
[Sources]
HelloWorld.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
UefiShellCEntryLib
BaseLib
BaseMemoryLib
DebugLib
PrintLib
UefiBootServicesTableLib
MemoryAllocationLib
UefiLib
' >> OvmfPkg/HelloWorld/HelloWorld.inf
# 添加 HelloWorld.inf 到OvmfPkg/OvmfPkgX64.dsc
sed "s/\[Components\]/\[Components\]\nOvmfPkg\/HelloWorld\/HelloWorld.inf/" -i OvmfPkg/OvmfPkgX64.dsc
# 添加 UefiShellCEntryLib.inf到OvmfPkg/OvmfPkgX64.dsc
sed "s/\[LibraryClasses\]/\[LibraryClasses\]\nUefiShellCEntryLib\|ShellPkg\/Library\/UefiShellCEntryLib\/UefiShellCEntryLib\.inf/" -i OvmfPkg/OvmfPkgX64.dsc
二、 编译EFI
APP
make -C /root/edk2/BaseTools/Source/C
./OvmfPkg/build.sh -D DEBUG_ON_SERIAL_PORT
三、 在QEMU
运行EFI
1. 创建虚拟USB设备文件HDD_BOOT.img
# 新建HDD_BOOT.img的空文件
qemu-img create -f raw HDD_BOOT.img 64M
# 格式化img文件
mkfs.vfat HDD_BOOT.img
# 将文件加载到设备文件
losetup /dev/loop8 HDD_BOOT.img
#新建挂载目录
mkdir -p /mnt/hello
#将设备挂载到目录
mount /dev/loop8 /mnt/hello
2. Copy HelloWorld.efi
到HDD_BOOT.img
cp ./Build/OvmfX64/DEBUG_GCC48/X64/OvmfPkg/HelloWorld/HelloWorld/DEBUG/HelloWorld.efi /mnt/hello
# 将efi文件回写到 HDD_BOOT.img
umount /dev/loop8
losetup -d /dev/loop8
3. UEFI 加载HDD_BOOT.img运行
qemu-system-x86_64 -bios ./Build/OvmfX64/DEBUG_GCC48/FV/OVMF.fd \
-serial stdio -usb -drive if=none,format=raw,id=disk1,file=HDD_BOOT.img \
-device usb-storage,drive=disk1