本文旨在简单的介绍一下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