EDK2开发(3)-Hello World
简介
本文分两部分
- 编译
MdeModulePkg
下的HelloWorld
并运行 - 自己新建一个 Package 并且写一个 HelloWorld,然后编译运行
编译现有程序并在 OVMF 运行
你可以在MdeModulePkg/Application/HelloWorld/HelloWorld.c
找到这个程序的源码
1 | UefiMain ( |
你可以修改Index
来指定循环次数,以多次打印字符串
构建并复制到文件系统
直接构建,然后复制到之前搞好的文件系统里
1 | build -a X64 -t GCC5 -p MdeModulePkg/MdeModulePkg.dsc -b DEBUG |
启动 QEMU
加载 OVMF
1 | qemu-system-x86_64 -L . -pflash bios.bin -nographic -net none --hda fat:rw:hda-contents |
可以看到 UEFI Shell 已经识别到了本地的文件系统
1 | UEFI Interactive Shell v2.2 |
使用fs0:
进入文件系统,并输入文件名HelloWorld.efi
回车即可运行
1 | Shell> fs0: |
这个字符串哪来的
你可能会问,下面这行代码怎么打出来UEFI Hello World!
的?
1 | Print ((CHAR16 *)PcdGetPtr (PcdHelloWorldPrintString)); |
唉,这你就不知道了吧,我刚学的我也不知道
不知道咋办呢,拿 VSCode 嗯搜,肯定可以搜到
首先可以查一下PcdGetPtr()
这个函数,可以看到他是做到了一个TokenName
到指针的映射,有点像 GTA 三部曲的GXT
文件原理
1 | /** |
那么再搜一下UEFI Hello World!
这个东西,经过查找,锁定到MdeModulePkg/MdeModulePkg.dec
的 1704 行
1 | ## This PCD defines the HelloWorld print string. |
呃。。虽然但是,我自己试了一下确实是这个部分决定了字符串内容,有兴趣你可以改一下重新编译看一下效果
通过注释可以看到这是一个PCD
,并且是一个字符串类型的PCD
,这个是什么东西呢,我搜了一下,感觉一时半会说不清,简单说就是变量,具有如下形式
1 | 变量名|默认值|类型|Token值 |
此处丢出一个我看的参考文:UEFI 原理与编程实践–PCD 的使用_潇洒 Anthony 的博客-CSDN 博客
自己写一个
EDK2开发(3)-Hello World