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的执行流程相关推荐

  1. 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

    文章目录 一.do_mmap 函数执行流程 二.do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 & ...

  2. 微软AJax.net源码初步分析(2)--服务执行流程

    我以一个最简单的helloworld为例,演示AJax.net源码中调用后台服务的机制,只是列出一些大体的框架,具体细节我还在研究中:) 不当之处,欢迎指正. 我先把例子中的核心代码列出,方便大家阅读 ...

  3. Yii2 源码分析 - 入口文件执行流程

    2019独角兽企业重金招聘Python工程师标准>>> 以 yii 2.0.14 高级版的 frontend 为例,从 frontend/web/index.php 开始 //引用 ...

  4. android平台gallery2应用分析,Android5.1图库Gallery2代码分析数据加载流程

    图片数据加载流程. Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->Photo ...

  5. javap分析字符串拼接执行流程

  6. djangorestframework源码分析2:serializer序列化数据的执行流程

    djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-serial ...

  7. djangorestframework源码分析1:generics中的view执行流程

    djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-generi ...

  8. 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

    原文地址:http://www.cnblogs.com/dongying/p/4142476.html 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍 ...

  9. DRF基本使用及执行流程分析 | APIView源码分析

    DRF基本使用及执行流程分析 介绍: # 使用的都是CBV的方式 ,继承的类为drf提供的类(提供的类很多) # 这里目前继承使用APIView类 # 因为APIView是所有类的基类,其他类可能拓展 ...

  10. 代码覆盖率原理分析:sys.settrace流程分析

    sys.settrace分析环境 本文环境python3.5.2 sys.settrace函数执行 首先我们继续查看示例代码如下: import sysdef trace(frame, event, ...

最新文章

  1. PHP Countable接口
  2. java清除浏览器记录_Javascript脚本之清除浏览器历史数据
  3. java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)
  4. 上交大计算机导师俞凯,WLA青科聊高考①|偶像剧“男主”、上海交大教授俞凯的学霸人生...
  5. [翻译]React组件模式
  6. 利用URL重写跟踪Session(多学一招)
  7. SAP License:ERP咨询顾问之路
  8. 星河经纬加入会员可靠吗_珍爱网免费相亲可靠吗?女会员处境艰难红娘为她重拾勇气...
  9. 农作物分布数据、作物类型分布、农田分布数据、土地利用数据、植被类型数据、物候数据、NDVI数据
  10. win10共享计算机win7,win10与win7局域网共享的方法
  11. catia今天突然打不开了_catia打不开的解答
  12. 面对5400万抑郁症患者,这600位志愿者“树洞”打算用AI拯救他们
  13. tornado 异步
  14. python计算复数的辐角,(Python 3)1051复数乘法(15分),python31051
  15. Android Service的启动过程
  16. linux rac节点主机不定时重启,RAC 有个节点不定时重启-还请大侠们帮忙看看
  17. 软件测试工程师培训大纲(2020版)正式发布
  18. 联通 受限服务器未响应,联通设置宽带的时候服务器未响应
  19. 布林通道参数用20还是26_布林通道最佳参数
  20. developerWorks

热门文章

  1. 山西流传于百姓餐桌的宫府名菜——山西过油肉
  2. mysql 时间到年月日时分秒_请问如何将从mysql中读取的时间转变为年月日-时分秒的格式啊?...
  3. android添加adb命令行,Android—adb命令
  4. LeetCode12. 整数转罗马数字 / 剑指 Offer 40. 最小的k个数 / 剑指 Offer 41. 数据流中的中位数
  5. 类神经网络训练不起来怎么办——机器学习模型训练指南
  6. freeswitch拨打分机号
  7. 3A之自动白平衡(AWB)篇
  8. 实战 SQL:实现百度、高德等地图中的地铁换乘线路查询
  9. python爬虫 抓取豆瓣电影 电影分类排行榜的所有数据
  10. 对角化求可逆矩阵_「线性代数」求可逆矩阵P,使得相似矩阵对角化