一种建立特定排序的UEFI Boot Order的方法
技术领域
本发明属于计算机软件系统技术,具体涉及一种建立特定排序的UEFI BootOrder的方法。
背景技术
BIOS即“Basic Input Output System”,中文名称“基本输入输出系统”。它是一组固化到计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统加载程序。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
BIOS目前启动模式分为Legacy模式和UEFI模式。Legacy模式只能启动Legacy设备,UEFI模式只能启动UEFI设备。可启动设备可以是一个或者多个,也可能为零。通常可启动设备被以Boot Order的形式呈现,Boot Order里存放当前启动模式下所有的可启动设备。
现有的一些建立Boot Order排序的方法则存在以下缺陷:在用户需要特定的UEFI设备启动顺序时,需启动计算机进setup手动设置boot顺序,或者需要借tool来设置顺序,使用不便。
发明内容
发明目的:本发明的目的在于解决现有技术中存在的不足,提供一种建立特定排序的UEFI Boot Order的方法。
技术方案:本发明一种建立特定排序的UEFI Boot Order的方法,包括如下步骤:
(1)、在UEFI BDS阶段,确定UEFI Boot Order特定排序的顺序A,该顺序A按照用户需求或者BIOS供应商制定的规则来确定,比如A为(1.HDDs,2.CDs,3.FDDs,4.Networks,5.UEFI Shell);
(2)、通过系统表system table中的运行时服务runtime service里的GetVariable函数来获取保存所有可启动设备的变量BootOrder;BootOrder中保存的是相应设备号指针序列;
(3)、把顺序A的顺序作为外部循环条件,从其第一个设备类型开始逐一在BootOrder的内部循环里寻找匹配,如果匹配,则把该Boot####放在临时数组里第一们位置,并继续内循环,最后达到把BootOrder中所有类型为顺序A中第一个设备类型的设备,放在临时数组中的前面;
(4)、继续外循环以把BootOrder中的设备按顺序A中的类型顺序排列在临时数组里,直至外循环结束;
(5)、如果外循环结束,Boot Order中还有未被排序的Boot####,刚按当前在BootOrder中的先后顺序,逐一放到临时数组中的最后面;
(6)、把临时数组数据覆盖写入BootOrder变量。
上述步骤(3)中内外循环匹配的方法为:
(3.1)、HDD匹配:在所有文件系统中(gEfiSimpleFileSystemProtocolGuid)查找BlockIo设备(gEfiBlockIoProtocolGuid),在结果中得到这些设备的设备路径(EFI_DEVICE_PATH_PROTOCOL),如果设备路径中有硬盘描述结点(HARDDRIVE_DEVICE_PATH),则匹配成功,该设备为HDD。
(3.2)、CD匹配:在所有文件系统中(gEfiSimpleFileSystemProtocolGuid)查找BlockIo设备(gEfiBlockIoProtocolGuid),在结果中得到这些设备的设备路径(EFI_DEVICE_PATH_PROTOCOL),如果设备路径中有硬盘描述结点(CDROM_DEVICE_PATH),则匹配成功,该设备为CD。
(3.3)、UEFI Shell匹配:在设备路径中找Type为MEDIA_DEVICE_PATH,SubType为MEDIA_PIWG_FW_FILE_DP,且设备路径的FvFileName为ShellFileGuid,该设备为UEFIShell。
(3.4)、FDD匹配:在设备路径中找Type为ACPI_DEVICE_PATH,SubType为ACPI_DP,且设备路径的HID为0x0604,该设备为FDD。
(3.5)、Network匹配:从设备路径中获取BM_BOOT_TYPE,如果为MessageNetworkBoot,该设备为Network。
上述步骤(3)中若内循环时不匹配,则在内部循环中跳到下一设备,依次逐个比较,直到轮询每一个内部循环设备结束,或者遇到退出循环语句;将会进行外部循环第二个设备的匹配代码。
有益效果:为系统提供特定排序的UEFI Boot Order,相比无特定UEFI BootOrder排序的计算机启动设备选择,目的性更强,可节约时间和人力成本。
具体实施方式
下面对本发明技术方案进行详细说明,但是本发明的保护范围不局限于所述实施例。
本发明一种建立特定排序的UEFI Boot Order的方法,包括如下步骤:
(1)、在UEFI BDS阶段,确定UEFI Boot Order特定排序的顺序A,比如A为(1.HDDs,2.CDs,3.FDDs,4.Networks,5.UEFI Shell);
(2)、获取所有可启动设备所保存在的变量:’BootOrder’;
(3)、把顺序A的顺序作为外部循环条件,从其第一个设备类型开始逐一在BootOrder的内部循环里寻找匹配,如果匹配刚把该Boot####放在临时数组里第一们位置,并继续内循环,最后达到把BootOrder中所有类型为顺序A中第一个设备类型的设备,放在临时数组的前面;
其中,内外循环匹配的方法为:
(3.1)、HDD匹配:在所有文件系统中(gEfiSimpleFileSystemProtocolGuid)查找BlockIo设备(gEfiBlockIoProtocolGuid),在结果中得到这些设备的设备路径(EFI_DEVICE_PATH_PROTOCOL),如果设备路径中有硬盘描述结点(HARDDRIVE_DEVICE_PATH),则匹配成功,该设备为HDD。
(3.2)、CD匹配:在所有文件系统中(gEfiSimpleFileSystemProtocolGuid)查找BlockIo设备(gEfiBlockIoProtocolGuid),在结果中得到这些设备的设备路径(EFI_DEVICE_PATH_PROTOCOL),如果设备路径中有硬盘描述结点(CDROM_DEVICE_PATH),则匹配成功,该设备为CD。
(3.3)、UEFI Shell匹配:在设备路径中找Type为MEDIA_DEVICE_PATH,SubType为MEDIA_PIWG_FW_FILE_DP,且设备路径的FvFileName为ShellFileGuid,该设备为UEFIShell。
(3.4)、FDD匹配:在设备路径中找Type为ACPI_DEVICE_PATH,SubType为ACPI_DP,且设备路径的HID为0x0604,该设备为FDD。
(3.5)、Network匹配:从设备路径中获取BM_BOOT_TYPE,如果为MessageNetworkBoot,该设备为Network;
(4)、继续外循环以把BootOrder中的设备按顺序A中的类型顺序排列在临时数组里,直至外循环结束;
(5)、如果外循环结束,Boot Order中还有未被排序的Boot####,刚按当前在BootOrder中的先后顺序,逐一放到临时数组最后面;
(6)、把临时数组数据覆盖写入BootOrder变量。
实施例1:
用以上方法编译出的BIOS,在默认为UEFI mode的Setup或者Hotkey Boot Menu中将给用户呈现特定排序的Boot Order。用户可自行更改其Boot顺序。在一些重置系统的动作后(Clear CMOS,Load Default或者刷BIOS后第一次启动),会还原该特定排序的BootOrder。