启动设备选择BDS

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

猜你喜欢

转载自blog.csdn.net/robinsongsog/article/details/99571230