代码分析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, ...
最新文章
- 面试处处碰壁,程序员“升值”好难呀!
- NLP分析技术的三个层面
- python二进制相加
- jpush 极光推送 java
- linux CentOS7 erlang安装
- python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
- Centos7内核版安装nginx环境问题及解决方法
- android viewflipper 滑动事件,Android真正简单的教程-第十二枪(ViewFlipper实现滑动效果)...
- 啊哈C语言 第1章 编程改变思维(第0讲)
- Java POI 合并单元格操作以及代码示例
- lqr算法 c语言,LQR最优控制原理介绍
- markdown pad2注册码(2017年9月27日)
- NOIP2018赛前停课集训记(10.24~11.08)
- siblings筛选同胞元素
- BT面板静态文件镜像库v7.1.0
- Python:AES+Base64的加密与解密(ECB模式)
- 程序员求职之道(《程序员面试笔试宝典》)之走进微软
- VC6代码移植VS2008的SDK总结,包括OPENGL和DireX还有Cimage 【总结】
- 【阿里云】深入分析阿里云中图片服务的架构经验
- autopilot 源代码