UEFI_创建一个app
UEFI 编写自己的app
通过前面对EDK II 的开发环境搭建,我们已经可以成功运行了EDKII的基本固件,并进入了UEFI Shell。这一次我们将进行对shell命令的学习,并实现编写一个自己的app,并在shell环境下成功运行。
shell命令学习
指令 | 解释 |
---|---|
ls | 列出目录内容或者文件信息 |
map | 映射设备到设备路径 |
mem | 显示memory信息 |
mount | 在块设备上挂载文件 |
mv | 移动一个文件从一个地方到另一个地方 |
touch | 更新当前时间更新文件或者目录的文件 |
pci | 显示PCI设备 |
rm | 删除文件 |
stall | 停止处理器几微秒 |
echo | 关闭或者打开回显 |
edit | 能够打开文件并且编辑它 |
ver | 展示shell的版本号 |
cp | 复制文件 |
创建edk2标准应用程序
-
了解标准应用程序的工程文件组成
首先我们应该有一个概念就是,什么是标准应用程序?从《UEFI原理与编程》一书中对此的定义为在DXE阶段运行的应用程序(shell环境下也可以运行),现在先不用管什么是DXE阶段,我们把重点放到后面,该应用能在shell环境下运行,对于shell我们可能更熟悉一点,在前面环境搭建的时候的最后一步,我们就是实现了固件运行进入了UEFI Shell下,所以按照这个来理解的话,此类型的应用程序应该像我们在linux的终端下运行相应应用的过程。
对于一个标准应用程序工程模块的源文件包括C文件、.asm汇编文件,也可以包括.uni字符串资源文件和.vfr窗体资源文件等。
我们可以进入edk2\MdeModulePkg\Application\目录下可以看到一个名为:HelloWorld的工程文件夹。从名字就可以看出来,这个工程实现的便是打印出一句helloworld,根据前面说的可以在Shell环境下运行,那么可以理解为,helloworld的打印可以在shell下执行并输出。 -
按我们的理解,在windows下可以直接运行的文件类型是.exe文件,从书上可得,UEFI shell下可执行文件是.efi文件,那应用程序是怎么被编译成.efi文件的呢?过程如下:
1)UefiMain.c首先被编译成目标文件UefiMain.obj
2)连接器将目标文件UefiMain.obj和其他库连接成UefiMain.dll
3)GenFw工具将UefiMain.dll转换成UefiMain.efi -
此外,我们需要先简单认识一下edk2中的文件架构,这里直接引用书中的描述:
-
进入helloworld文件夹中我们可以看见一下几个文件
打开.c文件,去掉注释,我们可以看见,其中内容其实和我们熟悉的c语言一样,功能实现的部分中,我们目前可能会因为许多调用了其他库中的函数而有点迷惑,但是不要紧,我们先从它的表面英文译文入手,作一个大概了解或者推测,实现的过程大致为:
1)判断打印功能是否使能;
2)使用for循环进行对字符的逐个打印;
接下来打开.inf文件,.inf文件为模块的工程文件用来知道EDK2编译工具自动编译模块,根据书上的解释我们可以大概了解每个块的含义是什么:
此部分比较重要的Defines
应用类型的设置决定了是否能在shell中运行,入口函数名称要与.c文件中的一致;GUID通常要使用专门的guid生成网站生成,现在只要与其他模块不冲突就行; -
需要注意的是在edk2\MdeModulePkg\目录下有一个.dsc描述文件,我们进入此文件搜索[Components],在此块下的为此package里包含的模块列表,所以我们如果自己创建一个app工程文件的话我们需要在相应的平台.dsc描述文件中加入自己的.inf模块工程文件
6.以helloworld工程为参考,我们开始创建自己的app(ctrl C+V工程师哈哈哈)来了解创建过程:
1)首先在edk2\MdeModulePkg\Application\目录下新建一个myApp的文件夹,并在此文件夹下把helloworld文件夹中的所有文件导入到此处,并进行重命名;
2)进入.inf文件,根据我们上面的理解,在此文件中我们应该要做相应的修改,由于我们没有改动.c文件,所以ENTRY_POINT项不用修改,应用类型也同样不用修改,需要修改分别是:
对应项 | 值 |
---|---|
BASE_NAME | myApp |
MODULE_UNI_FILE | myApp.uni |
另外,由于我们修改了.uni的名字,.inf中[Sources],[UserExtensions.TianoCore.“ExtraFiles”]两个块中,相应文件也要修改相应文件名字。
3)进入edk2\MdeModulePkg\目录下,修改.dsc文件,从上面我们了解到,我们自己创建的工程文件也要加入到.dsc文件的[component]块下才会对我们的模块进行编译;
4)接下来cmd命令进入到edk2根目录下执行edksetup.bat再执行build -a IA32 -p MdeModulePkg\MdeModulePkg.dsc,等build成功后,进入edk2\Build\MdeModule\DEBUG_VS2019\IA32\目录下找到名为myApp.efi的文件,说明我们的自建模块已经编译成功。
5)接下来只需要进入到我们前面的qemu虚拟机下UEFI Shell下,把myApp.efi文件复制到我们指定的虚拟磁盘的文件夹中,通过基本shell命令进入到此磁盘,并运行myApp.efi文件
可以看见我们的myApp.efi文件成功运行,并与我们的设想一样,在shell下打印出了相应字符串。