启动设备选择BDS

本文深入解析了BDS(Boot Device Select)的工作原理,包括DXE阶段如何转入BDS阶段,系统全局环境变量的作用,如Langcode、Lang、Timeout等,以及BDS入口函数的实现细节。此外,还介绍了BootOrder和BootNext变量如何影响操作系统的加载顺序。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值