一、DXE阶段介绍
DXE(Driver Execution Environment)阶段执行大部分系统初始化工作,进入此阶段时,内存已经可以被完全使用,因而此阶段可以进行大量的复杂工作。
DXE可以分为以下两部分:
- DXE内核:负责DXE基础服务和执行流程
- DXE派遣器:负责调度执行DXE驱动,初始化系统设备。
二、DXE阶段主函数流程
DXE阶段的源码位于MdeModulePkg/Core/Dxe/DxeMain/目录中。从DxeMain.inf文件中我们可以找到该阶段使用所有源码、依赖库、protocols和PCD的列表。
DXE Core的主函数DxeMain()执行过程如下:
- 把HOB列表的指针转换为union格式,便于使用。
- 初始化内存服务。
- 根据EFI System Table和EFI Runtime Service Table这两张表中的内容初始化EFI相关服务。
- AMI代码在此处对AmiLib进行了初始化,从而保证能够运行AmiDxeLib模块中的函数。
- 根据HOB列表的内容对其他系统服务进行初cmd始化,如映像服务,事件服务等。
- 获取所有的protocol,注册其GUID。protocol是一种特殊的结构体,用于驱动之间的通信。
- 初始化DXE Dispatcher并启动。
- 当一个FV的protocol被安装时,该FV中的每个驱动程序都会被添加到mDiscoveredList。如果FV中存在Apriori文件,则其中包含的驱动程序会被引导到mScheduledQueue。
- DXE Dispatcher从mScheduledQueue中依次加载驱动程序并启动它。在mScheduledQueue被清空后,检查mDiscoveredList,查看是否有任何项的依赖项已完整,并将这些项添加到mScheduledQueue。
- 当mScheduledQueue中没有更多驱动需要加载时,此函数就会自动退出。
- 显示所有加载失败的驱动的信息。
- 在切换到BDS阶段之前报告状态码。
- 通过EFI_BDS_ARCH_PROTOCOL找到BDS阶段的入口函数,运行如下代码来切换到BDS阶段。
gBds->Entry (gBds);
DXE执行流程:
DXE驱动之间通过Protocol通信,Protocol是一种特殊的结构体,每个Protocol对应一个GUID。当所有的Driver都执行完毕后,系统完成初始化,DXE通过EFI_BDS_ARCH_PROTOCOL找到BDS并调用BDS的入口函数,从而进入BDS阶段。从本质上讲,BDS是一种特殊的DXE阶段的应用程序。