本文共 2385 字,大约阅读时间需要 7 分钟。
bios有提供一个函数可以帮忙生成一个在os的启动项,通常情况下系统安装完成后会通过efibootmgr为这个os生成启动项,且这个启动项是存在flash中而非硬盘中。因此bios的shell中提供了一个BootFromFile的函数,可以scan 硬盘中的grubaa64.efi,从而为硬盘中已经存在的os生成新的启动项,这样做的好处是我把os装到一个硬盘里,这样我直接把这个硬盘拔下来插到另外一个机器上也可以使用实现的源码如下:BootFromFile ( IN EFI_DEVICE_PATH_PROTOCOL *FilePath ){ EFI_BOOT_MANAGER_LOAD_OPTION BootOption; CHAR16 *FileName; FileName = NULL; FileName = ExtractFileNameFromDevicePath(FilePath); if (FileName != NULL) { EfiBootManagerInitializeLoadOption ( &BootOption, 0, LoadOptionTypeBoot, LOAD_OPTION_ACTIVE, FileName, //在bios中生成启动项的名字 FilePath, //gruabaa64.所在的路径 NULL, 0 ); } return FALSE;}一个比较显眼的实现 Status = EfiBootManagerInitializeLoadOption ( &LoadOption, LoadOptionNumberUnassigned, LoadOptionTypePlatformRecovery, LOAD_OPTION_ACTIVE, L"Default PlatformRecovery", FilePath, NULL, 0 );其源码分析如下:EfiBootManagerInitializeLoadOption ( IN OUT EFI_BOOT_MANAGER_LOAD_OPTION *Option, IN UINTN OptionNumber, IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType, IN UINT32 Attributes, IN CHAR16 *Description, IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN UINT8 *OptionalData, OPTIONAL IN UINT32 OptionalDataSize ){ if ((Option == NULL) || (Description == NULL) || (FilePath == NULL)) { return EFI_INVALID_PARAMETER; } if (((OptionalData != NULL) && (OptionalDataSize == 0)) || ((OptionalData == NULL) && (OptionalDataSize != 0))) { return EFI_INVALID_PARAMETER; } if ((UINT32) OptionType >= LoadOptionTypeMax) { return EFI_INVALID_PARAMETER; } ZeroMem (Option, sizeof (EFI_BOOT_MANAGER_LOAD_OPTION)); Option->OptionNumber = OptionNumber; Option->OptionType = OptionType; Option->Attributes = Attributes; Option->Description = AllocateCopyPool (StrSize (Description), Description); Option->FilePath = DuplicateDevicePath (FilePath); if (OptionalData != NULL) { Option->OptionalData = AllocateCopyPool (OptionalDataSize, OptionalData); Option->OptionalDataSize = OptionalDataSize; } return EFI_SUCCESS;}可以看到EfiBootManagerInitializeLoadOption 主要是给形参Option来赋值