edk2开发环境用来开发UEFI驱动和UEFI应用,以及BIOS固件。在阅读edk2源码的过程中,经常找不到函数指针所指向的函数。这既是面向对象带来的好处,也是坏处。edk2中有两个重要的全局变量,分别是:gST、gBS。现在就来梳理一下这两个常见全局变量的定义、初始化。为什么要梳理这两个变量,因为它们携带一大波函数指针。

1、gST、gBS的出处
在MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.c中被定义和初始化。
    
2、efi文件的加载和执行
一个efi文件通常分两个步骤来执行,第一步,用gBS->LoadImage()将efi文件加载到内存生成Image对象,第二步,调用gBS->StartImage(Image)启动这个Image对象。

gBS->StartImage是个函数指针,它实际指向CoreStartImage函数。
在该函数中会调用Image的入口函数:

Image->Status = Image->EntryPoint(ImageHandle, Image->Info.SystemTable);

这里的Image->Info.SystemTable和gST指向同一个结构体

3、Image->Info.SystemTable的初始化
在MdeModulePkg/Core/Dxe/Image/Image.c中的CoreLoadImageCommon函数(1249行)中初始化了image->info.SystemTable,如下所示:

Image->Info.SystemTable  = gDxeCoreST;

4、gDxeCoreST的定义和初始化
它定义在:MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c(200行)
在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c中的DxeMain函数(280行)中初始化了gDxeCoreST,如下所示:

gDxeCoreST = AllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE), &mEfiSystemTableTemplate);

5、mEfiSystemTableTemplate的定义和初始化
它定义和初始化在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c(129行)
从这个定义可知,gBS和mBootServices指向同一个结构体

6、mBootServices的定义和初始化
它定义和初始化在mBootServices定义在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c中的47行,从这里可以看到,成员函数AllocatePages 指向:CoreAllocatePages

edk2中的全局变量gST和gBS相关推荐

  1. 在PHP中使用全局变量的几种方法

    简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的.一些常见的全局数据有:程序设定类.数据库连接类.用户资料等等.有很多方法能够使这些数据 ...

  2. 在JavaScript函数中定义全局变量

    是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...

  3. MFC中定义全局变量和全局函数的方法

    使用Visual C++6.0 中的MFC 基本应用时, 由于 MFC 制作的工程由很多文件构成, 它不能象一般C++程序那样随意在类外定义全局变量, 那样有时会在运行程序时出现问. 在软件开发过程中 ...

  4. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

    文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...

  5. python的全局变量能暂存数据吗_Python 中的全局变量 局部变量

    全局变量和局部变量 命名空间 1. 函数外部 函数外部声明的变量,可以被所有函数公共访问[所有地方都能访问这个变量] 函数的外边是一个空间:全局命名空间 2. 函数内部 一个函数中声明的变量,智能在函 ...

  6. 如何在C++Builder中使用全局变量

    如何在C++Builder中使用全局变量 关键字:C++Builder,全局变量 作者:yifei(逸飞)    更新:2005-09-14    浏览:13665 本文详细解释了如何在C++Buil ...

  7. html引用c 变量,在jsp页面中定义全局变量,供其他页面引用

    一.在一个jsp中引用另一个jsp的方法有: 1.使用 jsp include指令(常用): file属性是必填的(绝对或相对路径),但它不支持任何的表达式,也不允许通过?挂参方式来传递参数. 注意: ...

  8. JavaScript中的全局变量介绍

    Global variables are declared outside of a function for accessibility throughout the program, while ...

  9. SQL Server中常用全局变量介绍

    在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...

  10. python获取程序文件中的全局变量和局部变量的函数

    目录 global()和locals()函数 (一)演示示例 (二)程序执行结果 (三)简单使用 (四)参考资料 global()和locals()函数 使用global()可以获取Python中的全 ...

最新文章

  1. 2019第十四届全国菌根学术研讨会(第二轮通知)
  2. 任正非督战:华为强攻公有云业务 竞争残酷
  3. 180.4. WebSphere Commerce Engerprise 7.0 Feature Pack 2.iso
  4. getdata提取曲线数据_Origin如何从图表中获取数据
  5. C++基础复习——C++语言数据类型
  6. 分布式系统事务一致性解决方案大对比,谁最好使?
  7. 自动论文生成器 python_Python生成器常见问题及解决方案
  8. C语言 项目 CRM系统(客户信息管理系统)
  9. java代码题目_java题目代码?
  10. 04 循环结构概述和for语句的格式及其使用
  11. Java反序列化漏洞通用利用分析
  12. Java中的volatile的作用和synchronized作用
  13. url 收录工具_为什么我的网站不收录??
  14. 红米k50 至尊版 解锁bl 获取root教程步骤
  15. Sublime Text 3 配置C语言运行环境
  16. [Netlist29-358] Reg ‘Counter[7]‘ of type ‘FDCPE’ cannot be timed accurately. Hardwarebehavior may be
  17. 手机安装php7,php7.3编译安装时报错system libzip must be upgraded to version = 0.11
  18. 静态分析之数据流分析与 SSA 入门 (一)
  19. Swift 优化OC接口 NS_REFINED_FOR_SWIFT
  20. java获取文件编码

热门文章

  1. [Poi 2012] bzoj2794 Cloakroom [dp]
  2. 网络编程实战-极客时间
  3. C语言之while循环
  4. The Devil Wears Prada-2
  5. 码云zheng项目介绍
  6. 北京内推 | Hulu机器学习应用平台团队招聘推荐大数据方向暑期实习生
  7. 性能测试——抗攻击-hyenae-ddos攻击
  8. <学习笔记>从零开始自学Python-之-web应用框架Django( 八)Django表单
  9. C++实现鼠标左键点击关闭控制台
  10. 在职读研难,社科院与杜兰大学金融管理硕士项目让读研多了一种选择