【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结

摘要:
以前,一些GUID和Lib函数的使用以及跨Pkg调用一直令人沮丧。大多数全局变量和协议都需要通过GUID定位或安装。添加g浪潮UserPassWordFlagGuid的定义(将其添加到dec的目的是在其他Pkg中直接调用此Guid,

---恢复内容开始---

  BIOS发展至今传统的汇编实现早已被抛弃,UEFI作为目前一套主流的标准定义接口,被广泛使用。之前被一些有关GUID和一些Lib函数的使用以及跨Pkg调用给折腾的不行,每次改代码都要build好多次,才能build过。趁着这次的一个Bug,针对GUID和Lib的跨Pkg使用做下小结。     

/*GUID*/

  顾名思义--globally unique identifier,全局唯一标识符。GUID是一个由128bit=16Byte的二进制数据组成,此数据的生成一般由专门的GUID生成器(千万别自己乱写哦),而且每次生成的GUID基本是不能重复的。BIOS中使用GUID的地方很多,大部分的全局变量以及Protocol等都需要通过GUID来locate或install。今天通过之前解的问题来介绍GUID的1. 格式   2. 用法。 (问题背景: InsydeMoudlePkg中的Moudle1中的某个程序要设置Variable1,Moudle2中的某个程序要去读取Variable1)

  (看之前,请先对UEFI的Pkg Moudle等概念以及dec/inf/dsc文档由个基本的掌握)

 1. 格式--同样我们从最终的需求处入手,一步步来。

  最终需求:在Password.c中需要将一个功能,将变量EncryptedHashData保存并挂载到gInspurUserPassWordFlagGuid的下面(如下图左一)。

  • Step1:  查看Password.c在哪个Pkg中如下图右一,

  【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结第1张         【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结第2张

  • Step2: 确定在InsydeMoudlPkg后,找到该Pkg的Dec文档,并把gInspurUserPassWordFlagGuid的定义添加进去即可(添加至dec的目的是为了能在其他Pkg中直接调用该GUID,为了不给未来自己挖坑,此步骤建议一定要做。因为同Pkg下跨Mould调用GUID或者跨Pkg调用GUID都是极其常见的)

         【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结第3张

  •  Step3: Dec中添加之后,你可以在该Pkg的各个Mouldle中使用该GUID。Password.c是属于GenericUtilityLib这个mouldle的,同样第一步先将gInspurUserPassWordFlagGuid添加到moudle的INF描述文档中。

       【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结第4张 【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结第5张

  •  Step4: 在inf添加了以后,该Moudle下的.c文档即可以使用该Guild,编译在编译解析INF文档时会变编译处一个.c文档并且把定义gInspurUserPassWordFlagGuid,那么处在该Mouldle下的所有.c文档均可以使用extern声明的方式,声明GUID并且直接使用它。如下图,我们是在Password.c中SetVaribale时使用的这个GUID,那么就可以直接在文件开始extern声明该GUID。

           【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结第6张

   梳理至此,大家对GUID的使用格式应该有个大概的掌握,总结如下:

  1.1在dec中定义该GUID,其一是为了让该Pkg下所有moudle都能看到该GUID且直接调用,其二是为跨Pkg使用该GUID时提供一个声明接口。其他Pkg的程序若要使用该GUID只需要在INF文档中添加DEC文件和GUID的声明即可

  1.2 INF文档添加GUID是表明该GUID对本Moudle所有程序可见且可用

 2. 用法

  GUID作为全球唯一标识符,那么UEFI中GUID到底是如何使用的呢?常说的某个某个变量或者某个Protocol挂载在某个GUID下面又是什么意思呢? 

 /*以gRT->GetVariable()函数为例*/
1
typedef 2 EFI_RUNTIMESERVICE 3 EFI_STATUS 4 (EFIAPI *EFI_GET_VARIABLE) ( 5 IN CHAR16 *VariableName, 6 IN EFI_GUID * VendorGuid, 7 OUT UINT32 *Attributes OPTIONAL, 8 IN OUT UINTN *DataSize, 9 OUT VOID *Data 10 );
  • gRT->GetVariable()得函数实体如下,楼主使用得是Insyde代码,因此这里需要注意Insyde对这块应该做了较大得修改封装为了InsydeMoudlePkg,楼主为了照这个实体函数,花了好多时间,实在不应该。在此提示,不要用DEBUG()函数来定位,应该该模块中得DebugLib中定义是NULL,所以我加了DEBUG()后没有显示。最终是采用CMOS方法,才找到这个函数。找到了函数实体,那我们就去追下code,看到底是如何索引GUID,并找到该GUID下挂载得变量数据得。

       【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结第7张

 

免责声明:文章转载自《【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇istio 学习之 手动注入sidecarAndroid实现程序前后台切换效果下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows编程系列:Windows中的消息

win32控制台程序 控制台程序整个执行过程是按照代码的顺序依次执行,到main函数的结束,标志着整个程序的退出。 1 int main() 2 { 3 4 return 0; 5 } 整个过程可以描述为以下: Windows应用程序 Windows应用程序会响应来自用户和操作系统的事件。 来自用户的事件包括:鼠标单击,按键,触摸屏手势...

MongoDB文档操作(5)

添加文档 语法: db.集合名.insert({k1:"v1", k2:"v2"....}) 注意: (1)文档就是键值对,数据类型是BSON格式,支持的值更加丰富。 比如:db.集合名.insert({name:"bashlog", spc:{weight:100, address:"henan"}}) (2)在添加的文档里面,都有一个'_id'的键,...

速卖通开放平台调用菜鸟组件实现云打印

        公司是跨境电商,使用速卖通平台卖玩具,我们自己研发的ERP是基于速卖通开放平台API,实现订单的发货提交,打印面单等功能         近期公司要求使用菜鸟组件云打印,去平台里看下,有这个API,如下图所示 实现也很容易,返回值如下图所示         其中,encrypteData是加密数据(关键数据)         我们再来看...

Unity3D面试题总结

一.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。 主要步骤有: 本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。 二.如何优化内存? 有很多种方式,例如 1.压缩自带类库; 2.将...

7.qml-Qt对象

QML除了支持ECMAScript内置对象对象外,还自己给用户提供了许多宿主对象.当然用户也可以自己自定义对象. 内置对象 : 由 ECMAScript所提供的对象;如Object、Array、Math、Date等等。 宿主对象 :即由 ECMAScript 实现的宿主环境提供的对象,比如Qt对象. 自定义对象 :自定义构造函数所创建的对象。 本章我们...

jmeter垮线程组设置全局变量(传递参数)

全局变量是指可以跨线程组调用。 第一种方式:通过函数助手__setProperty  设置 ,调用的时候直接用函数助手中__property获取变量。  生成:${__setProperty(newordertime1,${cancelEndTime},)};   获取:${__property(newordertime1)}  第二种方式:使用Bea...