今天简单介绍一些shell下的程序设计:
和其他的语言的程序设计有所区别,shell环境下的程序设计需要借助package(包)来完成。在edk2的目录下可以清楚的看到有很多package:比如ShellPkg、MdePkg、MdeModulePkg等等。每个Pkg里面包含的函数又有所区别,所以编写一般的简单的程序一般都会放在默认的编译的Pkg里面(特殊的除外)。
默认的编译的Pkg的路径在 edk2/Conf/target.txt 可以找到比如我使用的就是 “ ACTIVE_PLATFORM=EmulatorPkg/EmulatorPkg.dsc” 这个.txt文件里面还包括默认的编译器,编译模式,IA32还是X64等等,这其实是一个基础的配置文件。
shell下的可执行程序文件形式为 .efi 文件,编译生成它最少需要一个.inf 文件和一个.c 文件(也常被叫做工程文件和源文件)
应用程序模块常见的分三种,分别为标准的应用程序模块,shell应用程序模块,使用main函数的应用程序工程模块。(其中最后一种我没弄出来,它需要借助标准的C库中的stdio.h 尝试了一段时间并没有成功) 先说说标准的应用程序模块
首先是工程文件代码:
[Defines] INF_VERSION=0x00010005 BASE_NAME=UefiMain //最终生成的efi文件的名字,例如UefiMain.efi FILE_GUID=6987936E-ED34-ffdb-AE97-1FA5E4ED2117 MODULE_TYPE=UEFI_APPLICATION VERSION_STRING=1.0 ENTRY_POINT=UefiMain //入口函数 [Sources] main.c //源文件路径 [Packages] MdePkg/MdePkg.dec //引用到的包的声明文件 [LibraryClasses] //链接到的库模块 UefiApplicationEntryPoint UefiLib
源文件代码:
#include<Uefi.h> EFI_STATUS UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable) { SystemTable->ConOut->OutputString( SystemTable->ConOut,L"hello,,,,,ourworld\n" ); return EFI_SUCCESS; }
源文件和工程文件放在一起,然后去默认的Pkg里面的.dsc文件里面把它的路径加上
如上图右下角所示把工程文件的路径添加完成即可。
最后打开cmd 运行edksetup 然后再build (参考上一篇博客)不出意外应该能编译成功 。编译所得的efi文件在build文件夹里面,以我的为例是在
edk2/Build/EmulatorIA32/DEBUG_VS2015x86/IA32 里面(因为我的默认编译是emulatorpkg)
打开uefi shell 虚拟环境 输入fs0:按回车 注意冒号
然后ls查看所有文件 应该能看到uefimain.efi
输入uefimain.efi 回车即可运行程序,输出想要的结果
如有遇到什么问题可以参考书籍《UEFI原理与编程》