edk2中的全局变量gST和gBS
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相关推荐
- 在PHP中使用全局变量的几种方法
简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的.一些常见的全局数据有:程序设定类.数据库连接类.用户资料等等.有很多方法能够使这些数据 ...
- 在JavaScript函数中定义全局变量
是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...
- MFC中定义全局变量和全局函数的方法
使用Visual C++6.0 中的MFC 基本应用时, 由于 MFC 制作的工程由很多文件构成, 它不能象一般C++程序那样随意在类外定义全局变量, 那样有时会在运行程序时出现问. 在软件开发过程中 ...
- 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...
- python的全局变量能暂存数据吗_Python 中的全局变量 局部变量
全局变量和局部变量 命名空间 1. 函数外部 函数外部声明的变量,可以被所有函数公共访问[所有地方都能访问这个变量] 函数的外边是一个空间:全局命名空间 2. 函数内部 一个函数中声明的变量,智能在函 ...
- 如何在C++Builder中使用全局变量
如何在C++Builder中使用全局变量 关键字:C++Builder,全局变量 作者:yifei(逸飞) 更新:2005-09-14 浏览:13665 本文详细解释了如何在C++Buil ...
- html引用c 变量,在jsp页面中定义全局变量,供其他页面引用
一.在一个jsp中引用另一个jsp的方法有: 1.使用 jsp include指令(常用): file属性是必填的(绝对或相对路径),但它不支持任何的表达式,也不允许通过?挂参方式来传递参数. 注意: ...
- JavaScript中的全局变量介绍
Global variables are declared outside of a function for accessibility throughout the program, while ...
- SQL Server中常用全局变量介绍
在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...
- python获取程序文件中的全局变量和局部变量的函数
目录 global()和locals()函数 (一)演示示例 (二)程序执行结果 (三)简单使用 (四)参考资料 global()和locals()函数 使用global()可以获取Python中的全 ...
最新文章
- 2019第十四届全国菌根学术研讨会(第二轮通知)
- 任正非督战:华为强攻公有云业务 竞争残酷
- 180.4. WebSphere Commerce Engerprise 7.0 Feature Pack 2.iso
- getdata提取曲线数据_Origin如何从图表中获取数据
- C++基础复习——C++语言数据类型
- 分布式系统事务一致性解决方案大对比,谁最好使?
- 自动论文生成器 python_Python生成器常见问题及解决方案
- C语言 项目 CRM系统(客户信息管理系统)
- java代码题目_java题目代码?
- 04 循环结构概述和for语句的格式及其使用
- Java反序列化漏洞通用利用分析
- Java中的volatile的作用和synchronized作用
- url 收录工具_为什么我的网站不收录??
- 红米k50 至尊版 解锁bl 获取root教程步骤
- Sublime Text 3 配置C语言运行环境
- [Netlist29-358] Reg ‘Counter[7]‘ of type ‘FDCPE’ cannot be timed accurately. Hardwarebehavior may be
- 手机安装php7,php7.3编译安装时报错system libzip must be upgraded to version = 0.11
- 静态分析之数据流分析与 SSA 入门 (一)
- Swift 优化OC接口 NS_REFINED_FOR_SWIFT
- java获取文件编码