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

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

  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
 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下挂载得变量数据得。

 

原文地址:https://www.cnblogs.com/szhb-5251/p/11609483.html

时间: 2024-07-28 21:01:35

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

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

MBR与GPT两种磁盘分区格式的区别 http://itoedr.blog.163.com/blog/static/120284297201378114053240 GPT Partition Table Scheme 一:UEFI BIOS可以说是legacy BIOS的继承者,也就是传统BIOS的后代咯.以后的主流模式. 二:MBR与GPT的区别 1.传统的MBR最大支持2TB的单分区,最多能设置4个主分区 2.GPT支持2TB以上的单分区,理论上能设置128个主分区(硬盘的4k对齐与GPT

BIOS中的UEFI和Legacy启动模式

BIOS即Basic Input/Output System,翻成中文是"基本输入/输出系统",是一种所谓的"固件",负责在开机时做硬件启动和检测等工作,并且担任操作系统控制硬件时的中介角色. 其中BIOS设置中,有两种让他启动进入系统的方法,分别是为UEFI和Legacey 其中(Legacy)BIOS是传统式的,而UEFI(Unified Extensible Firmware Interface)是后来发展出的可扩展固件接口,与legacy BIOS 相比,U

uefi bios代码中如果找到函数的实现?

写在最前,摘自 K&R The only legal operations on a structure are copying it or assigning to it as a unit, taking its address with & (读作 ampersand),  and accessing its members, 翻译成中文是这样的,对于一个结构体而言,唯一合法的操作是把它当成一个整体去给它赋值,或者拷贝到另一个地方. 取它的地址,访问它的成员. UEFI 定义了很多个

UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法

有关UEFI BIOS基础知识的简介,一年前在网易博客做过详细的概述.鉴于某些网友仍然对UEFI下Windows的启动过程不甚了解,虽然网上有各式各样的启动修复工具,但是对于新手来说,如果不明白其中的原理,使用工具也会畏首畏尾.十分盲目.现在详细介绍一下UEFI下Windows的启动流程以及引导文件修复方法.有关UEFI简介可以参考本博客的一篇文章: UEFI入门科普:http://www.heu8.com/117.html 在上述文章中已经展示出了UEFI下Windows的启动流程: UEFI

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

在重装系统的时候,很多时候都是先进入bios设置成U盘启动项,然后进行安装,如果年代久远一点的,就设置成光驱启动,再进行:随着时间的推行,光驱已经开始淘汰了,也怀念以前的光驱装机的时光!-:) 开始进入正题:很奇怪的一个问题,在一些预装了windows8.1的机器上,且硬盘格式为GPT格式,bios里面居然没有u盘的启动项可以选择,剩下windows boot manager的选项.可能出现这样的原因是windows8.1的安装,会导致写入到bios中,而且我设置的机器是方正的大客户品牌机. 解

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

传统BIOS的全称是Basic Input Output System,译为"基本输入输出系统",是电脑主板ROM芯片上的一段代码.按下电源后,计算机会进行加电自检(检测硬件是否正常).初始化硬件(使硬件按照PC的架构工作).启动OS Loader加载操作系统(由BIOS读取MBR上的Loader).向系统及软件提供服务.硬件中断处理(硬件出现错误指令->中断一下->由BIOS提供正确执行结果). 有必要澄清一下BIOS和CMOS的概念,上文说到BIOS是一段"代

UEFI BIOS和普通BIOS的区别

作为传统BIOS(Basic Input/Output System)的继任者,UEFI拥有前辈所不具备的诸多功能,比如图形化界面.多种多样的操作方式.允许植入硬件驱动等等.这些特性让UEFI相比于传统BIOS更加易用.更加多功能.更加方便.而Windows 8在发布之初就对外宣布全面支持UEFI,这也促使了众多主板厂商纷纷转投UEFI,并将此作为主板的标准配置之一.UEFI抛去了传统BIOS需要长时间自检的问题,让硬件初始化以及引导系统变得简洁快速.换种方式说,UEFI已经把电脑的BIOS变得

师兄U盘启动盘制作工具,支持UEFI+BIOS

官网 http://www.sspezz.com 官网方下载地址 : http://yjcz.sspezz.com/DSXPEinst2.exe百度云下载地址:  http://pan.baidu.com/s/1c1q1Kmk文件大小:  649 Mb 1.有三个PE选择[Win2003pe . Win8pe 32位 . Win10pe 64位]内核小 加载快!2.无推广软件, 可以设置个人主页 . 360联盟推广主页更方便3.Win10pe 支持PE上网功能   , 部分声卡支持  ,10PE

寻求对MIPS架构(国产龙芯处理器)感兴趣的软件开发人员一起开发开源UEFI BIOS

大家好: 作为一位软件开发人员,相信大家都思考过这样一个问题:为什么国产龙芯处理器性能与Intel同时期的处理器性能差别如此之大?为什么国产开源的软件发展远远不及国外?------是我们软件开发人员自身素养不够?还是原本国产处理器的硬件性能就不行?本人毕业与中国科学院计算技术研究所龙芯实验室,在龙芯实验室研发的那几年,也看到了龙芯的开源论坛上有那么多一批批对龙芯软件开源的爱好者.一直很好寻找一些志同道合,对开源感兴趣的朋友一起从事基于MIPS架构国产龙芯处理器平台的UEFI BIOS开发. 声明