博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bios 为硬盘中的grub生成入口
阅读量:4216 次
发布时间:2019-05-26

本文共 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来赋值

你可能感兴趣的文章
《浪潮之巅》5奔腾的芯 英特尔公司
查看>>
《浪潮之巅》7 互联网的金门大桥 -—思科公司
查看>>
《浪潮之巅》8英名不朽---杨致远、菲洛和雅虎公司
查看>>
《浪潮之巅》9硅谷的见证人———惠普公司
查看>>
优秀的人都将是孤独的
查看>>
android 实现摇一摇功能
查看>>
android 侧滑事件的监听
查看>>
创新中国总决赛之行
查看>>
当你厌恶一个人时,你要想一下你是否也是这样的一个人
查看>>
android 数据库sqlite的使用
查看>>
android 腾讯信鸽的使用
查看>>
Android 闹钟的实现详解
查看>>
Android 实现底部导航栏
查看>>
大二新学期开始
查看>>
java 中的集合
查看>>
Html 标签学习
查看>>
《浪潮之巅》 10没落的贵族--摩托罗拉公司
查看>>
《浪潮之巅》11 硅谷的另一面
查看>>
Android activity 之间的数据传递 bundle
查看>>
android Intent 常见用法和使用场景
查看>>