CN111045739B - 基于启动程序的固件引导方法、介质及设备 - Google Patents
基于启动程序的固件引导方法、介质及设备 Download PDFInfo
- Publication number
- CN111045739B CN111045739B CN201911222621.3A CN201911222621A CN111045739B CN 111045739 B CN111045739 B CN 111045739B CN 201911222621 A CN201911222621 A CN 201911222621A CN 111045739 B CN111045739 B CN 111045739B
- Authority
- CN
- China
- Prior art keywords
- firmware
- sub
- boot
- section
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/4401—Bootstrapping
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供一种基于启动程序的固件引导方法、介质及设备,所述基于启动程序的固件引导方法包括:利用启动程序获取固件并解析,读取第一段子固件并加载至第一存储区域;所述启动程序进入所述第一段子固件的入口地址,使所述第一段子固件开始运行;所述第一段子固件运行并生成一第二段子固件的入口参数,返回所述启动程序;所述启动程序读取并加载所述第二段子固件至第二存储区域,然后进入所述第二段子固件的入口地址;所述启动程序获取所述第二段子固件的入口参数并传递给所述第二段子固件,使所述第二段子固件开始运行。所述基于启动程序的固件引导方法能够缩短系统启动时间、降低系统的复杂度。
Description
技术领域
本发明属于通信技术领域,涉及一种固件引导方法,特别是涉及一种基于启动程序的固件引导方法、介质及设备。
背景技术
BootRom区域的程序是一段固化在SoC(System on Chip,片上系统)内部的启动程序,其在SoC出厂后就不可以修改,主要用于执行系统上电后的启动逻辑。系统上电后往往需要加载多段固件,现有固件引导方法中BootRom区域的程序仅参与第一段固件的解析和加载工作,其余固件的解析和加载工作均由上一段固件完成。随着架构的发展,系统的启动过程越来越复杂,在启动过程中需要加载的固件也越来越多,现有固件引导方法中由于固件的解析和加载分别由不同的程序实现,致使系统启动时间过长,降低了用户体验。
发明内容
鉴于以上所述现有技术的缺点,本发明的目的在于提供一种基于启动程序的固件引导方法、介质及设备,用于解决现有技术中系统启动时间过长的问题。
为实现上述目的及其他相关目的,本发明提供一种基于启动程序的固件引导方法,所述基于启动程序的固件引导方法包括:利用启动程序获取固件并解析,读取第一段子固件并加载至第一存储区域;所述启动程序进入所述第一段子固件的入口地址,使所述第一段子固件开始运行;所述第一段子固件运行并生成一第二段子固件的入口参数,返回所述启动程序;所述启动程序读取并加载所述第二段子固件至第二存储区域,然后进入所述第二段子固件的入口地址;所述启动程序获取所述第二段子固件的入口参数并传递给所述第二段子固件,使所述第二段子固件开始运行。
于本发明的一实施例中,所述基于启动程序的固件引导方法还包括:若所述启动程序对固件的引导未结束,所述第二段子固件运行并生成一第三段子固件的入口参数,返回所述启动程序;所述启动程序读取并加载所述第三段子固件至第三存储区域,然后进入所述第三段子固件的入口地址;所述启动程序获取所述第三段子固件的入口参数并传递给所述第三段子固件,使所述第三段子固件开始运行。
于本发明的一实施例中,所述第一段子固件为DRAM初始化子固件;所述第二段固件为 ATF子固件;所述第三段固件为Kernel子固件。
于本发明的一实施例中,所述启动程序进入所述第一段子固件的入口地址的实现方法包括:所述启动程序对所述第一段子固件进行校验;若所述第一段子固件检验合格,则所述启动程序进入所述第一段子固件的入口地址;若不合格则结束所述启动程序对固件的引导。
于本发明的一实施例中,所述启动程序进入所述第二段子固件的入口地址的实现方法包括:所述启动程序对所述第二段子固件进行校验;若所述第二段子固件检验合格,所述启动程序进入所述第二段子固件的入口地址;若不合格则结束所述启动程序对固件的引导。
于本发明的一实施例中,所述基于启动程序的固件引导方法还包括:所述第二段子固件的入口参数存储于一组寄存器中,所述启动程序将所述寄存器中的入口参数存放到一组中间存储单元中;所述第二段子固件开始运行前,所述启动程序从所述中间存储单元读取所述入口参数并放入所述寄存器中以便所述第二段子固件从所述寄存器中读取所述入口参数后开始运行。
于本发明的一实施例中,利用启动程序获取固件并解析的实现方法包括:利用所述启动程序扫描存储设备并读取特定的数据块;当所述启动程序读取的数据块中包含固件时,解析所述数据块的头信息数据。
于本发明的一实施例中,所述启动程序为BootRom。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被调用时执行本发明所述的基于启动程序的固件引导方法。
本发明还提供一种电子设备,所述电子设备包括:存储器,存储有一计算机程序;处理器,与所述存储器通信相连,调用所述计算机程序时执行本发明所述基于启动程序的固件引导方法。
如上所述,本发明所述的基于启动程序的固件引导方法、介质及设备,具有以下有益效果:
所述基于启动程序的固件引导方法中,不同子固件的引导均可以通过同一启动程序来实现,不同子固件加载过程中用到的解析引导逻辑、存储接口读操作等程序可以在所述同一启动程序处复用,降低了系统复杂度;
所述基于启动程序的固件引导方法中,不同子固件的引导均可以通过同一启动程序来实现,不同子固件加载过程中用到的相同信息的解析和/或对相同外设的初始化等操作在所述同一启动程序中可以仅执行一次,缩短了系统启动时间;
现有固件引导方法中往往包含一个或者多个仅用于解析和引导固件的模块如U-Boot (Universal Boot Loader,通用引导加载程序);本发明所述基于启动程序的固件引导方法中所有的解析和引导工作均可以通过同一启动程序完成,与现有技术相比能够减少一个或者多个解析和引导阶段,降低了整个系统的复杂度;
此外,所述基于启动程序的固件引导方法中所有的解析和引导工作均可以通过同一启动程序完成,所述启动程序外的固件仅需保留必要的程序,DDR初始化、ATF(ARMTrusted Firmware)初始化等模块内部无需维护相关的固件解析和存储器驱动,降低了整个系统的维护难度;
所述基于启动程序的固件引导方法中所有的解析和引导工作均可以通过同一启动程序完成,无需对外部固件进行修改即可实现,易于实现固件的扩展。
附图说明
图1A显示为本发明所述基于启动程序的固件引导方法于一实施例中的流程图。
图1B显示为本发明所述基于启动程序的固件引导方法于一实施例中的流程图。
图1C显示为本发明所述基于启动程序的固件引导方法于一实施例中的流程图。
图2显示为本发明所述基于启动程序的固件引导方法中步骤S2的流程图。
图3A显示为本发明所述基于启动程序的固件引导方法于一实施例中的流程图。
图3B显示为本发明所述基于启动程序的固件引导方法于一实施例中的流程图。
元件标号说明
S11a~S13a 步骤
S21a~S26a 步骤
S11b~S15b 步骤
S111b~S114b 步骤
S141b~S142b 步骤
S21b~S22b 步骤
S221b~S224b 步骤
S11c~S15c 步骤
S21c~S29c 步骤
S221c~S225c 步骤
S21~S222 步骤
S311a~S321a 步骤
S311b~S324b 步骤
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
BootRom(启动ROM)区域的程序是一段固化在SoC(System on Chip,片上系统)内部的启动程序,其在SoC出厂后就不可以修改,主要用于执行系统上电后的启动逻辑。系统上电后往往需要加载多段固件,固件引导方法中BootRom区域的程序仅参与第一段固件的解析和加载工作,其余固件的解析和加载工作均由上一段固件完成。请参阅图1A,于一实施例中,所述固件引导方法包括:
S11a,获取固件;
S12a,读取所述固件中的第一段子固件并加载;
S13a,跳转到所述第一段子固件的入口地址;
S21a,运行所述第一段子固件并生成第M段子固件的入口参数;于本步骤中M=2;
S22a,读取并加载第M段子固件;所述第M段子固件的读取和加载由第M-1段子固件完成;
S23a,跳转到第M段子固件的入口地址;
S24a,运行所述第M段子固件;
S25a,判断对固件的引导是否结束;若对固件的引导尚未结束,执行步骤S26a;否则结束对固件的引导;
S26a,为第M+1段子固件准备入口参数,该入口参数由第M段子固件运行时生成;其后,将M+1的值赋给M并执行步骤S22a。
于上述固件引导方法中,位于BootRom区域的程序仅执行步骤S11a~S13a;步骤S21a~步骤S26a由BootRom区域外的固件执行。步骤S23a~S22a为一循环结构,每次循环包括当前子固件的执行、为下一段子固件准备入口参数、对下一段子固件的读取和加载等操作。在每个循环中需要用到解析引导逻辑、存储接口读操作等程序,每段子固件都需要维护一份对应的代码;此外,每个循环中还会涉及到相同信息的解析以及对同一外设例如EMMC的初始化等操作,由于不同子固件位于不同的存储位置,因此每段子固件都需要执行上述操作。
于本实施例中,除第一段子固件外,其余每段子固件的读取、加载等内容均由上一段子固件实现,如果想要添加新的子固件(即实现子固件的扩展),需要对该新增子固件的上一段子固件进行修改,而对子固件的修改往往难以实现,因此本实施例所述固件引导方法中很难实现子固件的扩展。
于本实施例中,对于步骤S23a~S22a组成的循环,每个循环的执行主体都不相同。例如,假设需要引导的子固件大于4段:当M=2时,运行第2段子固件,并由所述第2段子固件为第3段子固件准备入口参数、读取并加载第3段子固件,相应的,第2段子固件中应当维护解析引导逻辑、存储接口读操作等程序对应的代码,且第2段子固件应当完成对数据的解析以及对外设的初始化;当M=3时,运行第3段子固件,并由所述第3段子固件为第4段子固件准备入口参数、读取并加载第4段子固件,相应的,第3段子固件中应当维护解析引导逻辑、存储接口读操作等程序对应的代码,且第3段子固件应当完成对数据的解析以及对外设的初始化。其中,第2段子固件和第3段子固件维护的解析引导逻辑、存储接口读操作等程序对应的代码是相同的,且第2段子固件和第3段子固件对解析的数据以及对外设的初始化等操作也存在相同部分。然而,第2段子固件和第3段子固件分别位于不同的存储区域,二者之间维护的程序代码即便相同也无法复用,从而导致系统复杂度增加;同样,所述第2段子固件和所述第3段子固件解析的数据以及外设的初始化等操作即便相同也无法复用,从而导致系统启动时间增加。因此,本实施例中所述固件引导方法复杂度较高,启动时间较长。在启动过程中要加载的子固件越多,该问题越严重。针对这一问题,本发明提供一种基于启动程序的固件引导方法,所述基于启动程序的固件引导方法包括:利用启动程序获取固件并解析,读取第一段子固件并加载至第一存储区域;所述启动程序进入所述第一段子固件的入口地址,使所述第一段子固件开始运行;所述第一段子固件运行时生成一第二段子固件的入口参数,返回所述启动程序;所述启动程序读取并加载所述第二段子固件至第二存储区域,然后进入所述第二段子固件的入口地址;所述启动程序获取所述第二段子固件的入口参数并传递给所述第二段子固件,使所述第二段子固件开始运行。本发明所述基于启动程序的固件引导方法将固件解析和固件加载由同一启动程序完成,能够实现不同子固件对相同程序代码等内容的复用,降低了系统复杂度。
请参阅图1B,于本发明的一实施例中,所述基于启动程序的固件引导方法包括:
S11b,利用启动程序获取固件并解析,读取第一段子固件并加载至第一存储区域;
S12b,所述启动程序进入所述第一段子固件的入口地址,使所述第一段子固件开始运行;所述第一段子固件运行并生成一第二段子固件的入口参数,返回所述启动程序;
S13b,所述启动程序读取并加载所述第二段子固件至第二存储区域;
S14b,进入所述第二段子固件的入口地址;
S15b,所述启动程序获取所述第二段子固件的入口参数并传递给所述第二段子固件,使所述第二段子固件开始运行。
于本实施例中,步骤S11b~S15b由所述启动程序实现。优选地,所述第一存储区域和所述第二存储区域位于SRAM(Static Random-Access Memory,静态随机存取存储器)中。所述启动程序之外的程序仅执行:
S21b,运行所述第一段子固件并生成第二段子固件的入口参数。
于本实施例中,所述启动程序之外的程序可以是被加载到SRAM中的子固件程序。所述第一段子固件和所述第二段子固件的解析、读取和加载等操作均由所述启动程序实现。对于所述第一段子固件和所述第二段子固件维护的程序代码,例如解析引导逻辑和/或存储接口读操作等程序对应的代码,均由所述启动程序维护;对于所述第一端子固件和所述第二段子固件执行的部分操作,例如信息解析和/或外设初始化,均由所述启动程序实现。因此,本实施例中对于所述第一段子固件和所述第二段子固件维护的相同的代码所述启动程序可以只维护一份,降低了系统复杂度;对于所述第一段子固件和所述第二端子固件执行的相同操作所述启动程序可以只执行一次,缩短了系统启动时间。
请参阅图1B,于本发明的一实施例中,所述基于启动程序的固件引导方法还包括:
S22b,若所述启动程序对固件的引导未结束,所述第二段子固件运行并生成一第三段子固件的入口参数,返回所述启动程序;
S13b,所述启动程序读取并加载所述第三段子固件至第三存储区域;
S14b,进入所述第三段子固件的入口地址;
S15b,所述启动程序获取所述第三段子固件的入口参数并传递给所述第三段子固件,使所述第三段子固件开始运行。
于本实施例中,所述启动程序之外的程序执行的操作包括:
S22b,运行所述第二端子固件并生成所述第三段子固件的入口参数。具体的,运行所述第二端子固件并生成所述第三段子固件的入口参数的实现方法包括:
S221b,执行所述第二段子固件;
S222b,执行所述第二段子固件运行阶段所有的相关固件;
S223b,判断所述启动程序对子固件的引导是否结束,若仍需要所述启动程序对子固件进行引导,执行步骤S224b;
S225b,为第三段子固件准备入口参数,即生成所述第三段子固件的入口参数。
请参阅图1B,于本发明的一实施例中,所述基于启动程序的固件引导方法包括:
S11b,利用启动程序获取固件并解析,读取第一段子固件并加载至第一存储区域;
S12b,所述启动程序进入所述第一段子固件的入口地址,使所述第一段子固件开始运行;所述第一段子固件运行结束后生成一第M段子固件的入口参数,返回所述启动程序;于本步骤中M=2;
S13b,所述启动程序读取并加载所述第M段子固件至第M存储区域;
S14b,进入所述第M段子固件的入口地址;
S15b,所述启动程序获取所述第M段子固件的入口参数并传递给所述第M段子固件,使所述第M段子固件开始运行;所述第M段子固件运行结束后生成一第M+1段子固件的入口参数,并令M=M+1,返回所述启动程序;
S16b,重复步骤S13b~S16b,直到所述启动程序对子固件的引导结束。
于本实施例中,所述子固件的解析、加载等操作均由所述启动程序实现,故所述子固件的数量可以任意扩展。例如,若M=3时所述启动程序引导结束,则所述启动引导过程中包含 3段子固件;若M=4时所述启动程序引导结束,则所述启动引导过程中包含4段子固件。
于本实施例中,所述启动程序之外的程序执行的操作包括:
S221b,运行第M段子固件;
S222b,运行本阶段所有固件;
S223b,判断所述启动程序引导是否结束;若所述启动程序引导未结束,执行步骤S224b;
S224b,为第M+1段子固件准备入口参数。
于本实施例中,所述启动程序执行第一段子固件的解析、读取和加载,以及第一段子固件之外其余固件的读取和记载、入口参数的获取和传递。所述启动程序之外的程序执行的操作包括:子固件的执行并为下一段子固件准备入口参数。因此,于本实施例中,所述启动程序之外的程序无需执行解析和引导等操作。与现有引导方法相比,无需U-boot等只起引导和解析作用的模块,因此本实施例所述基于启动程序的固件引导方法降低了系统复杂度并缩短了引导时间,且子固件结构和功能更简单,易于实现和维护。
请参阅图1C,于本发明的一实施例中,引导系统启动的实现方法包括:
S11c,利用启动程序获取固件并解析,读取第一段子固件并加载至第一存储区域;
S12c,所述启动程序进入所述第一段子固件的入口地址,使所述第一段子固件开始运行;
S21c,所述第一段子固件对应的程序运行所述第一段子固件并生成第M段子固件的入口参数;于本步骤中M=2;
S13c,所述启动程序读取并加载所述第M段子固件至第M存储区域;
S14c,所述启动程序进入所述第M段子固件的入口地址;
S15c,所述启动程序获取所述第M段子固件的入口参数并传递给所述第M段子固件,使所述第M段子固件开始运行;
S22c,所述第M段子固件对应的程序运行所述第M段子固件并生成第M+1段子固件的入口参数;具体地,步骤S22c的实现方法包括:
S221c,所述第M段子固件对应的程序运行所述第M段子固件;
S222c,运行本阶段所有固件;
S223c,判断固件引导是否结束;若固件引导尚未结束,执行步骤S224c;
S224c,判断是否需要启动程序引导下一段子固件;若需要,执行步骤S225c;若不需要所述启动程序引导下一段子固件,执行步骤S23c;
S225c,为第M+1段子固件准备入口参数,所述第M+1段子固件的入口参数由第M段子固件生成;将M+1的值赋给M;执行步骤S13c;
S23c,为第M+1段子固件准备入口参数,所述第M+1段子固件的入口参数由第M段子固件生成;将M+1的值赋给M;
S24c,第M-1段子固件读取并加载第M段子固件;
S25c,跳转到第M段子固件的入口地址;
S26c,所述第M段子固件对应的程序运行所述第M段子固件;
S27c,判断固件引导是否结束;若固件引导未结束,执行步骤S28c;
S28c,判断是否需要启动程序引导下一段子固件;若需要,执行步骤S225c;若不需要所述启动程序引导下一段子固件,执行步骤S29c;
S29c,为第M+1段子固件准备入口参数,所述第M+1段子固件的入口参数由第M段子固件生成;将M+1的值赋给M;执行步骤S24c。
于本实施例中,所述启动程序负责部分子固件的解析、读取和加载等工作;所述启动程序之外的程序负责部分子固件的执行、下一段子固件入口参数的生成、下一段子固件的读取、下一段子固件的解析和/或下一段子固件的加载等工作。
于本发明的一实施例中,所述第一段子固件为DRAM(Dynamic Random AccessMemory,动态随机存取存储器)初始化子固件;所述第二段固件为ATF子固件;所述第三段固件为 Kernel子固件。其中,DRAM为随机存取存储器,其包括同步动态随机存取存储器(SDRAM), SDRAM又可以分为SDR、DDR、DDR2以及DDR3。
于本发明的一实施例中,所述启动程序进入所述第一段子固件的入口地址的实现方法包括:所述启动程序对所述第一段子固件进行校验;若所述第一段子固件检验合格,则所述启动程序进入所述第一段子固件的入口地址;若不合格则结束所述启动程序对固件的引导。所述校验包括对所述第一子固件完整性和/或安全性的校验,校验方法可以利用现有技术中对固件的校验方法来实现,此处不再赘述。
于本发明的一实施例中,所述启动程序进入所述第二段子固件的入口地址的实现方法包括:所述启动程序对所述第二段子固件进行校验;若所述第二段子固件校验合格,所述启动程序进入所述第二段子固件的入口地址;若不合格则结束所述启动程序对所述固件的引导。所述校验包括对所述第二子固件完整性和/或安全性的校验,校验方法可以利用现有技术中对固件的校验方法来实现,此处不再赘述。
请参阅图2,于本发明的一实施例中,所述基于启动程序的固件引导方法还包括:
S21,所述第二段子固件的入口参数存储于一组寄存器中,所述启动程序将所述寄存器中的入口参数存放到一中间存储单元中;
S22,所述第二段子固件开始运行前,所述启动程序从所述中间存储单元读取所述入口参数并放入所述寄存器中以便所述第二段子固件从所述寄存器中读取所述入口参数后开始运行。
通过上述步骤S21-S22,某一段子固件将其生成的下一段子固件的入口参数存放到特定的寄存器中,所述下一段子固件运行前可以直接从所述特定的寄存器读取相应的入口参数,从而实现为所述下一段子固件准备入口参数。
于本发明的一实施例中,所述寄存器为ARM(Advanced RISC Machines)中的寄存器r0、寄存器r1、寄存器r2、和/或寄存器r3。根据ARM中的函数调用规则,r0~r3寄存器在函数调用跳转时可以作为参数直接引用,于本实施例中,所述子固件可以将r0~r3寄存器中的值作为入口参数引用。然而,在程序使用过程中r0~r3中的内容不会被保护,即程序可能在r0~r3 寄存器中存入新的数据从而将其中保存的原有参数覆盖,导致参数丢失。此时如果所述子固件直接引用r0~r3寄存器中的值将不能得到正确的入口参数。针对这一问题,本实施例提供一种跨程序段的参数保护和传递机制,该机制的具体实现过程包括:
所述子固件运行时生成下一段子固件的入口参数并放入r0~r3寄存器中;
所述启动程序将所述下一段子固件的入口参数放入一中间存储单元中;
所述下一段子固件运行前,所述启动程序从所述中间存储单元读取所述入口参数并放入所述r0~r3寄存器中;
所述下一段子固件运行前直接读取所述r0~r3寄存器中的数值作为入口参数。
其中,将所述入口参数放入一中间存储单元和从所述中间存储单元读取所述入口参数的操作可以通过常用的入栈和出栈操作来实现,操作简单易于实现。通过上述跨程序段的参数保护和传递机制能够保证所述子固件能够获得正确的入口参数,确保引导程序的正常运行。
于本发明的一实施例中,利用启动程序获取固件并解析的实现方法包括:利用所述启动程序扫描存储设备并读取特定的数据块;当所述启动程序读取的数据块中包含固件时,解析所述数据块的头信息数据。具体地,请参阅图1B,上述步骤的具体实现过程包括:
S111b,扫描存储设备,读取特定的数据块;
S112b,判断所述数据块中是否包含有效固件;若所述数据块不包含有效固件,跳转到步骤S111b;否则,执行步骤S113b;
S113b,解析固件的头信息数据。
于本发明的一实施例中,所述启动程序为BootRom;具体地,所述启动程序是固化在SoC 内部的启动程序。
于本发明的一实施例中,所述启动程序为BootRom;所述第一段子固件为DRAM初始化子固件,所述第二段固件为ATF子固件,所述第三段固件为Kernel子固件。请参阅图3A,显示为现有技术中系统上电后的启动流程,具体包括:
S311a,扫描存储设备,读取特定的数据块;
S312a,解析头部信息,读取DRAM初始化子固件并加载到SRAM中,跳转至DRAM 初始化子固件的程序入口;
S313a,根据所述DRAM初始化子固件对DRAM进行初始化,并根据已有信息准备ATF的入口参数;
S314a,加载ATF的BL31、BL32及BL33程序,并跳转到BL31的入口;
S315a,BL31完成自身初始化并跳转到BL32(Trust OS)入口;
S316a,BL32完成自身初始化并跳转到BL31;
S317a,BL31跳转到BL33(U-Boot),执行BL33并生成kernel等应用型引导程序的入口参数;
S318a,加载kernel dtb;
S319a,加载ramdisk(虚拟内存盘);
S320a,加载kernel Image并跳转进入;
S321a,运行kernel及后续系统。
在步骤S311a~S321a中,步骤S311a和步骤S312a由BootRom区域的程序完成,步骤S313a~步骤S321a由其他存储区域的程序完成。在上述启动引导过程中,BootRom区域的程序仅执行DRAM初始化子固件的解析以及加载工作;DRAM初始化子固件除实现自身运行外,还需完成ATF子固件的解析、加载以及入口参数准备等工作;ATF子固件除实现自身运行外,还需完成Kernel子固件的解析、加载以及入口参数准备等工作。此外,所述DRAM初始化子固件、所述ATF子固件和所述Kernel子固件分别在不同的存储区域运行,三个子固件之间不能实现程序代码以及相关操作的复用。
于本发明的一实施例中,所述启动程序为BootRom;所述第一段子固件为DRAM初始化子固件,所述第二段固件为ATF子固件,所述第三段固件为Kernel子固件;本实施例采用ARM寄存器r0~r3实现跨程序段的参数保护和传递机制。请参阅图3B,显示为本实施例中系统采用所述基于启动程序的固件引导方法后的启动流程,具体包括:
S311b,扫描存储设备,读取特定的数据块;
S312b,解析头部信息,读取DRAM初始化子固件;
S313b,根据所述DRAM初始化子固件程序初始化DRAM,并根据已有信息准备ATF 的入口参数并放入寄存器中;所述寄存器为r0~r3寄存器中的一个或多个;
S314b,返回BootRom;
S315b,保存寄存器中的入口参数;所述寄存器为步骤S313b中用于存放入口参数的寄存器;于本步骤中,可以通过所述跨程序段的参数保护和传递机制实现入口参数的保存,具体实现方法包括:在入口参数放入所述寄存器后将寄存器中的数据转存至一中间存储单元中,其中所述中间存储单元在程序运行时内容不被修改,从而避免程序运行时改变寄存器中的数据导致的入口参数丢失。上述保存过程在DRAM初始化子固件对应的程序段完成。
S316b,加载ATF BL32;
S317b,加载ATF BL31并跳转进入BL31,入口参数为已保存在寄存器中的入口参数。于本步骤中,通过所述跨程序段的参数保护和传递机制实现入口参数的传递和读取,具体实现方法包括:将步骤S315b中所述中间存储单元保存的入口参数重新放入所述寄存器中;在需要所述入口参数时直接从所述寄存器中读取所述入口参数,从而完成入口参数的跨程序段传递。上述传递和读取过程在ATF子固件对应的程序段完成,故通过所述跨程序段的参数保护和传递机制能够实现参数的跨程序段传递。
S318b,运行BL31和BL32的程序,并根据已有信息准备Kernel子固件的入口参数并放入寄存器中;所述寄存器为r0~r3寄存器中的一个或多个;
S319b,返回BootRom;
S320b,保存r0~r3中的入口参数;保存方法与步骤S315b类似;
S321b,加载kernel dtb;
S322b,加载ramdisk;
S323b,加载kernel Image并跳转进入,入口参数为已保存在寄存器中的入口参数;
S324b,运行kernel及后续系统。
于本实施例中,所述头部信息的一种实现方式为:
struct image_info{
unsigned int img_offset;
unsigned int img_size;
unsigned int img_load_addr;
unsigned int img_entry;
};
struct boot_header{
unsigned int magic;
unsigned int header_size;
unsigned int head_version;
unsigned int image_number;
struct image_info img_info[N]
};
于本实施例中,BootRom区域的程序执行步骤S311b~步骤S312b、步骤S315b~步骤 S317b、步骤S320b~步骤S323b。BootRom区域外的程序仅执行步骤S313b~步骤S314b、步骤S318b~步骤S319b以及步骤S324b。由此可知,于本实施例中,BootRom区域外的程序仅负责相关子固件的执行,并将下一段子固件放入指定寄存器即可。所有子固件的解析、加载以及入口参数传递等工作均由BootRom区域的程序完成,故:不同子固件之间如果用到同一段程序,则BootRom只需要维护一份程序代码,降低了系统复杂度;不同子固件之间如果用到相同操作,例如外设初始化,BootRom也可以只执行一次该操作,缩短了系统启动时间。
此外,在固件启动过程中,下一阶段子固件的参数是由调用者准备并传递的,由于BootRom的内容在SoC出厂之后即不能修改,故在BootRom中不能实现不确定的入口参数的传递,因此现有启动引导方法中在完成第一段子固件的加载后即离开BootRom,此后不再返回BootRom。针对这一问题,本发明中采用了跨程序段的参数保护和传递机制,通过将参数保存至中间存储单元,需要时从所述中间存储单元读取入口参数,从而避免了在BootRom中传递不确定的入口参数这一问题。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序;所述计算机程序被调用时执行本发明所述的基于启动程序的固件引导方法。
本发明还提供一种电子设备,所述店主设备包括:存储器,存储有一计算机程序;处理器,与所述存储器通信相连,调用所述计算机程序时执行本发明所述基于启动程序的固件引导方法。
本发明所述的基于启动程序的固件引导方法的保护范围不限于本实施例列举的步骤执行顺序,凡是根据本发明的原理所做的现有技术的步骤增减、步骤替换所实现的方案都包括在本发明的保护范围内。
所述基于启动程序的固件引导方法中,不同子固件的引导均可以通过同一启动程序来实现,不同子固件加载过程中用到的解析引导逻辑、存储接口读操作等程序可以在所述同一启动程序处复用,降低了系统复杂度;
所述基于启动程序的固件引导方法中,不同子固件的引导均可以通过同一启动程序来实现,不同子固件加载过程中用到的相同信息的解析和/或对相同外设的初始化等操作在所述同一启动程序中仅执行一次,缩短了系统启动时间;
此外,所述基于启动程序的固件引导方法中所有的解析和引导工作均可以通过同一启动程序完成,所述启动程序外的固件仅需保留必要的程序,如DDR初始化、ATF初始化等模块内部无需维护相关的固件解析和存储器驱动,降低了整个系统的维护难度;
所述基于启动程序的固件引导方法不依赖于此类系统通常需要的U-Boot模块,与现有技术相比,所述基于启动程序的固件引导方法不但直接优化掉一个阶段,在整个系统进入 kernel之前的引导过程中,所有的固件解析和固件读操作都在Bootrom程序内完成,Bootrom 以外仅保留必须的程序,如DDR初始化,ATF相关初始化,这些模块内都不需要维护任何固件解析和存储器驱动,降低了整个系统的维护难度,同时还能实现固件任意形式的扩展;
所述基于启动程序的固件引导方法可以支持引导多阶段多固件组合的复杂系统;该方法中不可修改的BootRom包含两个相邻固件程序段的入口参数保护和传递机制,使后一个固件程序段可以使用上一个固件程序段传递的入口参数;该方法的引导过程中,进入Kernel之前的所有独立固件程序段可以不包含任何固件解析程序或存储驱动程序。
综上所述,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
Claims (8)
1.一种基于启动程序的固件引导方法,其特征在于,所述基于启动程序的固件引导方法包括:
利用启动程序获取固件并解析,读取第一段子固件并加载至第一存储区域,所述启动程序为BootRom,所述第一段子固件为DRAM初始化子固件;
所述启动程序进入所述第一段子固件的入口地址,使所述第一段子固件开始运行;所述第一段子固件运行并生成一第二段子固件的入口参数,返回所述启动程序,所述第二段子固件为ATF子固件;
所述启动程序读取并加载所述第二段子固件至第二存储区域,然后进入所述第二段子固件的入口地址;
所述启动程序获取所述第二段子固件的入口参数并传递给所述第二段子固件,使所述第二段子固件开始运行。
2.根据权利要求1所述基于启动程序的固件引导方法,其特征在于,所述基于启动程序的固件引导方法还包括:
若所述启动程序对固件的引导未结束,所述第二段子固件运行并生成一第三段子固件的入口参数,返回所述启动程序,所述第三段子固件为Kernel子固件;
所述启动程序读取并加载所述第三段子固件至第三存储区域,然后进入所述第三段子固件的入口地址;
所述启动程序获取所述第三段子固件的入口参数并传递给所述第三段子固件,使所述第三段子固件开始运行。
3.根据权利要求1所述基于启动程序的固件引导方法,其特征在于,所述启动程序进入所述第一段子固件的入口地址的实现方法包括:
所述启动程序对所述第一段子固件进行校验;若所述第一段子固件校验合格,则所述启动程序进入所述第一段子固件的入口地址;若不合格则结束所述启动程序对固件的引导。
4.根据权利要求1所述基于启动程序的固件引导方法,其特征在于,所述启动程序进入所述第二段子固件的入口地址的实现方法包括:
所述启动程序对所述第二段子固件进行校验;若所述第二段子固件校验合格,所述启动程序进入所述第二段子固件的入口地址;若不合格则结束所述启动程序对固件的引导。
5.根据权利要求1所述基于启动程序的固件引导方法,其特征在于,所述基于启动程序的固件引导方法还包括:
所述第二段子固件的入口参数存储于一组寄存器中,所述启动程序将所述寄存器中的入口参数存放到一中间存储单元中;
所述第二段子固件开始运行前,所述启动程序从所述中间存储单元读取所述入口参数并放入所述寄存器中以便所述第二段子固件从所述寄存器中读取所述入口参数后开始运行。
6.根据权利要求1所述基于启动程序的固件引导方法,其特征在于,利用启动程序获取固件并解析的实现方法包括:
利用所述启动程序扫描存储设备并读取特定的数据块;
当所述启动程序读取的数据块中包含固件时,解析所述数据块的头信息数据。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于:
所述计算机程序被调用时执行权利要求1-6任一项所述基于启动程序的固件引导方法。
8.一种电子设备,其特征在于,所述电子设备包括:
存储器,存储有一计算机程序;
处理器,与所述存储器通信相连,调用所述计算机程序时执行权利要求1-6任一项所述基于启动程序的固件引导方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911222621.3A CN111045739B (zh) | 2019-12-03 | 2019-12-03 | 基于启动程序的固件引导方法、介质及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911222621.3A CN111045739B (zh) | 2019-12-03 | 2019-12-03 | 基于启动程序的固件引导方法、介质及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111045739A CN111045739A (zh) | 2020-04-21 |
CN111045739B true CN111045739B (zh) | 2022-06-07 |
Family
ID=70234431
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911222621.3A Active CN111045739B (zh) | 2019-12-03 | 2019-12-03 | 基于启动程序的固件引导方法、介质及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111045739B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112256338B (zh) * | 2020-10-27 | 2023-12-05 | 记忆科技(深圳)有限公司 | Soc启动方法、装置、计算机设备及存储介质 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008058469A1 (fr) * | 2006-11-17 | 2008-05-22 | Maipu (Sichuan) Communication Technology Co., Ltd. | Procédé pour démarrer un dispositif embarqué |
CN103279399A (zh) * | 2013-06-27 | 2013-09-04 | 北京汉邦高科数字技术股份有限公司 | 一种嵌入式CPU在NAND Flash上启动的方法 |
CN104603792A (zh) * | 2012-08-29 | 2015-05-06 | 微软公司 | 安全固件更新 |
CN106909346A (zh) * | 2015-12-22 | 2017-06-30 | 中电科技(北京)有限公司 | 一种基于一体计算机的uefi固件实现方法 |
CN107015807A (zh) * | 2017-04-06 | 2017-08-04 | 青岛海信宽带多媒体技术有限公司 | 一种设备驱动管理方法 |
US9910676B1 (en) * | 2015-09-22 | 2018-03-06 | Microsemi Solutions (U.S.), Inc. | Hardware based XIP exit sequence to enable XIP mode operation on SPI boot interface |
CN107967193A (zh) * | 2017-12-25 | 2018-04-27 | 北京四达时代软件技术股份有限公司 | Boot启动方法和嵌入式设备 |
CN108279935A (zh) * | 2016-12-30 | 2018-07-13 | 北京中科晶上科技股份有限公司 | 一种针对片上系统的操作系统启动引导方法 |
CN109614265A (zh) * | 2018-11-05 | 2019-04-12 | 北京原子机器人科技有限公司 | 智能惯导传感系统的双备份系统及其配置启动方法 |
CN110347444A (zh) * | 2019-07-12 | 2019-10-18 | 深圳忆联信息系统有限公司 | 一种ssd多状态切换的启动方法及其系统 |
-
2019
- 2019-12-03 CN CN201911222621.3A patent/CN111045739B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008058469A1 (fr) * | 2006-11-17 | 2008-05-22 | Maipu (Sichuan) Communication Technology Co., Ltd. | Procédé pour démarrer un dispositif embarqué |
CN104603792A (zh) * | 2012-08-29 | 2015-05-06 | 微软公司 | 安全固件更新 |
CN103279399A (zh) * | 2013-06-27 | 2013-09-04 | 北京汉邦高科数字技术股份有限公司 | 一种嵌入式CPU在NAND Flash上启动的方法 |
US9910676B1 (en) * | 2015-09-22 | 2018-03-06 | Microsemi Solutions (U.S.), Inc. | Hardware based XIP exit sequence to enable XIP mode operation on SPI boot interface |
CN106909346A (zh) * | 2015-12-22 | 2017-06-30 | 中电科技(北京)有限公司 | 一种基于一体计算机的uefi固件实现方法 |
CN108279935A (zh) * | 2016-12-30 | 2018-07-13 | 北京中科晶上科技股份有限公司 | 一种针对片上系统的操作系统启动引导方法 |
CN107015807A (zh) * | 2017-04-06 | 2017-08-04 | 青岛海信宽带多媒体技术有限公司 | 一种设备驱动管理方法 |
CN107967193A (zh) * | 2017-12-25 | 2018-04-27 | 北京四达时代软件技术股份有限公司 | Boot启动方法和嵌入式设备 |
CN109614265A (zh) * | 2018-11-05 | 2019-04-12 | 北京原子机器人科技有限公司 | 智能惯导传感系统的双备份系统及其配置启动方法 |
CN110347444A (zh) * | 2019-07-12 | 2019-10-18 | 深圳忆联信息系统有限公司 | 一种ssd多状态切换的启动方法及其系统 |
Non-Patent Citations (1)
Title |
---|
"bootrom启动流程";天涯明月情;《https://blog.csdn.net/blueoceanindream/article/details/6851787》;20111008;第58卷;第1-4页 * |
Also Published As
Publication number | Publication date |
---|---|
CN111045739A (zh) | 2020-04-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10613773B2 (en) | Backing up firmware during initialization of device | |
US7340566B2 (en) | System and method for initializing a memory device from block oriented NAND flash | |
US10311236B2 (en) | Secure system memory training | |
CN111857776A (zh) | Dsp板卡类的应用程序的在线升级方法 | |
CN111045739B (zh) | 基于启动程序的固件引导方法、介质及设备 | |
US6374338B1 (en) | Method for performing configuration tasks prior to and including memory configuration within a processor-based system | |
CN114911529A (zh) | 开机方法及电子设备、可读存储介质、计算机程序产品 | |
US10866922B1 (en) | Firmware debug trace capture using serial peripheral interface | |
CN116225541B (zh) | 一种带内cpu与带外管理bmc通信的方法及通信系统 | |
CN114721735B (zh) | 一种程序动态加载方法、装置及电子设备 | |
CN111399926A (zh) | 下载启动程序的方法和装置 | |
CN110045966A (zh) | 安装器的处理方法、装置及设备 | |
CN113867816B (zh) | 刷机启动方法、装置、设备和存储介质 | |
CN111158863B (zh) | 中断控制器的处理方法、装置及电子设备 | |
CN113672260A (zh) | 一种处理器cpu初始化方法 | |
CN112463244A (zh) | 一种cpu启动方法、装置、电子设备及计算机可读存储介质 | |
CN112214213A (zh) | Linux内核的开发和管理方法、装置、计算机设备和存储介质 | |
CN116610368B (zh) | 一种可配置的芯片启动引导方法、系统及介质 | |
CN102012823A (zh) | 一种快速重新启动计算机的方法和装置 | |
CN115374051A (zh) | SoC片上SRAM复用方法、电子设备及SoC芯片 | |
CN110119624A (zh) | 一种安全度量方法 | |
KR101395007B1 (ko) | 복수의 프로세서를 이용한 스냅샷 이미지 처리 장치 및 방법 | |
CN115145642B (zh) | 一种软件启动方法和系统 | |
CN118349498A (zh) | 一种用于lpddr物理层的控制系统及方法 | |
CN117194209A (zh) | 嵌入式软件的调试方法以及调试装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder |
Address after: 350003 building 18, No.89, software Avenue, Gulou District, Fuzhou City, Fujian Province Patentee after: Ruixin Microelectronics Co.,Ltd. Address before: 350003 building 18, No.89, software Avenue, Gulou District, Fuzhou City, Fujian Province Patentee before: FUZHOU ROCKCHIP ELECTRONICS Co.,Ltd. |
|
CP01 | Change in the name or title of a patent holder |