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

热门文章

  1. SQLAlchemy黄金体验
  2. Tensorflow.keras小案例Mnist数字识别
  3. Kubernetes第二曲 集群部署(Etcd+Flannel)
  4. 优矿 pandas plt 显示平安银行基金月最大召回率
  5. 在数组后面添加指定元素
  6. c语言cout函数,c++中cin与cout 详解
  7. 运筹与决策(二)excel画图、公式与函数用法
  8. 企业数据防泄漏解决方案分享
  9. 【学懂数据结构】二叉树之舞之二叉树
  10. 【论文阅读】Image Super-Resolution Using Deep Convolutional Networks