EDK II之DXE Core框架简介
本文旨在简单的介绍一下DXE阶段的工作原理:
UDK2015的开源代码下载:https://github.com/tianocore/tianocore.github.io/wiki/EDK-II
DXE阶段是UEFI系统的最主要的组成部分,
1.DXE阶段主要由两部分组成:DXE内核 + 模块;
2.DXE内核提供了最基本的一些功能,比如Protocol的管理,事件的管理等等(DXE内核提供的基本功能称为服务);
3.通过加载各种模块扩展其他的功能;
4.DXE阶段的核心概念:Service、Protocol、Handle(Handle和Protocol组成一个二维链表,protocol提供的接口类似于内核符号表中的函数;Service类似于linux kernel api);
5.DXE内核在post过程中会加载各种模块,每个模块会安装不同的Protocol(Protocol类似于面向对象编程里面的类),用来扩展系统支持的功能;
内核提供的基本Service:
//
// DXE Core Module Variables
//
EFI_BOOT_SERVICES mBootServices = {
{
EFI_BOOT_SERVICES_SIGNATURE, // Signature
EFI_BOOT_SERVICES_REVISION, // Revision
sizeof (EFI_BOOT_SERVICES), // HeaderSize
, // CRC32
// Reserved
},
(EFI_CREATE_EVENT) CoreCreateEvent, // CreateEvent
(EFI_SET_TIMER) CoreSetTimer, // SetTimer
(EFI_WAIT_FOR_EVENT) CoreWaitForEvent, // WaitForEvent
(EFI_SIGNAL_EVENT) CoreSignalEvent, // SignalEvent
(EFI_CLOSE_EVENT) CoreCloseEvent, // CloseEvent
(EFI_CHECK_EVENT) CoreCheckEvent, // CheckEvent
(EFI_INSTALL_PROTOCOL_INTERFACE) CoreInstallProtocolInterface, // InstallProtocolInterface
(EFI_REINSTALL_PROTOCOL_INTERFACE) CoreReinstallProtocolInterface, // ReinstallProtocolInterface
(EFI_UNINSTALL_PROTOCOL_INTERFACE) CoreUninstallProtocolInterface, // UninstallProtocolInterface
(EFI_HANDLE_PROTOCOL) CoreHandleProtocol, // HandleProtocol
(VOID *) NULL, // Reserved
(EFI_REGISTER_PROTOCOL_NOTIFY) CoreRegisterProtocolNotify, // RegisterProtocolNotify
....
};
上面是DXE内核提供的功能。
但也有些Service,内核没有提供具体的实现,只是声明了接口:
EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate = {
{
EFI_RUNTIME_SERVICES_SIGNATURE, // Signature
EFI_RUNTIME_SERVICES_REVISION, // Revision
sizeof (EFI_RUNTIME_SERVICES), // HeaderSize
, // CRC32
// Reserved
},
(EFI_GET_TIME) CoreEfiNotAvailableYetArg2, // GetTime
(EFI_SET_TIME) CoreEfiNotAvailableYetArg1, // SetTime
(EFI_GET_WAKEUP_TIME) CoreEfiNotAvailableYetArg3, // GetWakeupTime
(EFI_SET_WAKEUP_TIME) CoreEfiNotAvailableYetArg2, // SetWakeupTime
(EFI_SET_VIRTUAL_ADDRESS_MAP) CoreEfiNotAvailableYetArg4, // SetVirtualAddressMap
(EFI_CONVERT_POINTER) CoreEfiNotAvailableYetArg2, // ConvertPointer
(EFI_GET_VARIABLE) CoreEfiNotAvailableYetArg5, // GetVariable
(EFI_GET_NEXT_VARIABLE_NAME) CoreEfiNotAvailableYetArg3, // GetNextVariableName
(EFI_SET_VARIABLE) CoreEfiNotAvailableYetArg5, // SetVariable
(EFI_GET_NEXT_HIGH_MONO_COUNT) CoreEfiNotAvailableYetArg1, // GetNextHighMonotonicCount
(EFI_RESET_SYSTEM) CoreEfiNotAvailableYetArg4, // ResetSystem
(EFI_UPDATE_CAPSULE) CoreEfiNotAvailableYetArg3, // UpdateCapsule
(EFI_QUERY_CAPSULE_CAPABILITIES) CoreEfiNotAvailableYetArg4, // QueryCapsuleCapabilities
(EFI_QUERY_VARIABLE_INFO) CoreEfiNotAvailableYetArg4 // QueryVariableInfo
};
以EFI_RUNTIME_SERVICES->ResetSystem()为例,不同的平台(比如x86与ARM),重启系统的实现方式是不一样的,所以UDK代码里面没有给出具体的实现。在实际项目中,通过平台BSP代码提供的模块来安装这个实现:
//
// Hook the runtime service table
//
SystemTable->RuntimeServices->ResetSystem = Cf9ResetSystem;
VOID
EFIAPI
Cf9ResetSystem (
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN CHAR16 *ResetData OPTIONAL
)
{
//不同平台的具体实现;
11 }
UDK整个系统的代码框架可描述如下:
1.内核声明了整个系统必须实现的接口(依据UEFI/PI规范);
2.一部分(最最基本)的接口的实现由内核提供,一部分接口的实现因为跟平台有关,所以由平台代码提供;
3.通过模块安装各种各样的扩展功能(protocol);
4.整个代码框架是微内核结构,内核只提供基本的功能,模块通过安装protocol来提供其它功能;
5. 内核实现了框架,并提供API,驱动程序调用内核提供的API把自己实现的接口(protocol)安装到系统中,系统使用统一的接口访问不同的实现。
6.DXE最后会把控制权交给BDS:

某个DXE driver会安装下面的protocol,用来提供BDS的入口,DXE到BDS体现了内核通过统一接口访问不同实现的思想。

模块举例:
UDK里面的模块举例:(这里的模块没有follow UEFI Driver Model)

UEFI Spec里面通过EFI_IMAGE_ENTRY_POINT 这个函数指针类型定义了 UEFI Image的入口点的形式(包括返回值和参数)

Linux里面的模块举例:

EDK II之DXE Core框架简介的更多相关文章
- EDK II之DXE Core的事件管理
本文简单介绍一下UEFI中的事件管理: UEFI是不支持多进程的,但是UEFI支持多事件分发机制.UEFI只支持时钟中断,并基于时钟中断实现事件分发.类似于OS中基于时钟中断来实现基于时间片的多任务调 ...
- Core Animation之框架简介(一)
Core Animation之框架简介(一) 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明 ...
- ABP CORE 框架入门视频教程《电话薄》基于 Asp.NET Core2.0 EF Core
ABP框架简介 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- Core Animation简介
一.Core Animation简介 * Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代 ...
- 爬虫基础(五)-----scrapy框架简介
---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...
- 1. Spring 框架简介及官方压缩包目录
一.Spring 框架简介及官方压缩包目录介绍 1.主要发明者:Rod Johnson 2.轮子理论推崇者: 2.1 轮子理论:不用重复发明轮子. 2.2 IT 行业:直接使用写好的代 ...
- 一、Core Animation简介
一.Core Animation简介 * Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代 ...
- Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]
Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2] 2015-07 北京海淀区 ...
- Spring Web MVC框架简介
Web MVC framework框架 Spring Web MVC框架简介 Spring MVC的核心是`DispatcherServlet`,该类作用非常多,分发请求处理,配置处理器映射,处理视图 ...
随机推荐
- sap gui 定义类并实现接口
1: 直接在类属性的interfaces 框输入 接口名称即可.
- 《全栈性能Jmeter》-2性能测试初体验
- 使用VS2013自带的PreEmptive Dotfuscator and Analytis来混淆C#代码
1. 使用VS2013编译你要打包的程序,会在文件夹中的 ..\bin\Release中 2. 点击VS2013中的TOOLS -> PreEmptive Dotfuscator and Ana ...
- webpack使用四
鼎鼎大名的Loaders登场了! Loaders是webpack提供的最激动人心的功能之一了.通过使用不同的loader,webpack有能力调用外部的脚本或工具,实现对不同格式的文件的处理,比如说分 ...
- git 语法
$ git init // 初始化一个Git仓库 会生成一个.git目录 $ git status // 查看仓库的状态 $ git add . // 将所有修改添加到暂存区 $git ad ...
- MyBatis基础入门《十八》动态SQL(if-where)
MyBatis基础入门<十八>动态SQL(if-where) 描述: 代码是在<MyBatis基础入门<十七>动态SQL>基础上进行改造的,不再贴所有代码,仅贴改动 ...
- pip install pyinstaller
C:\Users\coder211\Desktop>pip install pyinstallerCollecting pyinstaller Downloading PyInstaller-3 ...
- rpgmakermv(10) GraphicalDesignMode
插件地址:https://github.com/triacontane/RPGMakerMV/blob/master/GraphicalDesignMode.js 原文: メニュー画面や戦闘画面など各 ...
- sublime text3配置及相关小技巧
1.下载&安装: 官方地址:http://www.sublimetext.com/,sublime text3又更新了,支持不依赖插件进行侧边栏颜色的更改,同时自带的皮肤颜色也有四种,十分方便 ...
- html5闰年判断函数
<script> var year=2016; function runnian(year){ if (year%400==0) {return ...