1. 创建虚拟盘
dd if=/dev/zero of=~/hda.img bs=1 count=10M #1、创建img文件
mkfs -t vfat ~/hda.img #2、将文件重置为FAT格式
sudo losetup /dev/loop0 ~/hda.img #3、映射到loop设备
补:
或者
qemu-img create ~/hda.img 10M
mkfs -t vfat ~/hda.img #2、将文件重置为FAT格式
mkdir ovmf_boot
chmod 0777 ovmf_boot
sudo mount ~/hda.img ~/ovmf_boot #之后要进行操作直接对ovmf_boot操作就行了
#每次对ovmf_boot操作都需要重新挂载一次,不然img里的内容无法更新,或者efi无法正常运行,知道原理的可以在下面留言
sudo umount ~/ovmf_boot
sudo mount ~/hda.img ~/ovmf_boot
2. HelloWorld实例
- HelloWorld/HelloWorld.c
#include <Uefi.h>
#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;
}
- 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
- OvmfPkgX64.dsc
ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
- OvmfPkgX64.fdf
INF OvmfPkg/HelloWorld/HelloWorld.inf
3编译
build -a X64 -p OvmfPkg/OvmfPkgX64.dsc
cp HelloWorld.efi /media/fan/1173-7859/ #我电脑挂载设备名为1173-7859(每次都不一样)
sudo qemu-system-x86_64 -bios OVMF.fd -hda /dev/loop0
结论
重启电脑之后会打印成功,不知道是因为什么引起的。后面有时间再来讨论
补:
上面的原因就是img格式的问题或者没有更新啥的