动态修改UEFI启动顺序的方法
技术领域
本发明涉及计算机领域,其主要发明内容是动态修改UEFI启动顺序的方法。
背景技术
固件是固化在Flash芯片中的软件程序。BIOS是计算机中最重要的固件之一,用于初始化硬件、管理硬件资源、屏蔽平台特性、引导操作系统,是连接计算机基础硬件和系统软件的桥梁。BIOS经过了传统BIOS到UEFI的演变。UEFI 的诞生就是为了取代传统BIOS,UEFI(Unified Extensible Firmware Interface)全称“统一的可扩展固定接口”,是一种详细描述全新类型接口的标准。与BIOS不同的是,UEFI体系的驱动并不是由直接运行在CPU上的代码组成的,而是用EFI Byte Code(EFI字节代码)编写而成的。它的编译代码就是以“Byte Code”形式存在的。EFI Byte Code是一组用于UEFI驱动的虚拟机器指令,可以在UEFI驱动运行环境下被解释运行,由此保证了充分的向下兼容性。
无论是UEFI还是BIOS,启动设备都比较多,包括从U盘、硬盘、光盘、ssd、网络和应用启动操作系统;在启动顺序上,市场上UEFI都有很多解决启动顺序的方案来,但都不是很全面的控制每一个启动,或者说是启动项的顺序不易于用户修改。
因此,本发明提出了动态修改UEFI启动顺序的方法的技术方案,用于实现自动化、精确的启动环境设置和执行。
发明内容
为解决上述技术问题,本发明提供了一种动态修改UEFI启动顺序的方法;UEFI启动顺序可以动态的修改,给用户更加直观的看到所有可启动设备的启动顺序,用户可以先通过修改不同类型设备的启动顺序,然后再通过同一类型的设备顺序的调整,来实现最终每一个设备的启动顺序。
为解决上述技术问题,本发明提供如下技术方案:
一种动态修改UEFI启动顺序的方法,该方法包括以下步骤:
步骤1:UEFI检测需要启动的设备;
步骤2:根据检测的设备类型数建立相应数目的类型启动管理选项;
步骤3:再次建立同一类设备的设备启动管理选项;
步骤4:根据UEFI检测出设备的种类数建立子页面来管理不同类型设备;
步骤5:根据需要修改启动选项管理子页面中的一个选项,其余选项也会自动的更新。
优选地,所述设备包括硬盘、U盘、光驱和网络设备。
优选地,所述子页面包括硬盘启动选项管理子页、U盘启动选项管理子页、光驱启动选项管理子页和网络启动选项管理子页。
优选地,所述方法是通过软件模块来实施的。
优选地,所述软件模块包括BootOrder.sd模块和BootOrde.c模块。
优选地,所述BootOrder.sd模块是根据vfr语言的语法实现两个功能:一是实现平台支持启动类型选项;二是实现动态子页面的Labe。
优选地,所述方法中的所有代码穿插在UEFI BDS阶段的整个过程中。
优选地,所述方法能动态显示启动设备的子页面。
优选地,所述方法中,UEFI启动控制项修改其中一个的启动顺序时,其他启动控制项自动修改。
优选地,所述方法中,将启动项中的其中一个禁止后,其他设备顺序将会自动向前移动。
本发明的有益效果:本发明提供的一种动态修改UEFI启动顺序的方法,UEFI启动顺序可以动态的修改,给用户更加直观的看到所有可启动设备的启动顺序,用户可以先通过修改不同类型设备的启动顺序,然后再通过同一类型的设备顺序的调整,来实现最终每一个设备的启动顺序。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显。
图1是本发明一种动态修改UEFI启动顺序的方法中UEFI启动项系统框图。
图2是本发明一种动态修改UEFI启动顺序的方法UEFI启动管理页示意图。
图3本发明一种动态修改UEFI启动顺序的方法硬盘启动选项管理子页面示意图。
图4本发明一种动态修改UEFI启动顺序的方法UEFI启动管理页示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明的描述中,需要理解的是,术语“上”、“下”、“前”、“后”、“左”、“右”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
本发明提供的一种动态修改UEFI启动顺序的方法主要解决UEFI启动项顺序的问题;UEFI启动是根据设备的路径进行寻找启动文件设备,现有方案可以根据设备的handle来进行设备的启动管理,但是都只是实现了功能,人机互动方式还不够灵活;
本发明的具体实现如图1所示;首先根据UEFI检测到的设备类型建立设备类型启动管理选项,再建立同一类设备的设备启动管理选项。
例如现UEFI检测到以下类型的设备:硬盘、U盘、光驱和网络设备,硬盘有硬盘1、硬盘2和硬盘3,U盘有U盘1和U盘2,光驱有光驱1,网络有网络1和网络2;因此建立的类型启动管理选项有4个:类型启动项1、类型启动项2、类型启动项3和类型启动项4;
设备管理要先建立四个子页面来管理四类不同类型设备,子页面有:硬盘启动选项管理子页,U盘启动选项管理子页,光驱启动选项管理子页和网络启动选项管理子页;
UEFI根据检测到的设备建立的启动管理页如图2所示,(选项框中的[网络/硬盘/U盘/光驱],其中加粗表示选中选项,其他表示可被选选项);
硬盘启动选项管理子页面建立3个启动项:硬盘1启动项、硬盘2启动项和硬盘3启动项;
U盘启动选项管理子页面建立2个启动项:U盘1启动项和U盘2启动项;
光驱启动选项管理子页面建立1个启动项:光驱1启动项;
网络启动选项管理子页面建立2个启动项:网络1启动项和网络2启动项;
对于四个启动选项管理子页面,这里仅仅说明一个硬盘启动选项管理子页面如图3所示,其他三个子页面参考硬盘启动选项管理子页面;
当用户修改类型启动项2中的为硬盘时,图2中的页面将更新如图4所示:
同样的原理四个启动选项管理子页面中的选项只要修改其中一个,其余选项也会自动的更新;这样就实现了动态修改每一个启动项,而不需要用户去逐个修改;
动态修改UEFI启动顺序的方法是通过软件模块来实施的;
1.软件模块
(1)BootOrder.sd模块
该文件主要是根据vfr语言的语法实现两个功能:一是实现平台支持启动类型选项;二是实现动态子页面的Label,要说明的是为了好控制,这里是固定的创建类型启动选项;
由于该部分是标准的vfr语言,所以分别用一个例子来说明实现;
类型选项的实现例子:
oneof varid = BOOT_OPTION.Priorities[0],
prompt = STRING_TOKEN(STR_BOOT_OPTION0),
help = STRING_TOKEN(STR_BOOT_OPTION0_HELP),
option text =STRING_TOKEN(STR_BOOT_UEFI_USB), value = 0, flags =DEFAULT;
option text =STRING_TOKEN(STR_BOOT_UEFI_HDD), value = 1, flags =0;
option text =STRING_TOKEN(STR_BOOT_UEFI_ODD), value = 2, flags =0;
option text =STRING_TOKEN(STR_BOOT_UEFI_NETWORK), value = 3, flags =0;
endoneof;
动态子页面的实现例子:
suppressif ideqvallist BOOT_GROUP.USBNum == 0;
goto UEFI_USB_BOOT_FORM_ID,
prompt = STRING_TOKEN(STR_UEFI_USB_BOOT_ORDER_SUBTITLE),
help = STRING_TOKEN(STR_UEFI_USB_BOOT_ORDER_HELP);
endif;
form formid = UEFI_USB_BOOT_FORM_ID,
title = STRING_TOKEN(STR_UEFI_USB_BOOT_ORDER_SUBTITLE);
grayoutif ideqval SYSTEM_ACCESS.Access == SYSTEM_PASSWORD_USER;
label UEFI_USB_BOOT_FORM_LABEL;
endif;
endform;
(2)BootOrde.c模块
该部分主要有一下模块组成:
①VOID
UpdateDeviceHiiString
(IN UINT16 StrToken, IN CHAR16 *DeviceName);
更新设备item中与系统语言相应的Hii字符串;参数StrToken是被更新item的字符串token被更新的设备名称;
②EFI_STATUS InitBootOrderUefiHiiString();初始化启动选项中UEFI hii字串;返回值EFI_SUCCESS,初始化成功;返回其它表示初始化失败;
③EFI_STATUS BootOrderFormCallBack( IN EFI_HII_HANDLE HiiHandle,IN UINT16KeyValue);
启动顺序页面的修改启动顺序回调函数;HiiHandle:字串所在的数据库的handle;KeyValue:修改选项的选项值;返回EFI_SUCCESS是修改成功,否则失败;
④EFI_STATUS
InitUefiGroupDefault
(VOID);
初始化启动选项子页面的设备字串,并将其放入hii数据库中。返回EFI_SUCCESS是修改成功,否则失败;
⑤VOID
UpdateOptionListPriority(LIST_ENTRY BootOptionList);
更新在POST过程检测到的所有可启动设备的启动顺序;BootOptionList:启动项列表;
⑥VOID
UpdateBootListPriority(LIST_ENTRY BootOptionList);
更新启动设备类型的启动顺序;BootOptionList:启动项列表;
2.软件流程
本发明的所有代码穿插在UEFI BDS阶段的整个过程中,这里就不再为此来说BDS的启动过程;
3.增强性功能
另外,本发明能动态显示启动设备的子页面,例如没有U盘设备接入系统时,该发明就不会创建“U盘启动选项管理子页面”;当然当新的设备接入时,该发明就会为设备在对应的子页面中创建一个启动选项,并将该选项排列在子页面启动顺序的最后。
在UEFI启动控制项修改其中一个的启动顺序时,其他启动控制项自动修改。
将启动项中的其中一个禁止后,其他设备顺序将会自动向前移动。
本发明提供的一种动态修改UEFI启动顺序的方法,UEFI启动顺序可以动态的修改,给用户更加直观的看到所有可启动设备的启动顺序,正如图1所示,用户可以先通过修改不同类型设备的启动顺序,然后再通过同一类型的设备顺序的调整,来实现最终每一个设备的启动顺序。
该发明中未涉及部分均与现有技术相同或可采用现有技术加以实现。
以上显示和描述了本发明的基本原理和主要特征和本发明的优点,对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明;因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内,不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。