UEFI 基础教程 (二) - 运行第一个APP HelloWorld

一、 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
  1. 修改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
  1. 创建虚拟U盘
    1)下载安装UltraISO.exe 创建镜像文件HDD_BOOT.img,
    2)下载安装osfmount,挂载HDD_BOOT.img ,然后将 HelloWorld.efi 拷贝到HDD_BOOT.img
    在这里插入图片描述

  2. 挂载虚拟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

  3. 运行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.efiHDD_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

在这里插入图片描述

MyHelloWorldApp DEMO源码

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值