UEFI 基础教程 (十二) - 使用标准C库

一、 编写源代码

  1. 编写UEFI Application
    代码C:\edkii\OvmfPkg\MyHelloWorldStdLibC\MyHelloWorldStdLibC.c,
#include 

int main(int args , char ** argv){

  int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
  int i, j, temp, isSorted;
  
  printf("Before Sorting, ... \n");
  //排序前
  for(i=0; i<10; i++){
    printf("%d ", nums[i]);
  }
  printf("\n");
  
  //优化算法:最多进行 n-1 轮比较
  for(i=0; i<10-1; i++){
    isSorted = 1; //假设剩下的元素已经排序好了
    for(j=0; j<10-1-i; j++){
      if(nums[j] > nums[j+1]){
        temp = nums[j];
        nums[j] = nums[j+1];
        nums[j+1] = temp;
        isSorted = 0;
      }
      }
    if(isSorted) break; //如果没有发生交换,说明剩下的元素已经排序好了
  }
  
  //排序后
  printf("After Sorting, ... \n");
  for(i=0; i<10; i++){
    printf("%d ", nums[i]);
  }
  printf("\n");
  return 0;
}
  1. 编写 C:\edkii\OvmfPkg\MyHelloWorldStdLibC\MyHelloWorldStdLibC.inf,
[Defines]
  INF_VERSION = 0x00010006
  BASE_NAME = MyHelloWorldStdLibC
  FILE_GUID = c912f194-7f0e-4803-b907-b757b806ec73
  MODULE_TYPE = UEFI_APPLICATION
  VERSION_STRING = 1.0
  ENTRY_POINT = ShellCEntryLib
  VALID_ARCHITECTURES = X64
  
[Sources] 
  MyHelloWorldStdLibC.c

# 添加标准C库头文件  
[Packages]
  MdePkg/MdePkg.dec
  ShellPkg/ShellPkg.dec 
  StdLib/StdLib.dec

# 添加标准C库
[LibraryClasses]
  LibC 
  LibStdio
  ShellCEntryLib
  1. 修改OvmfPkg/OvmfPkgX64.dsc文件,文件末尾添加
##############################################################################
#
#  Include Boilerplate text required for building with the Standard Libraries.
#
##############################################################################
!include StdLib/StdLib.inc
!include AppPkg/Applications/Sockets/Sockets.inc

二、 编译生成EFI文件

运行edksetup.bat编译整个OvmfPkg Package

三、 运行 UEFI APP MyHelloWorldStdLibC.efi

  1. 拷贝 C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\FV\OVMF.fdC:\qemu;拷贝C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\X64\OvmfPkg\MyHelloWorldStdLibC\MyHelloWorldStdLibC\OUTPUT\MyHelloWorldStdLibC.efi 到 虚拟盘HDD_BOOT.img
  2. 执行setup-qemu-x64.bat , 然后在UEFI SHELL 中执行 MyHelloWorldStdLibC.efi,结果如下,
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传UEFI 基础教程 (十二) - 使用标准C库_第1张图片

四、 小结

本文通过引用EKDII中StdLib模块来编译运行标准C库程序,并在UEFI的SHELL下运行。通过使用标准C库,我们可以更灵活的编写通用程序,极大提高开发效率。

你可能感兴趣的:(15_固件开发)