UEFI 基础教程 (十四) - 设置默认启动项为UEFI Shell

Posted 毛毛虫的爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UEFI 基础教程 (十四) - 设置默认启动项为UEFI Shell相关的知识,希望对你有一定的参考价值。

一 编写源代码
OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c

UINTN
BootOptionPriority (
CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
)

DEBUG ((EFI_D_ERROR," [CSDN] BootOptionPriority %S .\\n", BootOption->Description));

if (StrCmp (BootOption->Description, L"Boot Device List") == 0)
return 4;

//
// Make sure Shell is last
//
if ( StrStr (BootOption->Description, L"EFI Internal Shell" ) != NULL)
return 1;

return 30;

/**

GC_TODO: add routine description

@param Left  - GC_TODO: add arg description
@param Right - GC_TODO: add arg description

@retval (BOOLEAN) (BootOptionPriority (Left) < BootOptionPriority (Right)) - GC_TODO: add retval description

**/

INTN
EFIAPI
CompareBootOption (
IN CONST VOID *Buffer1,
IN CONST VOID *Buffer2
)


return (BOOLEAN) (BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Buffer1) > BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Buffer2));

VOID
EFIAPI
PlatformBootManagerAfterConsole (
VOID
)

//
// Register UEFI Shell
//
PlatformRegisterFvBootOption (
&gUefiShellFileGuid, L"EFI Internal Shell", LOAD_OPTION_ACTIVE
);

//Add default boot first option as uefi shell
DEBUG ((EFI_D_ERROR," [CSDN]: EfiBootManagerSortLoadOptionVariable before.\\n"));
EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOption);
DEBUG ((EFI_D_ERROR," [CSDN]: EfiBootManagerSortLoadOptionVariable after.\\n"));

二、 编译生成EFI文件 & 运行

设置Shell为默认启动项后,Bios启动会优先加载Shell(对于OVMD而言就不用等待前面的PXE、QEMU USB加载了, 可以节省时间)。 当然如果需要设置其他的启动项为默认项,只需要修改BootOptionPriority 中 StrCmp (BootOption->Description, L"EFI Internal Shell")为 StrCmp (BootOption->Description, L"XXXX")。

UEFI 基础教程 (零) - 目录

GitHub 主页

UEFI 基础教程 (一)   —  搭建UEFI开发环境
UEFI 基础教程 (二)   —  运行第一个APP HelloWorld
UEFI 基础教程 (三)   —  运行第一个PEI Driver
UEFI 基础教程 (四)   —  运行第一个DXE Driver
UEFI 基础教程 (五)   —  PPI 初探
UEFI 基础教程 (六)   —  PROTOCOL 简单使用
UEFI 基础教程 (七)   —  HOB 简单使用
UEFI 基础教程 (八)   —  PCD 简单使用
UEFI 基础教程 (九)   —  EVENT 简单使用
UEFI 基础教程 (十)   —  FileIO 简单使用
UEFI 基础教程 (十一)  —  Shell下读取SMBIOS信息
UEFI 基础教程 (十二)  —  使用标准C库
UEFI 基础教程 (十三)  — VFR,HFR 简单使用
UEFI 基础教程 (十四)  — Variable的使用
UEFI 基础教程 (十四.1) — 设置默认启动项为UEFI Shell
UEFI 基础教程 (十五) — 获取UEFI MemoryMap
UEFI 基础教程 (十六) — ACPI 简单使用
UEFI 基础教程 (十七) — SMM的简单使用
UEFI 基础教程 (十八) — UEFI Build Process简单分析
UEFI 基础教程 (十九) — PCIe 简单使用

UEFI Refer Spec Collections

以上是关于UEFI 基础教程 (十四) - 设置默认启动项为UEFI Shell的主要内容,如果未能解决你的问题,请参考以下文章

uefi详细设置教程

Fedora 28 UEFI模式安装过程记录

华硕主板如何设置uefi bios启动?

老电脑怎么用nvme

用uefi安装redhat手动分区

UEFI 基础教程 (零) - 目录