BIOS 启动项库代码初解析

问题:如何列举启动项和启动项的设备路径

MdeModulePkg\Library\UefiBootManagerLib\BmBoot.c
**BIOS 启动项库代码初解析_第1张图片
**

1、启动项的类型:

DriverOrder:已排序的驱动程序加载选项列表。(未用)
SysPrepOrder:已排序的系统准备应用程序加载选项列表。(未用)
BootOrder:有序启动选项加载列表。(主要)

2、枚举启动项

按以下顺序搜索所有可能的可引导媒体:
1、Removable BlockIo: 引导选项仅指向可移动介质设备,如USB密钥、DVD、软盘等。
2、Fixed BlockIo:引导选项仅指向Fixed BlockIo设备,比如硬盘。
3、Non-BlockIo SimpleFileSystem:引导选项指向支持SimpleFileSystem协议,但不支持BlockIo协议
4、LoadFile:引导选项指向支持LoadFile协议
启动项的保存进行了两层variable
首先,列举的可能的可引导媒体数量已经保存到L“BootOrder”的全球变量中
然后,每个启动项的具体结构体EFI_BOOT_MANAGER_LOAD_OPTION保存到L“Boot####” 的全球变量中。

typedef struct {
  //
  // Data read from UEFI NV variables
  //
  UINTN                             OptionNumber;       // #### numerical value, could be LoadOptionNumberUnassigned
  EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType;         // LoadOptionTypeBoot or LoadOptionTypeDriver
  UINT32                            Attributes;         // Load Option Attributes
  CHAR16                            *Description;       // Load Option Description
  EFI_DEVICE_PATH_PROTOCOL          *FilePath;          // Load Option Device Path
  UINT8                             *OptionalData;      // Load Option optional data to pass into image
  UINT32                            OptionalDataSize;   // Load Option size of OptionalData
  EFI_GUID                          VendorGuid;

  //
  // Used at runtime
  //
  EFI_STATUS                        Status;             // Status returned from boot attempt gBS->StartImage ()
  CHAR16                            *ExitData;          // Exit data returned from gBS->StartImage ()
  UINTN                             ExitDataSize;       // Size of ExitData
} EFI_BOOT_MANAGER_LOAD_OPTION;

3、接口调用流程

BIOS 启动项库代码初解析_第2张图片
L"Boot%04x"是L"BootOrder"的子集
1、GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, &Size);

2、UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", BootOrder【Index】);
GetVariable2 (OptionName, &gEfiGlobalVariableGuid, (VOID **) &BootOptionVar, &VariableSize);

BootOptionVar 为 启动项的具体结构体EFI_BOOT_MANAGER_LOAD_OPTION 的初始地址。
Attributes = BootOptionVar ;
Attributes : LOAD_OPTION_CATEGORY_BOOT,LOAD_OPTION_ACTIVE,LOAD_OPTION_HIDDEN
在启动前调整不同类型的内存页码,并将更新后的信息保存到变量中,以便下次启动时使用
Description = BootOptionVar + sizeof (UINT32);
Description : L"UEFI Shell";L"UEFI Hard Drive";L"Kunlun Update Tool"
DevicePath = Attributes + (BmStrSize ((CHAR16 *) BootOptionVar, VariableSize - sizeof (UINT16) - sizeof (UINT32)));
DevicePath : PciBoot(0x0) /Pci(0x1,0x1)/Pci(0x0,0x0)/Nvme(0x1,10-48-B6-11-81-30-25-00)

3 、获取启动设备的devicepath,就可以连接控制器

你可能感兴趣的:(bios)