BDS全称:Boot Dev Select(启动设备选择)
主要功能是加载并连接驱动程序,管理并启动引导项。在引导操作系统之前会初始化设备(USB键盘鼠标,VGA设备等),然后通过Variable功能来控制启动顺序,根据启动策略加载对应的引导项,启动操作系统或应用程序。
BDS主要功能:
• 加载设备驱动程序
• 初始化控制台设备
• 创建引导启动项
• 启动操作系统或应用程序
如果加载启动项失败,系统将重新执行DXE dispatcher 以加载更多的驱动,然后重新尝试加载启动项。
BDS策略通过全局NVRAM变量配置。这些变量可以通过运行时服务的GetVariable()读取,通过SetVariable() 设置。例如,变量BootOrder定义了启动顺序,变量Boot###定义了各个启动项。
用户选中某个启动项(或系统进入默认的启动项)后,OS Loader 启动,系统进入TSL阶段。
此模块为BDS阶段- BdsEntry生成主入口。 当DxeCore分派此模块时,gEfiBdsArchProtocolGuid将被安装 ,包含BdsEntry接口。 DxeCore完成DXE阶段后,gEfiBdsArchProtocolGuid->BdsEntry将被调用。
通过方法BdsEntry();
|--> BdsEntry()
|--> PlatformBootManagerBeforeConsole() //前平台初始化
|--> LoadOptions = EfiBootManagerGetLoadOptions() //获取所有的DeviceOption
|--> ProcessLoadOptions(LoadOptions)
|--> for EfiBootManagerProcessLoadOption(LoadOptions)
|--> EfiBootManagerConnectDevicePath(LoadOption->FilePath) //Connect DevicePath
|--> while
|--> BmGetNextLoadOptionBuffer(LoadOption->FilePath) //Image
|--> gBS->LoadImage()
|--> gBS->StartImage()
|--> EfiBootManagerDisconnectAll()
|--> EfiBootManagerConnectAll()
|--> PlatformBootManagerAfterConsole()
|--> while
|--> if BusSpecificDriverOverride->GetDriver()
|--> AddSortedDriverBindingProtocol(TRUE) // 函数内部进行递归
|--> for
|--> CoreHandleProtocol(DriverBinding)
|--> if DriverBinding->ImageHandle == DriverBindingHandle
|--> AddSortedDriverBindingProtocol(FALSE)
|--> for AddSortedDriverBindingProtocol() // 5 添加剩下所有的
|--> for 根据Version对最后添加的进行排序
|--> BdsEntry()
|--> ProcessLoadOptions()
|--> EfiBootManagerDisconnectAll()
|--> EfiBootManagerConnectAll()
|--> BmConnectAllDriversToAllControllers()
|--> gBS->LocateHandleBuffer()
|--> for gBS->ConnectController()
|--> CoreConnectController()
|--> CoreConnectSingleController()
|--> 排序
|--> for
|--> if DriverBinding->Supported() // 返回 Success
|--> DriverBinding->Start() // 一般用于安装 Protocol
|--> if //判断是否有子控制器
|--> CoreConnectController() //递归调用
概要:
BdsEntry()
|--> BdsEntry()
|--> PlatformBootManagerBeforeConsole() //前平台初始化
|--> PlatformRegisterOptionsAndKeys()
|--> EfiBootManagerGetBootManagerMenu() //获取Setup启动项
|--> EfiBootManagerAddKeyOptionVariable() //添加key#### Variable
|--> EfiBootManagerStartHotkeyService()
|--> BmGetKeyOptions()
|--> for BmProcessKeyOption()
|--> BmGenerateKeyShiftState()
|--> InsertTailList(mBmHotkeyList)
|--> BmRegisterHotkeyNotify()
|-->RegisterKeyNotify(BmHotkeyCallback) //注册callback
|--> BdsWait()
|--> while
|--> PlatformBootManagerWaitCallback() //显示
|--> BdsReadKeys()
|--> EfiBootManagerHotkeyBoot()
|--> EfiBootManagerBoot(&mBmHotkeyBootOption)
|--> BmHotkeyCallback()
|--> EfiBootManagerVariableToLoadOption(Hotkey->BootOption, &mBmHotkeyBootOption)
//ACPI boot type
#define BDS_EFI_ACPI_FLOPPY_BOOT 0x0201
//Message boot type
#define BDS_EFI_MESSAGE_ATAPI_BOOT 0x0301 // Type 03; Sub-Type 01
#define BDS_EFI_MESSAGE_SCSI_BOOT 0x0302 // Type 03; Sub-Type 02
#define BDS_EFI_MESSAGE_USB_DEVICE_BOOT 0x0305 // Type 03; Sub-Type 05
#define BDS_EFI_MESSAGE_SATA_BOOT 0x0312 // Type 03; Sub-Type 18
#define BDS_EFI_MESSAGE_MAC_BOOT 0x030b // Type 03; Sub-Type 11
#define BDS_EFI_MESSAGE_MISC_BOOT 0x03FF
//Media boot type
#define BDS_EFI_MEDIA_HD_BOOT 0x0401 // Type 04; Sub-Type 01
#define BDS_EFI_MEDIA_CDROM_BOOT 0x0402 // Type 04; Sub-Type 02
//BBS boot type
#define BDS_LEGACY_BBS_BOOT 0x0501 // Type 05; Sub-Type 01
#define BDS_EFI_UNSUPPORT 0xFFFF
引导流程