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

  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中如下图右一,

           

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

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

 

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

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

 

【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结的更多相关文章

  1. GPT vs MBR 分区 ,,, Legacy BIOS vs UEFI BIOS

    MBR与GPT两种磁盘分区格式的区别 http://itoedr.blog.163.com/blog/static/120284297201378114053240 GPT Partition Tab ...

  2. 惠普台式机在UEFI BIOS设置通电自动开机 影响电脑自动重启关不了机设置

    设置通电自动开机 影响电脑自动重启关不了机设置   惠普台式机在UEFI BIOS中 1. 开机时不断点击F10键进入BIOS,选择Advanced(高级)然后选择Boot Options,点击回车 ...

  3. BIOS中的UEFI和Legacy启动模式

    BIOS即Basic Input/Output System,翻成中文是"基本输入/输出系统",是一种所谓的"固件",负责在开机时做硬件启动和检测等工作,并且担 ...

  4. 【UEFI】---BIOS中UserPassword的重复校验总结

    UEFI作为目前较为流行的一套X86架构初始化的标准框架,已受到业界内的广泛认可.而其中很多编程所采用的思想确实值得学习.今天总结下UEFI的框架下修改代码的一点小经验,仅供菜鸟参考. 先列干货,具体 ...

  5. 对“传统BIOS”与“EFI/UEFI BIOS”的基本认识

    硬盘(MBR磁盘)分区基本认识+Windows启动原理 大家常会看到硬盘分区中这样的几种说法:系统分区.启动分区.活动分区.主分区.拓展分区.逻辑分区,MBR.PBR.DPT.主引导扇区等.尤其是看到 ...

  6. UEFI BIOS Rootkit Analysis

    catalog . BIOS简介 . UEFI BIOS . EFI编程简介 . UEFI Rootkit 1. BIOS简介 BIOS("Basic Input Output System ...

  7. EFI/UEFI BIOS启动

    全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构.它是可扩展固件接口标准的一部分,用来替代BIOS中的主开机纪录分区表.但因为MBR分区表不支持容量 ...

  8. UEFI,BIOS,MBR,

    UEFI启动是一种新的主板引导项,正被看做是有近20多年历史的BIOS 的继任者.顾名思义,快速启动是可以提高开机后操作系统的启动速度.由于开机过程中UEFI的介入 第一:安全性更强 UEFI启动需要 ...

  9. bios中只有windows boot manager下用U盘启动

    在重装系统的时候,很多时候都是先进入bios设置成U盘启动项,然后进行安装,如果年代久远一点的,就设置成光驱启动,再进行:随着时间的推行,光驱已经开始淘汰了,也怀念以前的光驱装机的时光!-:) 开始进 ...

随机推荐

  1. centOS 重启 php-fpm

     ps axo pid,%cpu,%mem,comm |grep php-fpm ps aux | grep php-fpm pkill -9 php-fpm /etc/init.d/php-fpm ...

  2. 【7003】&&【a203】合并多项式

    Time Limit: 3 second Memory Limit: 2 MB 问题描述      求两个一元多项式的和.输入多项式方式为:多项式项数.每项系数和指数,按指数从大到小的顺序输入.输出多 ...

  3. 深度学习——CNN

    整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 思想 filter尺寸 ...

  4. linux 快速和慢速处理

    老版本的 Linux 内核尽了很大努力来区分"快速"和"慢速"中断. 快速中断是那些能够很 快处理的, 而处理慢速中断要特别地长一些. 慢速中断可能十分苛求处理 ...

  5. 测试驱动开发实践—从testList开始

    [内容指引]运行单元测试:装配一条数据:模拟更多数据测试列表:测试无搜索列表:测试标准查询:测试高级查询. 一.运行单元测试 我们以文档分类(Category)这个领域类为例,示范如何通过编写测试用例 ...

  6. Linux 内核接口

    USB 端点被绑在接口中. USB 接口只处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口, 例如一个 USB 扬声器可能有 2 个接口: 一个 ...

  7. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

  8. shell截取字符串的8种方法

    参考文献: linux中shell截取字符串方法总结 [Linux]如何在Shell脚本中计算字符串长度? 截取字符串的方法一共有八种,主要为以下方法 shell中截取字符串的方法有很多中, ${ex ...

  9. MyBatis整合Spring MVC(易百教程)

    MyBatis是ibatis的升级版,作为hibernate的老对手,它是一个可以自定义SQL.存储过程和高级映射的持久层框架.与Hibernate 的主要区别就是 Mybatis 是半自动化的,而 ...

  10. HDU 1969 Pie [二分]

    1.题意:一项分圆饼的任务,一堆圆饼共有N个,半径不同,厚度一样,要分给F+1个人.要求每个人分的一样多,圆饼允许切但是不允许拼接,也就是每个人拿到的最多是一个完整饼,或者一个被切掉一部分的饼,要求你 ...