string

string
posts - 27, comments - 177, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
初识UEFI
按惯例,首先让我们用HelloWorld跟UEFI打个招呼吧
标准application
/*main.c */
#include 
<Uefi.h>
EFI_STATUS
UefiMain (
          IN EFI_HANDLE        ImageHandle,
          IN EFI_SYSTEM_TABLE  
*SystemTable
          )
{
   SystemTable 
-> ConOut-> OutputString(SystemTable -> ConOut, L"HelloWorld\n"); 
   return EFI_SUCCESS;
}
有以下几点需要注意:
1。 头文件, 所有的UEFI程序都有include <Uefi.h>
2。 main函数, UEFI 基本Application的main函数是UefiMain
3。 main函数的返回值类型 EFI_STATUS。 在UEFI中基本上所有的返回值类型都是EFI_STATUS。
它本质上是UINTN。 

4。 main函数的参数。.efi 文件加载到内存后称为Image, ImageHandle 用来描述、访问、控制此Image。 第二个参数是SystemTable,它是我们的程序同UEFI内核打交道的桥梁,通过它我们可以使用UEFI提供的各种服务,如Boot Services和 Runtime Services。 SystemTable是UEFI内核中的一个全局结构体。
5。  输出是通过EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL的OutputString服务完成的。 服务(函数)的第一个参数是This指针,指向Protocol本身。 OutputString()的第二个参数是Unicode字符串。
要想编译main.c,我们还需要.inf文件, 在main.c所在的目录下编辑main.inf文件
##

[Defines]
  INF_VERSION                    
= 0x00010005
  BASE_NAME                      
= main                    #输出文件的名字为 main.efi
  FILE_GUID                        
= 6987936E-ED34-ffdb-AE97-1FA5E4ED2117
  MODULE_TYPE                   
= UEFI_APPLICATION #模块类型:
UEFI_DRIVER
DXE_DRIVER
DXE_RUNTIME_DRIVER
,
UEFI_APPLICATION
,BASE,等
  VERSION_STRING               
= 1.0
  ENTRY_POINT                    
= UefiMain               #入口函数

#
# The following information 
is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           
= IA32 X64 IPF EBC
#

# 源文件
[Sources]  
   main.c 

# .dec里面定义 include的路径
[Packages]
  MdePkg
/MdePkg.dec

#要链接的库
[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib

[Protocols] 
[FeaturePcd]
[Pcd.common]
[Guids]
 
#编译选项, = 表示选项附加到默认选项后面。 == 表示仅使用所定义的选项,弃用默认选项。
[BuildOptions]
  #MSFT:
*_*_*_CC_FLAGS ==  /nologo //WX /GS- /W4 /Gs32768 /D UNICODE /O1ib2 /GL  /EHs-c- /GR- /GF /Gy /Zi /Gm /D EFI_SPECIFICATION_VERSION=0x0002000A /D TIANO_RELEASE_VERSION=0x00080006 /FAs /Oi-
  #MSFT:
*_*_*_CC_FLAGS =   /wd4804 
  #MSFT:Debug_
*_IA32_CC_FLAGS = 
  #MSFT:Debug_
*_X64_CC_FLAGS = 
  #MSFT:Release_
*_IA32_CC_FLAGS = 
  #MSFT:Release_
*_IA32_CC_FLAGS = 
  #MSFT:Release_
*_IA32_DLINK_FLAGS = 
  #GCC:Release_
*_IA32_CC_FLAGS = 

然后将  main.inf 添加到 Nt32Pkg.dsc 或UnixPkg.dsc 的[Components]部分, 例如添加下面一行(example目录在EDK2下)
example/main/main.inf
然后就可以使用BaseTools下的build进行编译了。
Windows下执行
edksetup.bat
build 
-p Nt32Pkg\t32Pkg.dsc -a IA32

Linux 执行
source .
/edksetup.sh BaseTools
build 
-p UnixPkg/UnixPkg.dsc -a IA32

其他类型的inf文件
 (1) 
可以看出标准的application处理命令行参数不方便,UEFI提供了帮我们处理命令行参数的入口函数ShellCEntryLib。 我们要实现INTN ShellAppMain(UINTN Argc, CHAR16** Argv) 作为(开发者视角的)入口函数。
/*Main.c */
#include <Uefi.h>
INTN
EFIAPI
ShellAppMain (
  IN UINTN Argc,
  IN CHAR16 **Argv
  )
{
 gST -> ConOut-> OutputString(gST -> ConOut, L"HelloWorld\n"); 
  return 0;
}
inf文件。 我们需要连接ShellCEntryLib 库。
[Defines]
  INF_VERSION                    = 0x00010006
  BASE_NAME                      = Main
  FILE_GUID                        = 4ea97c46-7491-4dfd-b442-747010f3ce5f
  MODULE_TYPE                   = UEFI_APPLICATION
  VERSION_STRING               = 0.1
  ENTRY_POINT                    = ShellCEntryLib

#
#  VALID_ARCHITECTURES           = IA32 X64 IPF
#

[Sources]
  Main.c

[Packages]
  MdePkg/MdePkg.dec
  ShellPkg/ShellPkg.dec

[LibraryClasses]   
  ShellCEntryLib
  UefiLib

[BuildOptions]
  

(2)使用main函数的application。如果你想像C一样使用main函数,那么你需要用到LibC。 LibC 中提供了ShellAppMain函数,我们要提供 int main(int Argc, char** Argv) 供其调用。
/*Main.c */
#include 
<Uefi.h>
int

EFIAPI
main (
  IN 
int Argc,
  IN 
char **Argv
  )
{
 gST -> ConOut-> OutputString(gST -> ConOut, L"HelloWorld\n"); 
  
return 0;
}
真正的入口函数是
ShellCEntryLib, 调用过程为  ShellCEntryLib -> ShellAppMain -> main.
inf 文件: 我们需要连接 ShellCEntryLib 和LibC库。
[Defines]
  INF_VERSION                    
= 0x00010006
  BASE_NAME                      
= Main
  FILE_GUID                        
= 4ea97c46-7491-4dfd-b442-747010f3ce5f
  MODULE_TYPE                   
= UEFI_APPLICATION
  VERSION_STRING               
= 0.1
  ENTRY_POINT                    
= ShellCEntryLib

#
#  VALID_ARCHITECTURES           
= IA32 X64 IPF
#

[Sources]
  Main.c

[Packages]

  MdePkg
/MdePkg.dec
  ShellPkg
/ShellPkg.dec

[LibraryClasses]   
  LibC
  ShellCEntryLib
  UefiLib

[BuildOptions]
  MSFT:
*_*_IA32_CC_FLAGS  = /Oi-
还要再说明一点,如果你的程序中用到了printf(...)等等标准C的库函数,那么一定要使用此种类型的application。 因为
ShellCEntryLib 函数中会调用ShellAppMain(...), StdLib的ShellAppMain(...) 会对stdlib 进行初始化。 然后才可以调用stdlib的函数。 (当然,如果你已经清楚地了解了入口函数的处理流程,你也可以手工调用StdLib的ShellAppMain进行出事后).
(3)Lib 模块的inf文件。开发大型工程的时候我们会用到lib,例如我们要开发视频解码程序,会用到zlib库,
[Defines]
  INF_VERSION                    
= 0x00010005
  BASE_NAME                      
= zlib
  FILE_GUID                        
= 348aaa62-BFBD-4882-9ECE-C80BBbbbb736
  VERSION_STRING               
= 1.0
  MODULE_TYPE                   
= BASE    #Base 表示此模块编译为library
  LIBRARY_CLASS                 
= zlib

#
# The following information 
is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           
= IA32 X64 IPF EBC
#

[Sources]
  adler32.c
  crc32.c
  deflate.c
  infback.c
  inffast.c
  inflate.c
  inftrees.c
  trees.c
  zutil.c
  compress.c
  uncompr.c
  gzclose.c
  gzlib.c
  gzread.c
  gzwrite.c

[Packages]
  MdePkg
/MdePkg.dec
  MdeModulePkg
/MdeModulePkg.dec
  StdLib
/StdLib.dec

[LibraryClasses]
  MemoryAllocationLib
  BaseLib
  UefiBootServicesTableLib
  BaseMemoryLib
  UefiLib
  UefiRuntimeServicesTableLib

[Protocols]
 

[FeaturePcd]

[Pcd]

[Guids]
 

[BuildOptions]
   GCC:*_*_IA32_CC_FLAGS = -D__UEFI__ -DLARGEFILE64_SOURCE=1  -w
然后将 
zlib|zlib-1.2.6/zlib.inf # zlib-1.2.6 在EKD2的根目录下
放到.dsc 文件 [LibraryClasses]中。 需要链接zlib的时候,在.inf文件的
[LibraryClasses]
中添加 zlib即可。
(4)driver模块的inf文件。例如DiskIo的inf(
MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
)
[Defines]
  INF_VERSION                    
= 0x00010005
  BASE_NAME                      
= DiskIoDxe
  FILE_GUID                        
= 6B38F7B4-AD98-40e9-9093-ACA2B5A253C4
  MODULE_TYPE                   
= UEFI_DRIVER
  VERSION_STRING               
= 1.0
  ENTRY_POINT                    
= InitializeDiskIo

#
# The following information 
is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           
= IA32 X64 IPF EBC
#
#  DRIVER_BINDING                
=  gDiskIoDriverBinding
#  COMPONENT_NAME                
=  gDiskIoComponentName
#  COMPONENT_NAME2               
=  gDiskIoComponentName2
#

[Sources]
  ComponentName.c
  DiskIo.h
  DiskIo.c


[Packages]
  MdePkg
/MdePkg.dec

[LibraryClasses]
  UefiBootServicesTableLib
  MemoryAllocationLib
  BaseMemoryLib
  BaseLib
  UefiLib
  UefiDriverEntryPoint
  DebugLib


[Protocols]
  gEfiDiskIoProtocolGuid                        ## BY_START
  gEfiBlockIoProtocolGuid                       ## TO_START

现在我们已经扫除了编译UEFI应用的所有障碍。 在下一部分,我们将了解开发UEFI一定用到的系统服务。

Feedback

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-03-13 19:56 by ningle
nmake编译对应makfile,build编译对应inf,这两个文件有什么不同嘛?为啥要用两种格式文件去表示一个c文件了

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-03-26 17:03 by ningle
请教“其他类型的inf文件(1)使用main函数的application。“这部分,需要在dsc,添加哪些库实例,怎样添加?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-03-26 22:41 by djx_zh
@ningle
在.dsc文件末尾添加
!include StdLib/StdLib.inf
具体可参考AppPkg/AppPkg.dsc

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-06-26 14:29 by 刘炜
您好: 请问您熟悉efi tpm编程吗?如何在efi app中使用tpm 命令?有相关源码例子吗?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2012-07-05 11:33 by 李志华
你好,我是个初学者,使用UDKII2012SR1中的UDK2010.SR1.UP1-ReleaseNotes-MyWorkSpace文档说明在Win7x64上搭建的环境,按上面的方法在VS2008命令提示中执行出错,提示C:\MyWorkSpace\example\main.c和C:\MyWorkSpace\example\main.inf出错,这两个文档里面的字符我全变成AISI格式了

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-07-06 09:36 by djx_zh
ANSI格式应该没问题,可以把出错信息告诉我吗?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-07-06 09:37 by djx_zh
@刘炜
抱歉,我没有做过TPM的编程

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-08-01 23:12 by 刘炜
你好,为什么在编写gST的那个helloworld程序时,说gST变量没定义。这个变量是全局的吗?请问在哪了定义和初始化的?谢谢。

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-08-02 11:24 by djx_zh
@刘炜
是全局变量, 定义在MdePkg/Include/Library/UefiBootServicesTableLib.h
初始化在 MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.c
加上这个#include 试试
#include "Library/UefiBootServicesTableLib.h"

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-08-02 11:29 by 刘炜
@djx_zh
谢谢,我加了,可以运行了。

不知道你有对ext2文件读写的相关资料吗?uefi下不能识别ext文件系统吗?好像uefi下只有对fat读写的。

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2012-08-02 20:16 by djx_zh
@刘炜
uefi不能识别fat以为的文件系统,要想识别ext,只能自己去修改/编译ext的源码

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2012-09-12 15:59 by SunShine
@djx_zh
请教: 出现错误: " Instance of library class [ShellCEntryLib] is not found". 我用的是UDK2010.SR1.UP1,的确没找到ShellCEntryLib,这个库在哪里??

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2012-09-13 09:22 by djx_zh
@SunShine
在.dsc 中的 [LibraryClasses]加入
ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2012-09-13 09:59 by SunShine
@djx_zh
谢谢你的答复. 这样 添加果然好了. 由于我是初学者,所以想追问下, 你让添加这行的原因,是因为UefiShellCEntryLib.inf 中包含"BASE_NAME = UefiShellCEntryLib"吗? 有什么文档说明的吗? ( PS: 感觉要学的东西太多,不知道从何入手了, 现正从DEC, DSC的手册看起...)

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2012-09-18 04:32 by djx_zh
@SunShine
对。
你自己的.inf 中[LibraryClasses] 有 UefiShellCEntryLib, build看到后会去.dsc中找UefiShellCEntryLib 对应的.inf文件,并编译这个lib。 “|” 前是Lib的名字,后面是Lib的.inf路径。

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-02-21 08:22 by snowman1101
请问我加入了 C++库 但是 之后在用到 Print的时候 会被编译器(VS2012)
提示 无法从 const wchar_t [n] 向 const CHAR16 * 转换
我加入
typedef CHAR16 wchar_t ;
编译器又通过不了。
请问有办法解决吗 谢谢了

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-02-21 09:42 by djx_zh
试一下在你.inf文件的编译选项里加/Zc:wchar_t-

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-05 16:11 by becky
ShellAppMain函数中的gST是什么,在哪个文件里面可以找到其具体定义呢?还有使用main函数的application中,我运行后提示没有LibC,这是什么原因呢?本人初学,请不吝赐教。

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-05 16:19 by becky
在其他帖子中也经常看到“加库”,这个的具体操作是什么呢

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-06 06:14 by djxzh
@becky

啊哈, .dsc文件我没有在文章中分析。 LibC 在StdLib\stdlib.inc 中定义,你要 在你的.dsc中include这个文件。
使用main函数,最方便的方法是把你的.inf 添加到AppPkg\AppPkg.dsc里面。 然后build -p AppPkg\AppPkg.dsc

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-06 09:38 by becky
UDK2010.UP4.Complete,我安装的是这个版本的,里面怎么没有AppPkg,而且也找不到StdLib文件夹,我觉得很奇怪啊

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-12 11:51 by snowman1101
请问如果我想加入
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
应该怎么办呢
我在 dsc的 [LibraryClasses.common.DXE_DRIVER]
下面加入了
SmbiosDxe|MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf

可是怎么才能调用呢 谢谢了

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-12 11:52 by snowman1101
@becky
AppPkg 和StdLib 是需要另外单独下载的
你再去网站好好找找

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-12 15:13 by becky
您好啊,我又来提问啦。是这样子,我自己找了一个AppPkg文件及StdLib文件加入到了我的工作目录下。编译App后成功生成了两个efi文件:hello.efi,main.efi。然后我放到虚拟机下从U盘启动去运行这两个文件,结果hello可以正确运行,但是main这个不行。不知道你能不能给点意见呢?这个hello就和你上面的ShellAppMain类似,main这个就是你后面的main的这个,就是直接用C语言的标准库来写的。
还有一个问题想请教一下,就是这个.inf文件中的[Defines]下有一项FILE_GUID,这个的值有没有什么特殊意义呢,我编程的时候应该怎样来确定这个值呢?
谢谢啦

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-12 15:14 by becky
对了,我的是在X64的类型的

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2013-03-13 04:18 by djx_zh
@becky

可能是源代码的问题,我也遇到过main.efi不能运行的情况。 如果你只是学习UEFI, svn co https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2 edk2 可以下载到所有的源代码。 这样build出来的main.efi 是可以正常运行的。

FILE_GUID 没有特殊意义,编程中不会用到。 你任意生成一个GUID就可以了,你上网搜一下有很多GUID生成器

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2013-03-13 04:22 by djx_zh
@snowman1101
在你application的.inf文件的[LibraryClasses] 下面加入SmbiosDxe

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-13 19:36 by becky
太谢谢了,果然是下的代码有问题,已经可以了,非常感谢

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-19 14:42 by liujm_buct
请问,如何编译出X64的efi程序啊?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-20 11:31 by becky
您好啊,我又来提问了,就是我在程序代码中加入了bzero()函数,就include了strings.h,但是我不知道在inf中应该加入哪一个Lib。我想问一下,就是StdLib中include了很多头文件,我在inf的[LibraryClasses]添加Lib文件是,怎么知道Lib的名字呢?或者说,有没有文档详细了说明了StdLib中所包含的的所有库呢?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-22 01:00 by djxzh
@liujm_buct
build -a X64 [...]
首先你的编译器要支持64位编译

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-22 01:05 by djxzh
@becky
目前没有文档
StdLib\StdLib.inc
#
# C Standard Libraries
#
列出了所有的lib

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-27 10:50 by becky
您好啊,我现在基于包StdLib下的BsdSocketLib,做了一个socket通信的客户端。成功编译生成了efi文件,但是放到虚拟机下的EFI SHELL下运行后,执行socket函数的时候就出错了,提示信息是Exit status code:Unsupported。这个是什么原因呢?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-03-27 12:40 by snowman1101
@djx_zh
你好 请问 可不可以再讲一下 (4)driver模块的inf文件。
我想知道的是
如果 MODULE_TYPE = UEFI_DRIVER
是不是加在 dsc文件的 [LibraryClasses.common.UEFI_DRIVER] 下面
比如 上面的 DiskIoDxe 是不是我这样写就可以了
MyAddTest|MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf

照你说的 我把 MyAddTest 加在了我的 inf 文件的 [LibraryClasses] 下面
可是编译器却提示我 Instance of library class [MyAddTest] is not found
谢谢了

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-05-06 17:33 by 颍水之阳
你好:我想在VS2008里面进行单步调试,但是专门进不了我编写的应用程序,并且一步步的调试。我是菜鸟,刚开始学习UEFI

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-10-09 16:32 by xmuchgw
在“(2)使用main函数的application。如果你想像C一样使用main函数,那么你需要用到LibC。 ”中,加了LibC后,编译出错:

c:\edk2_trunk\Nt32Pkg\Nt32Pkg.dsc(...): error 4000: Instance of library class [LibStdLib] is not found
in [c:\edk2_trunk\StdLib\LibC\LibC.inf] [IA32]
consumed by module [c:\edk2_trunk\MyHelloWorld\main.inf]

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2013-10-20 23:29 by Djx_zh
@xmuchgw
你要使用AppPkg,当使用LibC时。

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2013-12-14 00:53 by kllei
请问return 的值如何在NSH批处理上获得
如 return 0

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2014-01-12 17:37 by 卢学忠
main.c 依照文中的步骤BUILD过程中提示:
Processing meta-data ............ done!
Building ... c:\edk2\MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLi
b.inf [IA32]
build...
: error 7000: Failed to start command
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Vc\bin\nmake.exe /nol
ogo tbuild [c:\edk2\Build\NT32IA32\DEBUG_VS2008x86\IA32\MdePkg\Library\PeiMemory
AllocationLib\PeiMemoryAllocationLib]
build...
: error 7000: Failed to start command
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Vc\bin\nmake.exe /nol
ogo tbuild [c:\edk2\Build\NT32IA32\DEBUG_VS2008x86\IA32\MdePkg\Library\PeiServic
esLib\PeiServicesLib]
build...
: error F002: Failed to build module
c:\edk2\MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLib.inf
[IA32, VS2008x86, DEBUG]
- Failed -
Build end time: 17:32:16, Jan.12 2014
Build total time: 00:00:13,
请问怎么解决?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2014-01-19 00:28 by djx_zh
@kllei
exit /b errorcode
这条命令会设置lasterror。

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2014-02-27 15:44 by lisinan
请问,自己编写的efi程序,如何进行调试呢?加入_asm int 3;后,进入调试界面定位在secmain中,但是进不到efi程序本身啊。请指教,感谢!

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2014-03-31 00:48 by djx_zh
关闭优化选项,然后就应该可以了
[BuildOptions]
MSFT:DEBUG_*_IA32_CC_FLAGS = /Od

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件  回复  更多评论   

2015-08-19 11:18 by winux
FILE_GUID = 6987936E-ED34-ffdb-AE97-1FA5E4ED2117
这个FILE_GUID是自己任意写吗?万一和别的GUID冲突了怎么办?

# re: UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件[未登录]  回复  更多评论   

2015-08-25 21:50 by djx_zh
@winux
是自己写的。两个有同样FILE_GUID的文件会被认为是同一个文件。通常不会通过GUID在系统全局范围内查找文件,所以文件GUID冲突通常不会造成困扰。
Protocol的GUID一定不能冲突。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理