BDS简介
BDS 的全称是启动设备选择(Boot Device Select), DXE 阶段最终会调用BDS ARCH
protocol 的接口EFI_BDS_ARCH_PROTOCOL.Entry() 转入BDS阶段。BDS 阶段负责加载
额外的驱动,与用户交互,必要的硬件初始化,并转入操作系统。
系统全局环境变量
其他模块和BDS 交互是通过一系列系统全局环境变量进行的。其他模块会设置这些变量,BDS
在启动后会读取这些变量来决定诸如加载哪些额外的驱动、如何与用户交互、启动哪一个操作
系统等。这些全局环境变量包括 :
Langcode , Lang, Timeout, Platformlangcode , Conin, ConOut
BDS 入口函数
Boot####
Boot#### 描述一个启动选 项,#### 表示一个四位16进制数,由数字0-9 和大写字母A-F
组成。比如Boot0000, Boot0001, Boot0A02等。
BootOrder
BootOrder 表示加载操作系统的顺序。其在内存中对应的数据结构如下所示:
UINT16 BootOrder[];
BootOrder 数组中每一项对应于已经添加的启动选项Boot#### 的####。
举例来说当添加一个新的启动选项时,先找到一个未被使用的选项数字000A, Boot000A
将被创建,并且对应的选项数字000A 将被加到BootOrder 数组中。而当调整启动选项的顺序
时,只要更新BootOrder 即可。
BootNext
BootNext是一个可有可无的环境变量。其在内存中对应的数据结构如下:
UINT16 BootNext;
当BootNext存在时,BDS 将优先启动选项数字等于BootNext 的启动选项。
BdsDxe 的入口函数,负责安装EFI_BDS_ARCH_PROTOCOL 协议,以让DXE Foundation 调用 。
//
// Install protocol interface
//
Status = gBS->InstallMultipleProtocolInterfaces(
&gBdsHandle,
&gEfiBdsArchProtocolGuid, &gBds,
NULL
;
ASSERT_EFI_ERROR(Status);
EFI_BDS_ARCH_PROTOCOL gBds = {
BdsEntry
};
BdsEntry()
BDS 阶段的入口函数是BdsEntry(). DXE Foundation 调用EFI_BDS_ARCH_PROTOCOL.Entry()
即BdsEntry() 将控制权交给BDS.
//
// Initialize hothey service
//
InitializeHotKeyService();
//
// Fill in FirmwareVendor and FirmwareRevision form PCDs
//
FirmwareVendor = (CHAR16 *) PcdGetPtr(PcdFirmwareVendor);
gST->FirmwareVendor = AllocateRuntimeCopyPool(StrSize(FirmwareVendor), FirmwareVendor);
ASSERT(gST->FirmwareVendor != NULL);
gST->FirmwareRevision = PcdGet32(PcdFirmwareRevison);
//
// Fixup Tables CRC after we updated Firmware Vendor and Revison
//
gBS->CalculateCrc32((VOID *)gST, sizeof(EFI_SYSTEM_TABLE), &gST->Hdr.CRC32);
//
// Do the platform init, can be customized by OEM/IBV
//
PERF_START(NULL, "PlatformBds", "BDS", 0);
PlatformBdsInit();
InitializeHwErrRecSupport();
//
// Check if we have the boot next option
//
mBootnext = BdsLibGetVariableAndSize(
L"BootNext",
&gEefiGlobalVariableGuid,
&BootNextSize
);
//
// BDS select the boot device to load OS
//
初始化快捷键服务
初始化SystemTable 中的FirmwareVendor 和FirmwareRevision 域
平台相关BDS 初始化
初始化HwErrRecSupport 系统变量
加载操作系统
789