作为新的学习,上手之后第一件事是想来个helloworld。记录一下整个过程吧。
开发环境:Ubuntu18.04虚拟机 + EDK2/OVMF + Qemu
1.第一步是OVMF的编译,以及Qemu的安装,这个之前也提过了,不再叙述
2.第二步,自定义一个hello world的shell app:
2.1 在edk2主目录下新建uefi/melo目录
2.2 进入melo目录,新建资源文件main.c以及工程文件Melo.inf
2.3 main.c:
#include <Uefi.h>
EFI_STATUS
EFIAPI Melo
(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE * SystemTable)
{
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello World!! I'm melo**********\n");
return EFI_SUCCESS;
}
2.4 Melo.inf:
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = Melo
FILE_GUID = 9023AB23-ED34-ffdb-AE97-1FA5E4ED2117
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = Melo
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
main.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiApplicationEntryPoint
UefiLib
2.5 在OvmfPkg/OvmfPkgX64.dsc的Components段加入:
uefi/melo/Melo.inf
2.6编译melo模块:
build -m uefi/melo/Melo.inf
3.第二步应该完成了melo.efi的生成,遇到的坑是在main.c里,返回值需要多加EFIAPI。不然会报错,这个应该是我看的uefi原理与编程有点老了。接下来需要需要给BIOS增加一个虚拟硬盘,然后把melo.efi文件放到虚拟硬盘里。这里参考网上的UEFI挂载虚拟盘部分:
dd if=/dev/zero of=~/hda.img bs=1 count=50M
mkfs -t vfat ~/hda.img
losetup /dev/loop0 ~/hda.img #映射loop设备
sudo mount /dev/loop0 /mnt/image #挂载loop设备
......(work in mnt dir)
umount /mnt/image #卸载loop设备
losetup -d /dev/loop0 #解除loop映射
这里可能会遇到loop0被占用的情况,可以一个个试loop1 loop2,我这边直接用了loop17来做映射。
然后BIOS启动参数需要做下调整,增加-hda参数来为OVMF挂载虚拟硬盘:
qemu-system-x86_64 -bios /root/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -hda hda.img -serial stdio
最终可以看到hello world成功:
UEFI Interactive Shell v2.2
EDK II
UEFI v2.70 (EDK II, 0x00010000)
Mapping table
FS0: Alias(s):F0a:;BLK0:
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
BLK1: Alias(s):
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
Press ESC in 1 seconds to skip startup.nsh or any other key to continue.
Shell> FS0:
FS0:\> LS
Directory of: FS0:\
12/10/2019 02:44 7,360 Melo.efi
12/10/2019 02:46 10,703 NvVars
2 File(s) 18,063 bytes
0 Dir(s)
FS0:\> Melo.efi
Hello World!! I'm melo**********
FS0:\>
来源:CSDN
作者:melo_fang
链接:https://blog.csdn.net/melo_fang/article/details/103471802