BIOS学习笔记之UEFI模块机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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通过宏来指定模块的入口点)。

 

以上是关于BIOS学习笔记之UEFI模块机制的主要内容,如果未能解决你的问题,请参考以下文章

uefi bios怎么设置

为啥bios里没有uefi shell启动的选项

UEFI引导系统

怎么把uefi改为legacy

Linux学习笔记之内核启动流程与模块机制

惠普笔记本启动要手动选择efi才能进系统