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标准应用程序

  1. 了解标准应用程序的工程文件组成
    首先我们应该有一个概念就是,什么是标准应用程序?从《UEFI原理与编程》一书中对此的定义为在DXE阶段运行的应用程序(shell环境下也可以运行),现在先不用管什么是DXE阶段,我们把重点放到后面,该应用能在shell环境下运行,对于shell我们可能更熟悉一点,在前面环境搭建的时候的最后一步,我们就是实现了固件运行进入了UEFI Shell下,所以按照这个来理解的话,此类型的应用程序应该像我们在linux的终端下运行相应应用的过程。
    对于一个标准应用程序工程模块的源文件包括C文件、.asm汇编文件,也可以包括.uni字符串资源文件和.vfr窗体资源文件等。
    我们可以进入edk2\MdeModulePkg\Application\目录下可以看到一个名为:HelloWorld的工程文件夹。从名字就可以看出来,这个工程实现的便是打印出一句helloworld,根据前面说的可以在Shell环境下运行,那么可以理解为,helloworld的打印可以在shell下执行并输出。

  2. 按我们的理解,在windows下可以直接运行的文件类型是.exe文件,从书上可得,UEFI shell下可执行文件是.efi文件,那应用程序是怎么被编译成.efi文件的呢?过程如下:
    1)UefiMain.c首先被编译成目标文件UefiMain.obj
    2)连接器将目标文件UefiMain.obj和其他库连接成UefiMain.dll
    3)GenFw工具将UefiMain.dll转换成UefiMain.efi

  3. 此外,我们需要先简单认识一下edk2中的文件架构,这里直接引用书中的描述:
    在这里插入图片描述

  4. 进入helloworld文件夹中我们可以看见一下几个文件
    在这里插入图片描述
    打开.c文件,去掉注释,我们可以看见,其中内容其实和我们熟悉的c语言一样,功能实现的部分中,我们目前可能会因为许多调用了其他库中的函数而有点迷惑,但是不要紧,我们先从它的表面英文译文入手,作一个大概了解或者推测,实现的过程大致为:
    1)判断打印功能是否使能;
    2)使用for循环进行对字符的逐个打印;
    在这里插入图片描述
    接下来打开.inf文件,.inf文件为模块的工程文件用来知道EDK2编译工具自动编译模块,根据书上的解释我们可以大概了解每个块的含义是什么:
    在这里插入图片描述
    此部分比较重要的Defines
    在这里插入图片描述
    应用类型的设置决定了是否能在shell中运行,入口函数名称要与.c文件中的一致;GUID通常要使用专门的guid生成网站生成,现在只要与其他模块不冲突就行;

  5. 需要注意的是在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_NAMEmyApp
MODULE_UNI_FILEmyApp.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下打印出了相应字符串。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值