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来赋值
bios 为硬盘中的grub生成入口
最新推荐文章于 2023-11-26 23:26:21 发布