UEFI学习开发(2)Ubuntu基于EDK2编译运行一个app

上一章讲述如何在ubuntu搭建edk2编译环境,这一篇讲述如何在edk2环境下添加一个简单的APP,编译运行helloworld打印信息,并使用U盘进行加载生成的efi格式文件。qemu虚拟机运行uefi加载该应用。

 

1.应用源码编写与工程修改

(1)编写edk2\OvmfPkg\HelloWorld\HelloWorld.c

#include  
#include  
#include 
#include 
#include 
#include 

//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).编写edk2\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]
  ShellCEntryLib
  BaseLib
  BaseMemoryLib
  DebugLib
  PrintLib
  UefiBootServicesTableLib
  MemoryAllocationLib
  UefiLib

(3).修改edk2\OvmfPkg\OvmfPkgX64.dsc

......
  ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
  ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
  S3BootScriptLib|MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf
......


......
[Components]
  OvmfPkg/ResetVector/ResetVector.inf
  OvmfPkg/HelloWorld/HelloWorld.inf

......

提示:在编译时可能会报错,我编译时有ShellCEntryLib这个库说找不到,找了一下,我在上面这个文件中添加了相关的库的inf(ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf是我加的),最终编译通过。

UEFI学习开发(2)Ubuntu基于EDK2编译运行一个app_第1张图片

 

(4).修改edk2\OvmfPkg\OvmfPkgX64.fdf

......
INF  OvmfPkg/Sec/SecMain.inf

INF  RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/ResetVector.inf

INF OvmfPkg/HelloWorld/HelloWorld.inf
......

2.编译生成efi文件

(1)在edk2路径下运行编译指令:

source edksetup.sh
build -a X64 -t GCC48 -p OvmfPkg/OvmfPkgX64.dsc

(2)编译完成后生成了efi文件

UEFI学习开发(2)Ubuntu基于EDK2编译运行一个app_第2张图片

 

3.用U盘加载eif文件运行ovmf

把编译生成的efi文件拷贝到U盘根目录下,我的U盘时fat32格式,在安装了qemu的前提下在终端窗口到edk2工程路径下运行如下指令:

sudo qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC48/FV/OVMF.fd -M pc -m 256 -cpu qemu64 -vga cirrus -name UEFI -boot order=dc -hda /dev/sdb1 -serial stdio

其中“-hda /dev/sdb1”是加载U盘设备,这个可以根据具体的来修改,用lsblk查看设备。运行结果如下图:

UEFI学习开发(2)Ubuntu基于EDK2编译运行一个app_第3张图片

 

总结:

编译应用时,会遇到缺少内部库模块的问题,可以在工程中搜索一下,看看是否能通过包含inf的方式解决。这里已经添加了shell输入和打印的功能的实现,在后期进行调试时,可以在调试过程中添加打印信息来掌握调试期间出现的问题。

 

 

你可能感兴趣的:(UEFI开发)