代码分析UEFI的执行流程
UEFI的运行阶段
本文的分析只会涉及到DXE之后的阶段,前面的略过。
DXE 阶段
DXE阶段的实现函数在edk2的MdeModulePkg/Core/Dxe/DxeMain
目录中,主入口函数为:
VOID EFIAPI DxeMain ( IN VOID *HobStart )
{......gBds->Entry (gBds); //DXE的最后调用BDS的主入口函数//// BDS should never return//ASSERT (FALSE);CpuDeadLoop ();UNREACHABLE ();}
在该函数中会调用各个DXE driver的入口函数,并且在函数的最后调用BDS的入口函数,进入BDS运行阶段。实际上BDS对于DXE来说也就是一个DXE Driver,它会在Driver初始化时注册BDS Procotol。然后在DXE的最后调用该procotol进入BDS阶段,实际上gBds对应的就是gEfiBdsArchProtocolGuid这个Procotol,这个gBds的定义在 MdeModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c
文件中:
EFI_CORE_PROTOCOL_NOTIFY_ENTRY mArchProtocols[] = {{ &gEfiSecurityArchProtocolGuid, (VOID **)&gSecurity, NULL, NULL, FALSE },{ &gEfiCpuArchProtocolGuid, (VOID **)&gCpu, NULL, NULL, FALSE },{ &gEfiMetronomeArchProtocolGuid, (VOID **)&gMetronome, NULL, NULL, FALSE },{ &gEfiTimerArchProtocolGuid, (VOID **)&gTimer, NULL, NULL, FALSE },{ &gEfiBdsArchProtocolGuid, (VOID **)&gBds, NULL, NULL, FALSE },{ &gEfiWatchdogTimerArchProtocolGuid, (VOID **)&gWatchdogTimer, NULL, NULL, FALSE },{ &gEfiRuntimeArchProtocolGuid, (VOID **)&gRuntime, NULL, NULL, FALSE },{ &gEfiVariableArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },{ &gEfiVariableWriteArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },{ &gEfiCapsuleArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },{ &gEfiMonotonicCounterArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },{ &gEfiResetArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },{ &gEfiRealTimeClockArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },{ NULL, (VOID **)NULL, NULL, NULL, FALSE }
};
BDS阶段
UEFI运行到DXE阶段的最后,会调用BDS Procotol Entry来进入到BDS阶段(boot device select),前面提到BDS也是一个DXE的driver,它的实现是平台相关的,edk2主线分支上的实现有一个:
MdeModulePkg/Universal/BdsDxe
而在高通平台上BDS的实现使用的是如下目录中的:
QcomPkg/Drivers/QcomBds
以它BdsDxe驱动作为例子,它的主要目的是注册一个Procotol到DXECore中,DXECore最后会触发Procotol的Entry操作,而该操作的内容就是执行BDS阶段的任务。
///
/// BDS arch protocol instance initial value.
///
EFI_BDS_ARCH_PROTOCOL gBds = {BdsEntry
};EFI_STATUSEFIAPIBdsInitialize (IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable){EFI_STATUS Status;EFI_HANDLE Handle;//// Install protocol interface//Handle = NULL;Status = gBS->InstallMultipleProtocolInterfaces (&Handle,&gEfiBdsArchProtocolGuid, &gBds,NULL);ASSERT_EFI_ERROR (Status);DEBUG_CODE (EFI_EVENT Event;//// Register notify function to check deferred images on ReadyToBoot Event.//Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL,TPL_CALLBACK,CheckDeferredLoadImageOnReadyToBoot,NULL,&gEfiEventReadyToBootGuid,&Event);ASSERT_EFI_ERROR (Status););return Status;}
它会注册一个procotol到DXECore,而具体调用的地方在DXE Main的最后:
gBds->Entry (gBds); //DXE的最后调用BDS的主入口函数
该procotol的Guid为gEfiBdsArchProtocolGuid,进入BDS阶段的入口为BdsEntry,它主要做的任务是:加载和启动kernel。
代码分析UEFI的执行流程相关推荐
- 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )
文章目录 一.do_mmap 函数执行流程 二.do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 & ...
- 微软AJax.net源码初步分析(2)--服务执行流程
我以一个最简单的helloworld为例,演示AJax.net源码中调用后台服务的机制,只是列出一些大体的框架,具体细节我还在研究中:) 不当之处,欢迎指正. 我先把例子中的核心代码列出,方便大家阅读 ...
- Yii2 源码分析 - 入口文件执行流程
2019独角兽企业重金招聘Python工程师标准>>> 以 yii 2.0.14 高级版的 frontend 为例,从 frontend/web/index.php 开始 //引用 ...
- android平台gallery2应用分析,Android5.1图库Gallery2代码分析数据加载流程
图片数据加载流程. Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->Photo ...
- javap分析字符串拼接执行流程
- djangorestframework源码分析2:serializer序列化数据的执行流程
djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-serial ...
- djangorestframework源码分析1:generics中的view执行流程
djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-generi ...
- 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
原文地址:http://www.cnblogs.com/dongying/p/4142476.html 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍 ...
- DRF基本使用及执行流程分析 | APIView源码分析
DRF基本使用及执行流程分析 介绍: # 使用的都是CBV的方式 ,继承的类为drf提供的类(提供的类很多) # 这里目前继承使用APIView类 # 因为APIView是所有类的基类,其他类可能拓展 ...
- 代码覆盖率原理分析:sys.settrace流程分析
sys.settrace分析环境 本文环境python3.5.2 sys.settrace函数执行 首先我们继续查看示例代码如下: import sysdef trace(frame, event, ...
最新文章
- PHP Countable接口
- java清除浏览器记录_Javascript脚本之清除浏览器历史数据
- java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)
- 上交大计算机导师俞凯,WLA青科聊高考①|偶像剧“男主”、上海交大教授俞凯的学霸人生...
- [翻译]React组件模式
- 利用URL重写跟踪Session(多学一招)
- SAP License:ERP咨询顾问之路
- 星河经纬加入会员可靠吗_珍爱网免费相亲可靠吗?女会员处境艰难红娘为她重拾勇气...
- 农作物分布数据、作物类型分布、农田分布数据、土地利用数据、植被类型数据、物候数据、NDVI数据
- win10共享计算机win7,win10与win7局域网共享的方法
- catia今天突然打不开了_catia打不开的解答
- 面对5400万抑郁症患者,这600位志愿者“树洞”打算用AI拯救他们
- tornado 异步
- python计算复数的辐角,(Python 3)1051复数乘法(15分),python31051
- Android Service的启动过程
- linux rac节点主机不定时重启,RAC 有个节点不定时重启-还请大侠们帮忙看看
- 软件测试工程师培训大纲(2020版)正式发布
- 联通 受限服务器未响应,联通设置宽带的时候服务器未响应
- 布林通道参数用20还是26_布林通道最佳参数
- developerWorks
热门文章
- 山西流传于百姓餐桌的宫府名菜——山西过油肉
- mysql 时间到年月日时分秒_请问如何将从mysql中读取的时间转变为年月日-时分秒的格式啊?...
- android添加adb命令行,Android—adb命令
- LeetCode12. 整数转罗马数字 / 剑指 Offer 40. 最小的k个数 / 剑指 Offer 41. 数据流中的中位数
- 类神经网络训练不起来怎么办——机器学习模型训练指南
- freeswitch拨打分机号
- 3A之自动白平衡(AWB)篇
- 实战 SQL:实现百度、高德等地图中的地铁换乘线路查询
- python爬虫 抓取豆瓣电影 电影分类排行榜的所有数据
- 对角化求可逆矩阵_「线性代数」求可逆矩阵P,使得相似矩阵对角化