基于迭代链接的C6000 DSP平台在轨维护方法研究

2022-08-02 14:08杜建伟李振松
空间控制技术与应用 2022年1期
关键词:钩子代码分配

杜建伟, 李振松, 关 健

北京控制工程研究所, 北京 100090

0 引 言

软件在轨维护是有效保证航天器软件在轨稳定运行的重要手段.近年来,随着DSP处理器应用的逐步增多、产品覆盖面越来越广,面向DSP平台的在轨维护方法变得越来越重要.文献[1-2]针对DSP软件的维护方法,采用的是全文替换方式,即将程序存储器中的软件整体替换;文献[3]提出一种针对文件系统的在轨维护方法,基于多份文件映像,在系统引导阶段,通过引导配置加载对应的映像文件达到软件替换的目的.文献[4]设计了一种航天器软件动态在轨维护方案,通过在DSP软件中预埋钩子,实现在轨软件模块级在轨维护,通过在轨函数钩子使能,实现在轨模块的替换与还原,确保航天器在轨维护过程中仍可连续运行.

航天器软件由于运行资源受限,且运行过程有较强的连续性要求,上述方法在实际应用中存在如下不适应性:

(1)文献[1-3]提到的方法,软件替换过程复杂,并且需要中断当前任务执行,通过重新加载才能运行新程序,对于安全关键系统而言是难以容忍的.同时文献[3]提到的在轨维护方法还需要操作系统具备文件系统的支持,系统运行开销较大,对于资源受限的航天器嵌入式应用环境而言也不适用;

(2)文献[4]为了便于在轨维护代码的生成和提取,在轨维护代码与已固化代码一起进行编译,通过对新增在轨维护文件进行MEMORY和SECTIONS链接伪指令重定位,确保其不影响原固化代码的编译结果,这样整体编译链接后,在原固化编译链接结果基础之上,新增内容即为在轨维护内容.对于在轨维护程序,尤其涉及系统调用以及底层库函数调用的,仅针对新增在轨维护文件进行链接伪指令重定位,不能够保证编译结果中已固化部分内容地址分配的一致性.在轨维护代码中的底层系统调用以及库函数会被编译器自动分配到原.text段中,同时这部分模块所需的数据,也会自动分配至原来的.cinit段和.far段等其他段中,与已固化软件的各段交叉,导致原软件的地址整体发生变化,在轨维护代码中引用原软件变量或函数的,其地址也将相应发生变化,提取的注入代码将不可用.

(3)在轨维护代码所使用的空间,一般都是计算机存储器中预留的区域,存储器类别可能包括EEPROM、FLASH、MRAM以及SRAM等.对于加载至SRAM区运行的软件,在轨维护一般首先在SRAM中进行实施,钩子挂接的使能标志也在SRAM中,验证充分后,再将注入代码回写至EEPROM或FLASH等存储器中,永久保存.使用文献[4]的在轨钩子方式,软件如果经过断电或重新加载,原SRAM区中的钩子挂接标志已不存在,在轨维护软件将无法恢复运行状态.

针对上述问题,本文提出一种基于迭代链接的在轨维护方法,可实现注入代码的自动链接、段空间自动分配以及注入代码的自动提取,同时改进原文献[4]中的钩子挂接方法,实现系统在重新加载后重新加电后,在轨维护代码可正常得以运行.

1 迭代链接方法

DSP程序经编译链接后生成的目标文件是COFF(common object file format)格式,该文件格式引入了“段”的机制,不同的目标文件可以拥有不同数量及不同类型的“段”,通过链接指令,开发人员可以控制目标文件中段的构成和空间分配.文献[1]提出的DSP在轨维护方法,正是以此为前提设计,通过MEMORY和SECTIONS链接伪指令,将新增的在轨维护程序文件进行重新定位,以便于二进制注入代码的生成和提取.

原软件中功能模块Func0入口处预埋了钩子,如果Func0模块在轨运行过程出现问题,需要在轨维护,可新建程序文件obsm.c,在该文件中对Func0模块进行重新编写,生成在轨注入模块Func0_obsm,后续将通过钩子ObsmHook对Func0_obsm模块进行挂载,从而替换原模块Func0.

将新文件obsm.c纳入到原工程中,与其他文件进行联合编译.通过对原软件的链接文件进行修改,增加对文件obsm.c生成目标文件的链接及空间分配,使其可执行代码映射到单独的区域中.链接脚本文件如图1所示.

图1 链接脚本示例

但由于obsm.c在编写时,其内部逻辑可能会使用系统调用以及底层库函数调用的,底层系统调用以及库函数又往往带有其他依赖性内容,而且这部分内容在正常在轨维护代码编写过程中,是不可预知的,只有经过第一次编译链接后,才能得到其确定性的依赖内容.典型的如在轨注入模块中增加了底层库函数调用.

采用上述链接脚本,将Func0_obsm对应的在轨注入文件,映射到OBSM_DRAM空间,直接编译后,观察内存分配结果,发现除新增在轨修改函数Func0_obsm分配到OBSM_DRAM空间外,原软件内存分配结果出现变化,.text段中新增了底层库函数,导致原有函数调用地址与在轨修改前的状态不一致,这种情况下,采用常规方式不能够进行注入代码的直接提取,因为所有的跳转地址信息均已发生了变化,如图2所示.

图2 原软件地址发生变化的在轨修改链接结果示例

迭代链接方法,就是通过将在轨维护软件与原固化软件进行第一次链接,之后通过自动比对链接后的内存分配文件与原固化软件的内存分配文件,检索各段中的内容差异,提取内存分配文件中的新增的目标文件内容以及对应分段,将新增目标文件重新进行分段和重定位,并根据分段结果进行迭代次链接,从而确保在轨注入程序内存占用的确定性.迭代链接方法的流程图如图3所示.

图3 迭代链接处理流程

在迭代链接过程中,要根据内存分配比对结果,迭代修改链接脚本文件,将各段变化内容逐步进行地址重定位,直至除在轨维护段之外,其他各段与原固化软件状态一致.地址重定位过程中,各段变化内容原则上可以全部重定位至在轨维护段中.经过迭代后,将每次链接后各段变化内容进行了提取和重新分配,链接脚本也同步完成了更新,迭代后的链接脚本如图4所示.

图4 经迭代链接后的脚本示例

经过迭代链接,在轨维护程序与原固化软件联合编译后,确保了原固化软件中所有内容的地址分配保持不变,新增在轨维护代码编译结果全部分配到单独开辟的空间中,见图5所示.在此基础上,通过注入代码提取工具,在LST文件中,从对应的注入段,直接提取可用于在轨注入的可执行代码.

图5 原软件地址未发生变化的在轨维护链接结果示例

2 在轨维护程序重载机制

航天器软件运行,包括两种模式:

模式一,非加载方式运行,即软件在其固化存储的空间内直接运行,这类方式下,软件一般存储于PROM、MRAM等芯片;

模式二,加载方式运行,即通过处理器本身或加载程序,将软件从其固化空间搬家至SRAM中,之后再引导运行,这类方式下,软件一般存储于EEPROM、FLASH等芯片.

这两种运行模式也决定了在轨维护软件的加载和运行方式.通常情况无论哪种运行模式下,在轨维护软件都可以重定位到SRAM区,通过钩子挂接方式,进行地址跳转来运行,但考虑到SRAM在掉电或其他特殊情况下,会造成数据丢失,在轨维护软件经验证后,都应写入EEPROM、FLASH、MRAM中(PROM只读型芯片除外)进行永久存储.非加载方式下,对在轨维护软件进行迭代链接时,其地址可重定位到软件固化存储空间的空白区内(PROM只读型芯片除外);加载方式下,由于软件最终要加载至SRAM区运行,因此其地址必须重定位到SRAM中的空白区.

以加载方式为例,为确保软件在轨程序在系统重启、加断电等异常情况下能够继续正常运行,需要满足如下两个条件:

(1)程序存储芯片与SRAM中,要分别针对在轨维护程序预留足够的空间,并且该空间尽可能与原软件存储空间保持连续;原软件中涉及加载功能,要确保软件加载过程,能将原软件可执行代码所在分区以及在轨维护所在分区的内容实现整体搬家;避免软件搬家长度不足,导致在轨维护程序无法正常运行.空间设计如图6所示.在轨维护过程中,在轨注入程序对应可执行代码、依赖数据及变量,全部分配在.OBSM段中,搬家过程才不会出现可执行代码和数据丢失的情况.

图6 软件存储与加载空间分配

(2)在轨维护程序钩子挂接方法,应设计两种状态,一种是挂接及使能标志等存储于SRAM区,便于指令更改和操作;一种是挂接及使能标志等存储于EEPROM、FLASH、MRAM中.一般在轨注入程序首先注入至SRAM中运行,经验证后,即可回写入EEPROM、FLASH、MRAM中进行永久存储,同时挂接及使能标志也在EEPROM、FLASH、MRAM中建立三区存储机制.系统运行过程中如果出现异常情况,重新对软件进行加载并运行时,对应的在轨程序也能够被正常加载、挂接及使能,同时为确保注入地址的有效性,应对注入地址范围进行有效性判断.

(2)在轨维护程序钩子挂接方法,应设计两种状态,一种是挂接及使能标志等存储于SRAM区,便于指令更改和操作;一种是挂接及使能标志等存储于EEPROM、FLASH、MRAM中.一般在轨注入程序首先注入至SRAM中运行,经验证后,即可回写入EEPROM、FLASH、MRAM中进行永久存储,同时挂接及使能标志也在EEPROM、FLASH、MRAM中建立三区存储机制.系统运行过程中如果出现异常情况,重新对软件进行加载并运行时,对应的在轨程序也能够被正常加载、挂接及使能,同时为确保注入地址的有效性,应对注入地址范围进行有效性判断.

3 结 论

本文针对C6000 DSP处理器环境下的软件,提出了一种基于迭代链接的在轨维护方法,并开发了配套工具,可实现注入代码的自动链接、段空间自动分配以及注入代码的自动提取,同时针对在轨注入代码的连续运行,设计了在轨维护程序的重载机制,经过了充分的地面试验,并在某卫星型号的微型星敏感器上,进行了多次实际在轨验证,对星敏感器软件进行了整体和局部功能的升级.结果表明,该方法大幅降低了C6000 DSP环境下软件在轨维护的难度,简化了注入代码提取和确认的过程,在轨维护配套工具可靠实用,在DSP相似平台软件维护过程中也可推广适用.

猜你喜欢
钩子代码分配
1种新型燃油分配方案设计
不拴钩子的线也能把冰块钓起来吗?
Crying Foul
遗产的分配
谁和谁好
幸福的一家
神秘的代码
一周机构净增(减)仓股前20名
一行代码玩完19亿元卫星
精钩子