UEFI Shell 下的程序设计

偶尔善良 提交于 2020-04-02 16:40:00

  今天简单介绍一些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原理与编程》

 

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