掌桥专利:专业的专利平台
掌桥专利
首页

引导加载程序固件的重定位方法、装置、设备及介质

文献发布时间:2023-06-19 19:30:30


引导加载程序固件的重定位方法、装置、设备及介质

技术领域

本申请涉及计算机技术领域,尤其涉及一种引导加载程序固件的重定位方法、装置、设备及介质。

背景技术

引导加载程序(Universal Boot Loader,U-Boot)用于引导嵌入式操作系统的启动,包括加载启动参数、加载设备树、启动操作系统内核、挂载根文件系统等,从而使得嵌入式操作系统能够正常启动与运行。

目前,在嵌入式操作系统上电或复位后,U-Boot程序把自身的程序从存储介质拷贝到片外同步动态随机存取内存(synchronous dynamic random-access memory,SDRAM),然后跳转到SDRAM执行该U-Boot程序,从而引导嵌入式操作系统。

在SDRAM中执行该U-Boot程序时,需要对该U-Boot程序进行代码重定位,才能够正常执行。然而,如何完成U-Boot程序的代码重定位,以引导嵌入式操作系统,是必需解决的技术问题。

发明内容

本申请提供一种引导加载程序固件的重定位方法、装置、设备及介质,用以解决如何完成U-Boot程序的代码重定位,以引导嵌入式操作系统的问题。

第一方面,本申请提供一种引导加载程序U-Boot固件的重定位方法,包括:

第二电子设备对初始U-Boot固件进行预处理,得到处理后的目标U-Boot固件;所述初始U-Boot固件包括:重定位元组数据、立即数重定位栈,以及,预留的重定位数据段;所述重定位元组数据用于表示待进行代码重定位的数据;所述立即数重定位栈用于存储跨文件调用的符号所对应的地址信息;所述重定位数据段包括利用所述重定位元组数据中目标类型对应的重定位元组生成的全局偏移表;

第一电子设备的处理器接收外部的启动指令后,在存储器中启动支持重定位的所述目标U-Boot固件,以执行初始化操作;

所述处理器对所述目标U-Boot固件对应的全局偏移表和立即数重定位栈进行内存地址重定位处理,更新所述全局偏移表和所述立即数重定位栈,获取重定位处理后的目标U-Boot固件;

所述处理器在内存空间中运行所述目标U-Boot固件,并根据所述目标U-Boot固件记录的目标信息进行定位跳转,从而引导所述第一电子设备所搭载的操作系统启动。

第二方面,本申请提供一种引导加载程序U-Boot固件的重定位装置,包括:

接收模块,用于接收启动指令;

处理模块,用于在存储器中启动支持重定位的目标U-Boot固件,以执行初始化操作;对所述目标U-Boot固件对应的全局偏移表和立即数重定位栈进行内存地址重定位处理,更新所述全局偏移表和所述立即数重定位栈,获取重定位处理后的目标U-Boot固件;

运行模块,用于在所述内存空间中运行所述目标U-Boot固件,并根据所述目标U-Boot固件记录的目标信息进行定位跳转,从而引导操作系统启动。

第三方面,本申请提供一种电子设备,包括:处理器,以及与所述处理器通信连接的存储器;

所述存储器存储计算机执行指令;

所述内存用于暂时存放所述处理器执行所述存储器存储的计算机执行指令所需的运算数据;

所述处理器执行所述存储器存储的计算机执行指令,以实现如第一方面中任一项所述的方法。

第四方面,本申请提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如第一方面中任一项所述的方法。

第五方面,本申请提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如第一方面中任一项所述的方法。

本申请提供的引导加载程序固件的重定位方法、装置、设备及介质,通过生成可执行的引导加载程序U-Boot固件,获取该U-Boot固件中重定位元组数据、立即数重定位栈等与代码重定位相关的内容,在将该U-Boot固件拷贝到内存中并确定重定位该U-Boot固件的偏移地址,进而通过该偏移地址修正该U-Boot固件中重定位元组数据、立即数重定位栈等相关的内容,获得重定位处理后的U-Boot固件,从而引导目标设备的嵌入式操作系统正常启动。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。

图1为现有的一种通过U-Boot固件引导嵌入式操作系统的流程示意图;

图2为本申请实施例提供的一种引导加载程序U-Boot固件的重定位方法的流程示意图;

图3为本申请实施例提供的一种对初始U-Boot固件预处理方法的流程示意图;

图4为本申请实施例提供的一种内存地址重定位处理方法的流程示意图;

图5为本申请实施例提供的一种引导加载程序U-Boot固件的重定位装置的结构示意图;

图6为本申请实施例提供的一种电子设备的结构示意图。

通过上述附图,已示出本申请明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本申请构思的范围,而是通过参考特定实施例为本领域技术人员说明本申请的概念。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。

首先对本申请所涉及的名词进行解释:

代码重定位:指将代码从存储地址处搬运到运行地址处运行。例如,代码存储在设备的Flash中,但代码运行时却要求在另外的指定的地址,因此就需要赋值一份代码到指定的地址处进行运行。

引导加载程序(Universal Boot Loader,U-Boot):指用于引导嵌入式操作系统启动的程序,包括加载启动参数、加载设备树、启动操作系统内核、挂载根文件系统等,从而使得嵌入式操作系统能够正常启动与运行。

下面以嵌入式操作系统的启动为例,对如何通过U-Boot固件引导嵌入式操作系统的启动进行说明。图1为现有的一种通过U-Boot固件引导嵌入式操作系统的流程示意图。如图1所示,该流程可以包括:

S101、目标设备上电或复位,

该目标设备例如可以是使用该嵌入式操作系统的任意设备,例如可以是智能手机、平板电脑移动设备、便携音频视频播放器、车机设备、智能机器人等

S102、判断U-Boot固件的启动方式。

其中,U-Boot固件存储在该嵌入式操作系统所在的目标设备的存储器中,该存储器例如可以是NOR Flash、NAND Flash、低引脚数(Low Pin Count,LPC)存储器等。处理器根据该U-Boot固件所在的存储器的类型,判断该U-Boot固件中程序的启动方式,从对应的存储器的0地址处启动并执行该U-Boot固件的程序。

S103、将存储器0地址映射到入口地址,并从此处开始运行U-Boot固件中的程序。

处理器根据该U-Boot固件的启动方式,确定启动并执行该U-Boot固件。处理器将该U-Boot所在的存储器的0地址映射到虚拟地址的入口地址(虚拟地址)处,从该入口地址处运行该U-Boot固件。其中,该入口地址是根据该处理器架构确定的。

S104、进行内存初始化、以及、内存训练。

如何进行该目标设备的内存初始化操作、以及、内存训练操作可以参照现有技术,本申请对此不再赘述。

S105、将U-Boot固件中的程序代码重定位到内存。

由于在U-Boot固件中的程序的代码,包括位置有关码,以及,位置无关码。其中,位置无关码对运行时的地址没有要求,即该位置无关码的地址可以是任一地址。位置有关码是绝对地址,必须在相应的地址才能运行。因此,处理器如何将该U-Boot固件的程序转移到内存中运行。

此外,由于处理器通过指令运行U-Boot固件、执行U-Boot固件中的程序代码重定位等操作需要通过程序计数器(Program Counter,PC)完成,且该U-Boot固件一开始运行在存储器中,要重定位到内存中运行。因此,也需要通过代码重定位的方式将该PC中包括的指令所在单元的地址从存储器中修正至内存中。

S106、在内存中运行该U-Boot固件。

处理器将该U-Boot固件在内存中运行时,通过该U-Boot固件加载该嵌入式操作系统的启动参数、系统内核、设备树等内容。该嵌入式操作系统的启动参数、系统内核、可以根据该嵌入式操作系统的实际需求确定,该嵌入式操作系统的设备树可以根据该目标设备所具备或连接的设备的实际情况确定,本申请对此不做限制。

S107、启动系统内核。

该系统内核为与该嵌入式操作系统对应的内核态,包括负责管理系统的功能模块集合。

S108、挂载根文件系统。

该根文件系统是系统内核启动时挂载的第一个文件系统,系统内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

S109、执行应用程序。

通过经U-Boot固件完成引导后启动的该嵌入式操作系统,执行该嵌入式操作系统中的应用程序,以进行正常使用该嵌入式操作系统的功能与服务。

然而,针对步骤S105中如何重定位U-Boot固件中的程序,是必需解决的问题。

有鉴于此,本申请提供了一种引导加载程序U-Boot固件重定位方法,通过生成可执行的引导加载程序U-Boot固件,获取该U-Boot固件中重定位元组数据、立即数重定位栈等与代码重定位相关的内容,在将该U-Boot固件拷贝到内存中并确定重定位该U-Boot固件的偏移地址,进而通过该偏移地址修正该U-Boot固件中重定位元组数据、立即数重定位栈等与代码重定位相关的内容,获得重定位处理后的U-Boot固件,从而引导目标设备的嵌入式操作系统正常启动。

下面以具体地实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本申请的实施例进行描述。

本申请所提供的引导加载程序U-Boot固件重定位方法的执行主体可以为第一电子设备的处理器,即前述所说的目标设备中的处理器。该第一电子设备的存储器中包括支持重定位的目标U-Boot固件,以对该U-Boot固件进行重定位处理。其中,该目标U-Boot固件为重定位组件生成的,该重定位组件可以为驱动程序、程序代码软件,也可以为存储有相关执行代码的介质,例如,U盘等;或者,该重定位组件还可以为集成或安装有相关执行代码的实体装置,例如,芯片、微控制单元(Microcontroller Unit,简称MCU)、电脑、计算机等电子设备。

下面以重定位组件为电子设备(第二电子设备)为例对引导加载程序U-Boot固件的重定位方法进行说明。图2为本申请实施例提供的一种引导加载程序U-Boot固件的重定位方法的流程示意图。如图2所示,该方法可以包括:

S201、第二电子设备对初始U-Boot固件进行预处理,得到处理后的目标U-Boot固件。

其中,该初始U-Boot固件包括:重定位元组数据、立即数重定位栈,以及,预留的重定位数据段。

该重定位元组数据用于表示待进行代码重定位的数据。该重定位元组数据中可以包括该初始U-Boot固件中的位置有关码的数据,该位置有关码即该初始U-Boot固件运行在内存中时,需要进行代码重定位的代码类型。在重定位该U-Boot固件时,该重定位元组数据用于描述需要进行位置修正的位置有关码。

该立即数重定位栈用于存储跨文件调用的符号的地址信息。例如,在文件A中需要调用文件B中的C符号时,文件A中C符号的地址可以通过该立即数重定位栈中存储的C符号的地址偏移数据获取。即,文件A中C符号的地址=文件B中C符号的地址+立即数重定位栈中对应的C符号的地址偏移数据。

该预留的重定位数据段为该U-Boot固件中预留的数据段,用于存储重定位元组数据。该预留的重定位数据段的起始地址、数据段大小可以根据实际需要确定。该预留的重定位数据段包括在第二电子设备对初始U-Boot固件进行预处理时,利用该重定位元组数据中目标类型对应的重定位元组生成的全局偏移表,该目标类型对应的重定位元组为该初始U-Boot固件中包括基地址的重定位元组。

该支持重定位的目标U-Boot固件的重定位数据段包括:利用重定位元组数据中目标类型的重定位元组生成的全局偏移表,目标类型的重定位元组为该初始U-Boot固件中包括基地址的重定位元组。该目标类型的重定位元组包括该支持重定位的目标U-Boot固件中的位置有关码相关的元组数据,例如可以是与代码重定位相关的重定位文本、重定位只读数据、重定位数据等。该基地址为该目标类型的重定位元组的在存储介质中的基地址。

一种可能的实现方式,对该初始U-Boot固件重定位数据预处理例如可以包括通过对该初始U-Boot固件包括的与重定位相关的数据进行解析、筛选等操作获取目标类型的重定位元组。根据该目标类型的重定位元组获得全局偏移表,进而获得支持重定位的目标U-Boot固件。

另一种可能的实现方式,对该初始U-Boot固件重定位数据预处理在包括上述对该初始U-Boot固件包括的与重定位相关的数据进行解析、筛选的基础上,还可以包括对该与重定位相关的数据的排序、地址转换等至少一项操作。根据该目标类型的重定位元组获得全局偏移表,进而获得支持重定位的目标U-Boot固件。

在得到支持重定位的目标U-Boot固件之后,该方法还可以包括:将目标U-Boot固件烧录至第一电子设备的存储器的第一地址对应的存储空间中,以使该第一电子设备能够运行并重定位该U-Boot固件,根据重定位处理后的U-Boot固件引导嵌入式操作系统的启动。

其中,该存储器例如可以是该目标设备的闪存存储器,例如可以是NOR闪存、NAND闪存等。该第一地址为运行支持重定位的目标U-Boot固件的地址,例如可以是根据该第一电子设备的处理器确定的固定入口地址。

将该U-Boot固件烧录至第一电子设备的存储器中可以是第二电子设备执行的,也可以是该第二电子设备生成目标U-Boot固件之后,将该目标U-Boot固件分发给其他设备后,由其他设备执行的,本申请对此不做限制。

S202、第一电子设备的处理器接收外部的启动指令后,在存储器中启动支持重定位的目标U-Boot固件,以执行初始化操作。

其中,该启动指令用于启动该第一电子设备,以使该第一电子设备上电或者复位。本申请对于该启动指令的来源以及发送方式不做限制,只要是能够使得第一电子设备接收到该指令的方法均可。该目标U-Boot固件为S201中生成的目标U-Boot固件。

该存储器例如可以是该第一电子设备中任意一种闪存存储器,此处不再对闪存存储器赘述。该初始化操作可以包括对处理器进行初始化,对内存进行初始化,对该目标U-Boot固件的内存分配进行初始化等。

S203、处理器对该目标U-Boot固件对应的全局偏移表和立即数重定位栈进行内存地址重定位处理,更新全局偏移表和立即数重定位栈,获取重定位处理后的目标U-Boot固件。

其中,该目标U-Boot固件的全局偏移表、立即数重定位栈中的内容对应的数据为地址相关码,这些数据的地址在目标U-Boot固件运行在存储器上与运行在内存上时需要进行重定位处理。

该内存地址重定位处理可以根据这些数据在存储器中对应的基地址,以及该目标U-Boot固件拷贝到内存中时的获取的偏移地址,分别计算获取该目标U-Boot固件的全局偏移表和立即数重定位栈中的数据在内存上运行的修正地址。

然后分别将获取的该修正地址作为该目标U-Boot固件对应的全局偏移表和立即数重定位栈中的数据的新地址,存储入目标U-Boot固件中,以对目标U-Boot固件中的全局偏移表和立即数重定位栈的地址进行更新,该更新过程即为重定位处理过程。完成更新后,获取重定位处理后的目标U-Boot固件。

其中,该步骤还可以包括处理器对程序计数器进行内存地址重定位处理。该程序计数器用于指示该处理器需要处理的下一条指令所在单元的地址,该指令为该处理器中启动嵌入式操作系统的指令。该内存地址重定位处理可以根据程序计数器在存储器中对应的基地址,以及该目标U-Boot固件拷贝到内存中时的获取的偏移地址,计算获取程序计数器中的数据在内存上运行的修正地址。然后将获取的该修正地址作为程序计数器中的数据的新地址。

相应的,处理器在内存空间中运行目标U-Boot固件,并根据目标U-Boot固件记录的目标信息进行定位跳转还包括,对程序计数器中的数据的新地址进行寻址,从而将程序计数器中的数据从存储器中定位跳转到内存空间中运行。

可选地,可以通过重定位中间件对程序计数器,以及,该目标U-Boot固件的全局偏移表和立即数重定位栈进行内存地址重定位处理。该重定位中间件可以为驱动程序、程序代码软件,也可以为存储有相关执行代码的介质,例如,U盘等;或者,该重定位中间件还可以为集成或安装有相关执行代码的实体装置,例如,芯片、微控制单元(MicrocontrollerUnit,简称MCU)、电脑、计算机等电子设备。在第一电子设备上电或复位时,运行该重定位中间件,以执行上述对程序计数器、该U-Boot固件的全局偏移表、以及、立即数重定位栈中的数据的基地址的修正。

S204、处理器在内存空间中运行目标U-Boot固件,并在根据该目标U-Boot固件记录的目标信息进行定位跳转,从而引导第一电子设备所搭载的操作系统启动。

其中,该目标U-Boot固件记录的目标信息包括全局偏移表和立即数重定位栈中的数据的新地址,根据该全局偏移表和立即数重定位栈中的数据的新地址,处理器通过对新地址的寻址获取全局偏移表中的重定位元组,以及立即数重定位栈中的数据。

该第一电子设备的处理器在内存中运行重定位处理后的U-Boot固件时,可以如步骤S106,通过将重定位元组,以及立即数重定位栈中的数据定位跳转至内存空间中,以加载该第一电子设备上嵌入式操作系统的启动参数、系统内核、以及、设备树等,从而启动该嵌入式操作系统的内核,挂载该嵌入式操作系统的根文件系统,完成引导嵌入式操作系统的启动。

本申请提供的引导加载程序U-Boot固件重定位方法,通过获取可执行的引导加载程序U-Boot固件中包括的全局偏移表、立即数重定位栈,使用该U-Boot固件拷贝到内存中获取的偏移地址,对全局偏移表、立即数重定位栈,以及程序计数器中的数据进行代码重定位,获得重定位处理后的U-Boot固件。然后在内存中运行该重定位处理后的U-Boot固件,从而引导启动第一电子设备的嵌入式操作系统。

下面,对该第二电子设备如何获取该初始U-Boot固件进行介绍。

实现方式A:通过编译U-Boot源代码获取初始U-Boot固件。

该初始U-Boot固件为通过编译U-Boot源代码生成的可执行与可链接格式(Executable and Linkable Format,ELF)的U-Boot固件。

编译U-Boot的源代码,添加目标链接参数,并利用该目标链接参数写入重定位元组数据。该目标链接参数用于将该U-Boot源代码生成的U-Boot固件中的重定位相关的内容(即重定位元组数据)保留在该U-Boot固件的可执行文件中。该目标链接参数例如可以是-emit-relocs参数,关于如何通过-emit-relocs参数写入重定位元组数据,可以参照现有技术,本申请对此不再赘述。

生成立即数重定位栈,并存储在预设的地址区间中,得到初始U-Boot固件。该预设的地址空间可以是根据实际需求选择的,例如,该预设的地址空间为宏定义目标区间。该立即数重定位栈为该U-Boot的源代码在编译过程中自动生成的,即该是否生成该立即数重定位栈根据该U-Boot的源代码确定,当选取的U-Boot的源代码具备生成该立即数重定位栈的功能时,编译该U-Boot的源代码,即可自动生成该立即数重定位栈。该宏定义目标区间可以根据实际需求确定,本申请对此不作限制,该宏定义目标区间可以是_GLOBAL_OFFSET_TABLE-sdata_end地址区间。在该宏定义目标区间中,该立即数重定位栈中包括的地址数据以固定的字节数对齐,以便于该处理器能够正确的访问该立即数重定位栈中包括的地址数据。该固定的字节数与该目标设备所使用的处理器的位数相关,例如该处理器的寄存器位数为64位时,以8字节对齐;该处理器的寄存器位数为32位时,以4字节对齐等。

实现方式B:从其他设备中获取根据该U-Boot源代码已经编译好的该初始U-Boot固件,该其它设备可以采用实现方式A中的方法编译该U-Boot源代码,从而获得该初始U-Boot固件。

下面,针对步骤S201中第二电子设备如何对初始U-Boot固件进行预处理,得到支持重定位的目标U-Boot固件进行详细的介绍。

图3为本申请实施例提供的一种对初始U-Boot固件预处理方法的流程示意图。如图3所示,步骤S201可以包括:

S301、第二电子设备从重定位元组数据中获取目标类型的重定位元组。

其中,该目标类型对应的重定位元组为初始U-Boot固件中包括基地址的重定位元组数据。该初始U-Boot固件中包括的数据可以是根据数据的名称属性划分为多个数据段,该名称属性例如可以是文本、只读数据、数据、重定位文本、重定位只读数据、重定位数据等。对于每个数据段,该数据段的属性包括名称、类型、地址、数据大小等。该初始U-Boot固件中包括的数据,以及数据段的划分与处理器的架构、以及实际生成的初始U-Boot固件相关,可以参照现有技术,此处不再赘述。

该重定位元组数据中可以包括该U-Boot固件中与代码重定位相关的重定位文本、重定位只读数据、重定位数据等,通过对上述数据段的解析,可以从该初始U-Boot固件中包括的数据里解析出与代码重定位相关的数据段的元组数据,从而获得重定位元组数据。

该解析可以为通过在上述数据段中,根据名称属性选择与代码重定位相关的数据段,然后获取这些数据段中包括的数据作为重定位元组数据。例如,可以通过对重定位文本、重定位只读数据、重定位数据的解析获得的重定位元组数据,该重定位元组数据可以包括偏移、信息、类型、值等属性。示例性的,表1为本申请实施例提供的一种重定位元组数据:

表1

其中,Offset为重定位元组数据的偏移属性,表征该数据在初始U-Boot固件中相对于初始位置的偏移量,从而表征该数据在初始U-Boot固件中的地址,Info为重定位元组数据的信息属性,Type为重定位元组数据的类型属性,Value为重定位元组数据的值属性。对于重定位元组数据的类型属性,可以包括R_NONE、R_32、R_64、R_RELATIVE等。

根据该目标设备所使用的处理器,从重定位元组数据的类型属性中确定目标类型。该目标类型例如可以是与该处理器的寄存器的位数确定的。例如,当该处理器为64位处理器时,重定位元组数据中包括64位对应的类型属性(例如表1中的R_64),以及32位对应的类型属性(例如表2中的R_32),此时选取64位对应的类型作为目标类型;当该处理器为32位处理器时,重定位元组数据中包括32位对应的类型属性,不包括64位对应的类型属性,此时选取32位对应的类型作为目标类型等。

S302、第二电子设备根据该目标类型的重定位元组的基地址的大小关系,对该目标类型的重定位元组进行排序。

可选地,可以根据该目标类型的重定位元组的基地址的从大到小的关系,将该目标类型的重定位元组进行排序,第一个该目标类型的重定位元组的基地址为最大的基地址。

可选地,可以根据该目标类型的重定位元组的基地址的从小到大的关系,将该目标类型的重定位元组进行排序,第一个该目标类型的重定位元组的基地址为最小的基地址。

S303、第二电子设备将排序后的目标类型的重定位元组进行偏移统计,生成全局偏移表。

该偏移统计可以为以某一个目标类型的重定位元组的基地址为基础,通过基地址的偏移统计其他目标类型的重定位元组。

一种可能的实现方式,第二电子设备保留第一个目标类型的重定位元组的基地址,并将其余目标类型的重定位元组的基地址设置为前一目标类型的重定位元组的相对基地址,得到处理后的目标类型的重定位元组。

例如,第一个目标类型的重定位元组的基地址为0x900000001c007728,第二个目标类型的重定位元组的基地址为900000001c00774c,第三个目标类型的重定位元组的基地址为900000001c00779c,则按照该方法,第二个目标类型的重定位元组的基地址为相对于第一个目标类型的重定位元组的基地址的相对基地址,该相对基地址为0x24;同理,第三个目标类型的重定位元组的基地址为相对于第二个目标类型的重定位元组的基地址的相对基地址,该相对基地址为0x50。

另一种可能的实现方式,第二电子设备保留第一个目标类型的重定位元组的基地址,并将其余目标类型的重定位元组的基地址设置为相对于第一个目标类型的重定位元组的基地址的相对基地址,得到处理后的目标类型的重定位元组。

通过该方法,能够实现仅保存第一个目标类型的重定位元组的基地址,将其他目标类型的重定位元组的基地址仅存储为以地址偏移量表示的相对基地址,从而将存储该目标类型的重定位元组的全局偏移表压缩至一个更小的存储空间,提高存储空间的利用率。

上述所有目标类型的重定位元组按照步骤S302中的排序方法依次保存在全局偏移表中,且该全局偏移表中仅存储了第一个目标类型的重定位元组的基地址,以及其他目标类型的重定位元组的相对基地址。

S304、第二电子设备将该全局偏移表写入重定位数据段中,得到目标U-Boot固件。

该重定位数据段为步骤S201中所说的重定位数据段,在重定位数据段存储重定位元组数据之后,可以通过添加特定类型的数据指示该数据段中存储的重定位元组数据的地址范围。该支持重定位的目标U-Boot固件与初始U-Boot固件的区别在于该支持重定位的目标U-Boot固件中除了包括初始U-Boot固件中的数据,还包括该全局偏移表。

需要说明的是,本申请实施例提供了一种示例性的方式,如何通过保留相对基地址的方式来节省全局偏移表的存储空间的方式。应理解,对于上述设置相对基地址的方式,也可以采用其他方式实现。例如,可以采用如下方式替换上述步骤S303:保留第一个目标类型的重定位元组的基地址,并将其余目标类型的重定位元组的基地址设置为第一个目标类型的重定位元组的相对基地址,得到处理后的目标类型的重定位元组。

本申请提供的对初始U-Boot固件重定位数据预处理方法,通过对重定位数据的类型的筛选,获取目标类型的重定位数据,并通过将目标类型的重定位数据的基地址处理为相对基地址的方法,缩小了存储目标类型的重定位数据的存储空间,提高了空间利用率。然后通过这些目标类型的重定位数据,获取全局偏移表,完成对初始U-Boot固件重定位数据的预处理操作,为后续重定位支持重定位的目标U-Boot固件提供了基础,从而进一步用于引导嵌入式操作系统的启动。

为便于理解,下面以目标设备的处理器为LoongArch架构为例,对上述步骤S301如何获取目标类型的重定位元组进行说明。需了解,该示例仅为本申请提供的一种可能的实现方式,本申请并不仅限于该实例中的处理器架构。

当该处理器为LoongArch架构时,处理器将该U-Boot固件所在的存储器的0地址映射到的入口地址(虚拟地址)可以为0x900000001c000000。该LoongArch架构的处理器在该入口地址处运行该U-Boot固件。

在LoongArch处理器架构下,该重定位组件是由loongarch-reloc.c文件经过编译后生成loongarch-reloc的可执行文件,主要用于对初始U-Boot固件重定位数据预处理,得到支持重定位的目标U-Boot固件的功能。

在LoongArch处理器架构下,该初始U-Boot固件中包括的所有数据可以如下表2所示:

表2

如表2所示的该初始U-Boot固件中包括的所有数据中,包含了重定位元组数据,可以通过对该初始U-Boot固件中包括的所有数据进行解析、筛选等操作,获取重定位元组数据。

该初始U-Boot固件中包括的数据的属性包括名称(Name)、类型(Type)、地址(Address)、数据大小(Size)等。其中,该初始U-Boot固件中包括的数据还包括其他名称属性的数据,例如.got、.u_boot_list等。该其他名称属性的数据与实际生成的初始U-Boot固件相关,可以参照现有技术,此处不再赘述。该重定位元组数据中可以包括该U-Boot固件中与代码重定位相关的重定位文本(.rela.text)、重定位只读数据(.rela.rodata)、重定位数据(.rela.data)等,通过对上述名称属性与代码重定位相关的元组数据的解析,可以获得重定位元组数据。

通过对上述与代码重定位相关的元组数据的解析获得的重定位元组数据中,可以包括偏移、信息、类型、值等属性。示例性的,表3为本申请实施例提供的一种重定位元组数据:

表3

其中,Offset为重定位元组数据的偏移属性,Info为重定位元组数据的信息属性,Type为重定位元组数据的类型属性,Value为重定位元组数据的值属性。对于重定位元组数据的类型属性,可以包括R_LARCH_NONE、R_LARCH_32、R_LARCH_64、R_LARCH_RELATIVE等。

根据该目标设备所使用的处理器,从重定位元组数据的类型属性中确定目标类型。该目标类型例如可以是与该处理器的寄存器的位数确定的。例如,当该处理器为64位处理器时,重定位元组数据中包括64位对应的类型属性(例如表3中的R_LARCH_64),以及32位对应的类型属性(例如表3中的R_LARCH_32),此时选取64位对应的类型作为目标类型;当该处理器为32位处理器时,重定位元组数据中包括32位对应的类型属性,不包括64位对应的类型属性,此时选取32位对应的类型作为目标类型等。

根据上述获取的目标类型的重定位元组数据建立全局偏移表,并将该全局偏移表写回U-Boot固件中预留的重定位数据段。示例性的,以重定位元组数据如表3所示,以处理器为64位处理器为例,该全局偏移表可以如下表4所示:

表4

即,该全局偏移表中仅包括R_LARCH_64类型的重定位元祖数据,该全局偏移表包含的数据内容仅包括重定位元组数据的偏移属性、重定位元组数据的类型属性、重定位元组数据的值属性。

在LoongArch处理器架构下,该预留的重定位数据段例如可以是.data.reloc数据段,该数据段的起始地址为_rel_start,数据段大小为48k比特,并可以通过在该数据段中存储的最后一个重定位元组数据之后,添加预设数据类型的数据,以指示该数据段中存储的重定位元组数据的地址范围。该预设数据类型的数据例如可以使NONE类型的数据。

下面,对于步骤S203中第一电子设备的处理器如何对目标U-Boot固件对应的全局偏移表和立即数重定位栈进行内存地址重定位处理进行详细说明。

图4为本申请实施例提供的一种内存地址重定位处理方法的流程示意图。如图4所示,步骤S203可以包括:

S401、处理器将目标U-Boot固件从存储器拷贝到内存中,以得到该目标U-Boot固件在该内存中运行的目标地址。

其中,该目标U-Boot固件中包括内存分配功能,当处理器将该目标U-Boot固件从存储器拷贝到内存时,该内存分配功能会在内存中为该目标U-Boot固件分配内存地址。处理器根据该内存分配功能为该目标U-Boot固件分配的内存地址,获取该目标U-Boot固件在该内存中运行的目标地址。

在将目标U-Boot固件从存储器拷贝到内存中时,由于地址无关码并非绝对地址,因此在拷贝完成时,该目标U-Boot固件中的位置无关码的重定位处理自动完成,但拷贝操作无法完成绝对地址的重定位处理。

S402、处理器根据目标U-Boot固件在存储器中的运行地址,以及,目标地址,得到该目标U-Boot固件对应的偏移地址。

根据该目标U-Boot固件在存储器中的运行地址,以及,在该内存中运行的目标地址,作差获得运行地址的偏移量,将该偏移量作为该目标U-Boot固件对应的偏移地址。例如,该目标U-Boot固件在存储器中的运行地址为0x900000001c000000,在内存中运行的目标地址为0x900000000f000000,则该运行地址的偏移量为-0xD000000。

S403、处理器利用偏移地址,修正全局偏移表中各目标类型的重定位元组各自对应的基地址。

修正该全局偏移表中各目标类型的重定位元组的基地址的方法例如可以以下式(1)表示:

After_Address

其中,After_Address

通过修正该全局偏移表中各目标类型的重定位元组的基地址,以完成该目标U-Boot固件中与代码重定位相关的重定位文本、重定位只读数据、重定位数据等内容的重定位处理。

S404、处理器利用偏移地址,修正立即数重定位栈中跨文件调用的符号对应的地址信息中的基地址。

修正该立即数重定位栈中跨文件调用的符号的对应的地址信息中的基地址的方法例如可以以下式(2)表示:

After_Address

After_Address

S405、处理器利用偏移地址,修正程序计数器的基地址。

修正该程序计数器的基地址的方法例如可以以下式(3)表示:

After_Address

After_Address

通过修正该程序计数器的基地址,以使处理器能够从修正后的基地址(内存中的地址)运行该目标U-Boot固件。

图5为本申请实施例提供的一种引导加载程序U-Boot固件的重定位装置的结构示意图。如图5所示,包括:接收模块11,处理模块12,运行模块13。

接收模块11,用于接收启动指令。

处理模块12,用于在存储器中启动支持重定位的目标U-Boot固件,以执行初始化操作。对该目标U-Boot固件的全局偏移表和立即数重定位栈进行内存地址重定位处理,更新全局偏移表和立即数重定位栈,获取重定位处理后的目标U-Boot固件。

运行模块13,用于在该内存空间中,运行重定位处理后的目标U-Boot固件,并根据目标U-Boot固件记录的目标信息进行定位跳转,从而引导操作系统启动。

一种可能的实施方式,处理模块12,具体用于将该目标U-Boot固件从该存储器拷贝到该内存中,以得到该目标U-Boot固件在该内存中运行的地址。根据该目标U-Boot固件在该存储器中对应的运行地址,以及该目标地址,得到该目标U-Boot固件对应的偏移地址。利用该偏移地址,分别修正该全局偏移表中各目标类型的重定位元组各自对应的基地址。利用该偏移地址,修正该立即数重定位栈中跨文件调用的符号对应的地址信息中的基地址。利用该偏移地址,修正程序计数器的基地址。

本申请实施例提供的引导加载程序U-Boot固件重定位装置,可以执行上述方法实施例中的引导加载程序U-Boot固件重定位方法,其实现原理和技术效果类似,在此不再赘述。

图6为本申请实施例提供的一种电子设备的结构示意图。其中,该智能电子设备用于执行前述方法实施例的引导加载程序U-Boot固件重定位方法。该智能电子设备用于生成目标U-Boot固件时,例如可以是前述所说的重定位组件所在的第二电子设备;该智能电子设备用于执行引导加载程序U-Boot固件重定位方法时,例如可以是前述所说的第一电子设备。如图6所示,该电子设备600可以包括:至少一个处理器601、存储器602,内存603。在一种可能的实施方式下,还可以包括通信接口604。

存储器602,用于存放程序。具体地,程序可以包括程序代码,程序代码包括计算机操作指令。

存储器602可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。

处理器601用于执行存储器602存储的计算机执行指令,以实现前述方法实施例所描述的方法。其中,处理器601可能是一个CPU,或者是特定集成电路(ApplicationSpecific Integrated Circuit,简称为ASIC),或者是被配置成实施本申请实施例的一个或多个集成电路。

内存603用于在处理器601执行存储器602存储的计算机执行指令时,暂时存放执行该计算机执行指令所需的运算数据。

可选地,处理器601通过通信接口604可以与外部设备进行通信交互。当该电子设备为重定位组件所在的第二电子设备时,此处所说的外部设备例如可以是第一电子设备。

在具体实现上,如果通信接口604、内存603、存储器602以及处理器601独立实现,则通信接口604、内存603、存储器602以及处理器601可以通过总线相互连接并完成相互间的通信。总线可以是工业标准体系结构(Industry Standard Architecture,简称为ISA)总线、外部设备互连(Peripheral Component,简称为PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,简称为EISA)总线等。总线可以分为地址总线、数据总线、控制总线等,但并不表示仅有一根总线或一种类型的总线。

可选的,在具体实现上,如果通信接口604、内存603、存储器602和处理器601集成在一块芯片上实现,则通信接口604、内存603、存储器602和处理器601可以通过内部接口完成通信。

本申请还提供了一种计算机可读存储介质,该计算机可读存储介质可以包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或者光盘等各种可以存储程序代码的介质,具体的,该计算机可读存储介质中存储有程序指令,程序指令用于上述实施例中的方法。

本申请还提供一种计算机程序产品,该程序产品包括执行指令,该执行指令存储在可读存储介质中。电子设备的至少一个处理器可以从可读存储介质读取该执行指令,至少一个处理器执行该执行指令使得电子设备实施上述各种实施方式提供的方法。

最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

相关技术
  • 车辆重定位方法、装置、车载设备、服务器及存储介质
  • 跨平台显卡固件翻译执行方法、装置、设备及可读介质
  • 一种固件更新的方法、系统、装置、设备及存储介质
  • HTML5页面的加载方法、装置、计算机设备及存储介质
  • 网页加载方法、装置、终端设备、处理器及存储介质
  • 固件程序的加载方法及装置、存储介质和电子设备
  • 启动引导程序加载方法、装置、系统、电子设备及介质
技术分类

06120115933737