BIOS学习笔记之UEFI模块机制

本文旨在简单的介绍一下UEFI的模块机制:

BIOS是固化在电脑主板上的一段程序,主要功能就是初始化主板,最后加载操作系统(OS);而UEFI通俗一点讲就是一种BIOS的规范,它提出了一种BIOS的实现架构并提供了一套开源的实现。

我们知道Linux的模块机制是通过宏来定义模块的入口点的(参考:Linux学习笔记之内核启动流程与模块机制),而UEFI的模块机制理解起来更容易,它的每个模块都有一个inf文件,里面描述了模块的详细信息,比如入口点(入口函数)、模块包含哪些源文件等。

以U盘驱动为例:\MdeModulePkg\Bus\Usb\UsbMassStorageDxe\(UEFI的一个模块就是一个目录)

UsbMassStorageDxe.inf

 1 ##
 2 [Defines]
 3   INF_VERSION                    = 0x00010005
 4   BASE_NAME                      = UsbMassStorageDxe
 5   MODULE_UNI_FILE                = UsbMassStorageDxe.uni
 6   FILE_GUID                      = 9FB4B4A7-42C0-4bcd-8540-9BCC6711F83E
 7   MODULE_TYPE                    = UEFI_DRIVER
 8   VERSION_STRING                 = 1.0
 9   ENTRY_POINT                    = USBMassStorageEntryPoint
10
11 ##
13 [Sources]
14   UsbMassBoot.h
15   UsbMassImpl.h
16   UsbMassBot.h
17   UsbMassBot.c
18   ComponentName.c
19   UsbMassImpl.c
20   UsbMassBoot.c
21   ....

ENTRY_POINT指明了模块的入口点,当这个模块被运行时,是从USBMassStorageEntryPoint()这个函数开始运行的。

[Sources]下面包含的是模块的源文件。

那这些模块是如何被加载运行的呢?

首先,在Build系统时,通过.fdf  .dsc文件指出我们想包含哪些模块(想包含某个模块,就把对应的inf文件的路径添加到这两只文件中,他们的作用类似于Makefile文件);之后在代码执行过程中,还是看DXE阶段,DXE阶段的入口点是DxeMain(),执行一些必要的初始化之后,会执行CoreDispatcher(),CoreDispatcher()负责找到系统中所有的模块,并执行他们的入口函数。

UEFI架构最主要的阶段就是DXE阶段,而这个阶段跟Linux的执行很像。个人认为UEFI在设计时一定从Linux的设计思想中获取了很多的灵感(比如Linux通过宏来指定模块的入口点)。

时间: 2024-11-05 07:34:53

BIOS学习笔记之UEFI模块机制的相关文章

FreakZ学习笔记:路由应答机制

FreakZ学习笔记:路由应答机制 路由应答机制是建立在路由发现和路由请求完成之后进行的,换句话说就是在通信链路建立完成之后,帧信息被传输到目的节点时,由目的节点进行的应答机制:路由应答机制在NWK.c下的mac_data_ind函数被调用,该函数的功能在另一篇文章<FreakZ学习笔记:接收过程详解>中有解释,这里不再赘述:相应代码如下: switch (cmd.cmd_frm_id) { case NWK_CMD_RTE_REQ: if(nib.dev_type != NWK_END_DE

Python学习笔记-安装MySQLdb模块

模块下载地址: MySQL-python 1.2.3 for Windows and Python 2.7, 32bit and 64bit versions http://www.codegood.com/archives/129 直接点击安装exe即可,如果缺少dll文件,可以百度下载相关dll文件. Python学习笔记-安装MySQLdb模块

Android:日常学习笔记(9)———探究广播机制

Android:日常学习笔记(9)---探究广播机制 引入广播机制 Andorid广播机制 广播是任何应用均可接收的消息.系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播.通过将 Intent 传递给 sendBroadcast().sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用. Android提供了一套完整的API,允许应用程序自由地发送和接受广播.发送广播使用Intent,接受广播使用 广播接收器(B

Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) -         url:  需要打开的网址 -         data:Post提交的数据 -         timeout:设置网站的访问超时时间 直接用urllib.request模块的urlopen()

Perl语言学习笔记 11 Perl模块

1.模块来源:随Perl发行版本一起打包.从CPAN下载 2.阅读模块文档:perldoc CGI 3.安装模块 makemaker方式: 指定安装目录: Module::build方式: cpan方式: 4.File::basename模块 5.仅选用模块的部分函数 导入引用列表即可 10.不引入任何函数 通过全名的方式使用: 11.File:Spec模块 12.CGI.pm 13.数据库与DBI DBI:数据库接口(Database Interface) 还需安装对应版本的数据库驱动程序DB

Python学习笔记__5章 模块

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,在Python中,一个.py文件就称之为一个模块(Module) 1.1.使用模块的好处 提高了代码的可维护性 当一个模块编写完毕,就可以被其他地方引用 避免函数名和变量名冲突.相同名字的函数和变量可以分别存在不同的模块中 1.2.python组织模块的方法 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Pack

node.js学习笔记5——核心模块1

Node.js核心模块主要内容包括:(1)全局对象 (2)常用工具 (3)事件机制 (4)文件系统访问 (5)HTTP服务器与客户端 一: 全局对象 Node.js中的全局对象是global,所有的全局变量(除了global本身以外)都是global的属性. global 最根本的作用是作为全局变量的宿主. 全局变量的条件: (1)在最外层定义的变量; (2)全局对象的属性: (3)隐式定义的变量(未定义直接赋值的变量(strict模式下不可以)) 在Node.js中不可能在最外层定义变量,因为

SQLite学习笔记(九):pager模块

概述 通过上一篇文章的分析,我们知道了pager模块在整个sqlite中所处的位置.它是sqlite的核心模块,充当了多种重要角色.作为一个事务管理器,它通过并发控制和故障恢复实现事务的ACID特性,负责事务的原子提交和回滚:作为一个页管理器,它处理从文件中读写数据页,并执行文件空间管理工作:作为日志管理器,它负责写日志记录到日志文件:作为锁管理器,它确保事务在访问数据页之前,一定先对数据文件上锁,实现并发控制.本质上来说,pager模块实现了存储的持久性和事务的原子性.从图1中我们可以看到pa

Python scikit-learn机器学习工具包学习笔记:feature_selection模块

sklearn.feature_selection模块的作用是feature selection,而不是feature extraction. Univariate feature selection:单变量的特征选择 单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些指标重要.剔除那些不重要的指标. sklearn.feature_selection模块中主要有以下几个方法: SelectKBest和SelectPercentile比较相似,前者选择排名排在前n个