BIOS学习1.hello world

六眼飞鱼酱① 提交于 2019-12-10 13:04:25

    作为新的学习,上手之后第一件事是想来个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:\> 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!