一种boot引导软件标准化生成、执行方法及系统与流程

文档序号:23051899发布日期:2020-11-25 17:27阅读:235来源:国知局
一种boot引导软件标准化生成、执行方法及系统与流程

本发明涉及计算机cpu领域,具体涉及一种boot引导软件标准化生成、执行方法及系统。



背景技术:

随着时间发展,国产芯片技术愈发精湛,龙芯1ecpu经过长时间的研发,开始广泛应用在航天型号任务中,如二代导航自主运行单元,数据终端,实践十号密封舱/回收舱载荷管理器等。不同型号任务中龙芯1e处理板都需配置boot引导软件。

boot引导软件是龙芯1e处理板(cpu为龙芯1e)的嵌入式软件,固化在龙芯1e处理板的程序存储器(norflash或eeprom)的boot代码存储区。boot引导软件是在龙芯处理主板上引导操作系统和应用程序启动的代码,用于cpu主板初始化、系统启动和操作系统引导。

boot引导软件由支持mips架构的汇编语言文件(rominit.s)以及c语言文件(bootinit.c,am29lv160b.c或eeprom.c等)组成。

boot引导软件开发编译基于交互式开发环境linux虚拟机,linux操作系统为ubuntu32位,编译器为gcc-mips-2.95.3,虚拟机版本号vmware-workstation-full-7.1.2-301548。

目前boot引导软件生成存在以下问题:

1)针对不同型号任务都要进行boot引导软件研发,造成重发开发,浪费资源,提高人力成本;

2)boot软件不可直接移植使用,要进行适应性修改,特别是对rominit.s中的汇编代码进行了部分改动,存在系统寄存器使用不当,后面代码改写前面寄存器值,导致软件卡死风险。

3)不同项目基本功能相同,区别在具体硬件的配置不同。比如喂狗信号的输出的方式不一样,有的项目采用电平喂狗,有的沿喂狗。那么喂狗的实现方式就不同,而软件中又需要插入多次喂狗操作。随之而来的问题是代码改动量大,影响域增加,错误率提高。

4)cache配置不同,有的需要打开cache,有的不需要开cache,那么需要将所有与cache有关的代码全部修改到位,容易遗漏,查找修改工作繁琐,由于人为因素进而影响软件质量。

5)软件重复开发导致软件正确性验证工作量增加,增加了成本,拉长了软件研制周期。

6)编译器存在缺陷,软件汇编文件rominit.s中汇编代码中同一个宏定义函数不同地方调用编译生成的二进制指令码不一致。

例如,fcall_printstr的打印信息函数调用,同一个打印函数的解析在0x80000000开始处,解析正确,在喂狗函数调用后,解析错误,0x80000090处指令码应该为luiv0,0x8640,实际是addiu指令,非法指令。

针对上述情况,进行了大量反复测试,每次编译时同时采取反汇编进行查看,mipsel-redhat-linux-objdump–dboot>1.s查看反汇编文件,bal(hexserial)函数出现了相同的问题,不同的地方调用,翻译的结果不一样。

7)龙芯1ecpu开过滤窗,不打开cache,不会死机;打开cache后存在死机风险,需要屏蔽这个bug,且操作要简单易行。

当系统运行在kseg0段,开cache后,相对转移指令无法使pc跳到uncached区域。要发出uncached取指,只能通过寄存器间接转移指令(jr/jalr)跳到kseg1段。其原理是把所有的jr/jalr指令改成j/jal跳到一个预定义的地方。

屏蔽上述bug,实质上就是把运行在kseg0段代码中所有的jr/jalr指令改成j/jal跳到一个预定义的地方,直观的方法是改动最终二进制代码,这种方法修改量大且操作复杂,安全性、可靠性低。需要一种简单易行,可操作性的方法。考虑到软件是使用工具链编译生成,通过修改工具链来处理。



技术实现要素:

本发明的目的在于解决如下技术问题:

1)boot软件重用性,尽可能多提高可复用构件的百分比,最大程度复用软件构架,需求,源代码,设计,测试等构件,简化设计,提高效率,降低成本。

2)不同项目研发boot软件时,研发人员,不用考虑程序的内部结构和内部特性的情况下,只需要修改相关接口函数(喂狗接口,cache接口),即可完成软件的更改。

3)软件汇编代码中同一个宏定义函数不同地方调用编译生成的二进制指令码不一致问题。

4)修复龙芯1e开cache的死机问题。

5)修复bug的方法简单、方便、易操作。

6)开发编译环境的标准设计,使用人员无需进行任何配置,使用本方案中配置好的编译环境输入命令即可生成.bin文件。

为实现上述目的,本发明提出了一种boot引导软件标准化生成方法,包括:

构建64位的linux虚拟机环境;

对gcc编译库进行配置:配置gcc编译器和配置环境变量;

导入软件工程文件夹,进行软件接口化配置和makefile文件配置;

在文件夹中放入源代码,通过makeboot.bin命令一键生成boot.bin文件;则boot.bin为最终的boot引导可执行文件。

作为上述方法的一种改进,所述环境变量包括:用于可执行文件的搜索路径设置的path环境变量,以及用于程序加载运行期间指定的动态链接库路径设置的ld_library_path环境变量。

作为上述方法的一种改进,所述软件接口化配置,具体为:汇编语言文件rominit.s采用mips汇编语言中的叶子函数,将boot代码中需要更动部分包装成叶子函数。

作为上述方法的一种改进,所述源代码包括:

主板初始化模块,用于对cpu主板进行初始化;包括cpu核内寄存器的初始化、cache的初始化、sdram的初始化和cpu片内串口初始化;

操作系统引导模块,用于完成操作系统映像引导;

程序存储器接口模块,用于完成flash/eeprom擦除、读写和开关接口操作;

串口输入输出模块,用于提供串口0和串口1的输入输出接口函数;

操作系统解压缩模块,用于对压缩vxworks映像实现解压缩操作。

本发明还提供了一种boot引导软件标准化生成系统,所述系统包括:

环境构建模块,用于构建64位的linux虚拟机环境;

配置模块,用于对gcc编译库进行配置:配置gcc编译器和配置环境变量;

boot引导可执行文件生成模块,用于导入软件工程文件夹,进行软件接口化配置和makefile文件配置;在文件夹中放入源代码,通过makeboot.bin命令一键生成boot.bin文件;则boot.bin为最终的boot引导可执行文件。

本发明还提供了一种boot引导软件执行方法,包括:

主板初始化的步骤;

操作系统引导的步骤;

内核初始化的步骤。

作为上述方法的一种改进,所述主板初始化的步骤,具体包括:

步骤201)规定栈底的值,设置栈的大小;

步骤202)系统启动初始化:初始化cpu处理器内部寄存器;初始化cpu处理器的通用性输入输出gpio、串口、外部存储器sdam、pci总线、高速缓存cache各个功能的控制寄存器;

步骤203)初始化外部存储器sdram区域,包括:sdram区域前4k空间初始化和boot软件编译地址映射的空间部分的初始化;

步骤204)利用feeddog函数进行软件喂狗;

步骤205)将源代码中标号121以及122中指令内容拷贝存放到sdram首地址处;

步骤206)利用feeddog函数进行软件喂狗;

步骤207)刷新指令cache以及数据cache;

步骤208)加载sdram首地址处的指令内容,执行boot引导软件源码拷贝,存放到boot软件外部存储器sdram映射的地址空间部分;

步骤209)初始化外部存储器sdram的其他空间。

作为上述方法的一种改进,所述操作系统引导的步骤,具体包括:

步骤210)跳转到romstart函数,依据引导方式进行操作系统映像的引导;

步骤211)若串口无输入,转入步骤212);若串口有输入,进入步骤213);

步骤212)对程序存储器中的操作系统映像进行校验和判断,校验和合法,转入步骤215);

步骤213)将串口收到的数据下载到外部存储器sdram的临时存储区;

步骤214)启动程序存储器接口;

步骤215)将程序存储器中代码拷贝到外部存储器sdram的非解压缩目标地址;

步骤216)启动操作系统解压缩模块,将代码解压缩到装载操作系统映像的目标地址处;

步骤217)跳转到装载操作系统映像的地址入口,运行操作系统映像。

作为上述方法的一种改进,所述步骤214)具体包括:

步骤214-1)程序存储器写保护关闭;

步骤214-2)选择程序存储器;

步骤214-3)擦除程序存储器信息;

步骤214-4)将sdram临时存储区接收到的数据内容写入程序存储器;

步骤214-5)计算校验打开程序存储器写保护。

作为上述方法的一种改进,所述内核初始化的步骤,具体包括:

对存储未初始化的全局变量以及静态变量的内存区域段赋值0;

初始化所有系统和缺省中断向量;

初始化与目标处理板相关的硬件;

配置vxworks内核;

初始化并启动内核,启动用户应用程序。

本发明还提供了一种boot引导软件执行系统,所述系统包括:

主板初始化模块,用于对主板进行初始化;

引导模块,用于对操作系统进行引导;

内核初始化模块,用于对内核进行初始化。

本发明的优势在于:

1、利用本发明方法设计的boot引导软件具有可重用性高,可维护性好的优点;

boot软件最大程度复用了软件构架,需求,源代码,设计,测试等构件,简化设计,提高效率,降低成本;为特定项目定制部分通过接口部分设计实现,如喂狗接口,cache接口;考虑到项目中各种需要修改的配置,提供配置接口,维护接口部分,可维护性高。

2、不同项目研发基于龙芯处理板boot软件时,研发人员不用考虑程序的内部结构和内部特性的情况下,只需要修改相关接口函数(喂狗接口,cache接口),即可完成软件的更改;

不同项目基本功能相同,区别在具体硬件的配置不同。比如喂狗信号的输出的方式不一样,有的项目采用电平喂狗,有的沿喂狗,那么喂狗的实现方式就不同,而软件中又需要插入多次喂狗操作。随之而来的问题是代码改动量大,影响域增加,错误率提高。通过增加接口的方式,在不更改源代码结构的情况下,修改接口,即可完成所有喂狗操作的修改。防止人为因素影响软件质量。

3、解决软件汇编代码中同一个宏定义函数不同地方调用编译生成的二进制指令码不一致问题;

原编译器编译器存在缺陷(软件汇编文件rominit.s中汇编代码中同一个宏定义函数不同地方调用编译生成的二进制指令码不一致),生成.bin文件不正确,本发明的方法已经完全解决了此问题。

4、利用本发明方法设计的boot引导软件可以修复龙芯1e开cache的死机问题,修复bug的方法简单、方便、易操作;

5、修复bug,实质就是改动最终二进制代码,这种方法修改量大且操作复杂,安全性、可靠性低。软件是使用工具链编译生成,通过修改工具链的方法来处理,简单易行,可操作;

6、开发编译环境的标准设计;

使用人员无需进行任何配置,使用本方案中配置好的编译环境输入命令即可生成.bin文件。

7、本发明的方法对boot引导软件进行了标准化接口设计,通过接口修改软件功能;将linux开发编译环境进行标准化配置,形成开发编译库,方便后续项目使用。

附图说明

图1为boot软件的调用结构图;

图2为本发明的boot软件执行方法的主板初始化的流程图;

图3为本发明的boot软件执行方法的操作系统引导的流程图;

图4为boot软件标准化生成方法流程图。

具体实施方式

下面结合附图和具体实施例对本发明进行详细的说明。

boot软件的生成涉及到两个部分:软件源代码生成;软件的编译生成.bin文件的过程。

针对目前软件生成过程中存在的技术缺陷状态,对运行在norflash或eeprom中的boot软件的生成进行了标准化设计,标准化设计从以下两个方面着手,软件源代码生成;软件编译生成.bin文件的过程。

一、软件源代码标准化设计方案

1、软件架构

boot引导软件由5个模块组成,如表1所示:

表1

从软件的运行结构上分,程序为一个主流程,软件调用结构如图1所示。

romstart是bootinit.c文件中的模块,通过串口接收应用程序映像,并写入相应的程序存储器中,串口无输入则启动默认的操作系统映像。

2、软件接口化

针对不同的程序存储器结构(norflash或者eeprom),串口输入输出模块(csc4)、操作系统解压缩模块(csc5)功能模块不变,直接沿用,无需操作;操作系统引导(csc2)、程序存储接口模块(csc3)配置相应存储器结构的.c数据文件即可(norflash沿用am29lv160b.c,eeprom沿用eeprom.c),差别主要体现在rominit.s的汇编文件中。软件接口化,主要针对汇编文件的修改提出的一种设计方案。不同型号任务的软件只需要修改接口即可。

龙芯1e处理板不同型号任务差别主要涉及五个方面的配置,sdram配置,cache配置,喂狗,gpio初始化设置,操作系统管理空间分配。软件修改主要涉及这几个方面,为了不影响软件整体架构,尽可能减少代码的更动,使软件结构更加清晰,软件进行了标准化封装设计,汇编语言文件(rominit.s)采用mips汇编语言中的叶子函数的设计,将boot代码中需要更动部分包装成叶子函数,后续项目如需使用,只需改动叶子函数中的内容即可,无需更动代码结构,减少了错误的发生率,减少软件开发调试工作量,大大提高软件开发效率,喂狗接口的实现方式示例见表2:

表2

feeddog叶子函数主要功能实现喂狗操作,软件中多次调用喂狗函数。

本技术方案的优势见表3:

表3

二、软件编译生成.bin环境标准化设计方案

本方案中将软件开发编译环境统称为开发编译环境库,包括linux开发环境,gcc编译器,以及工程编译配置。下面所描述的方案是最终的解决结果方案,解决了编译器缺陷以及屏蔽龙芯1ecpu打开cache死机问题,经过实践未产生问题的方案。

下面通过表4详细描述死机问题过程中遇到的各种情况:

表4

1、linux开发环境

linux虚拟机升级版本

版本号:vmware-workstation-full-12.5.7-5813279.exe

原始镜像文件和虚拟机软件构建交互式开发环境linux64位虚拟机,

构建过程略。

账号:cpu,密码:cpu

64位linux虚拟机名称:ubuntu64位

2、linux编译环境标准化配置(gcc)

gcc编译库配置方案见表5:

表5

3、工程编译标准化配置(makefile)

makefile文件中替换编译器,使用最新编译器;

修改工具链,汇编代码正常编译,c语言代码打补丁处理,将所有jr/jalr指令改成j/jal跳到一个预定义的地方。

编译c代码,cc使用选项地方添加:

-wa,-mfix-loongson2f-jump

添加选项normal_s_u

normal_s_u=${cc_u}${aflags}${cppflags}-c$<

汇编项修改

${rominit}:rominit.s

${normal_s_u}

提供的最终的标准化开发编译环境库:

系统文件库ubuntu16.10_64中ubuntu64虚拟机下的xiyinghui-zy目录,

软件相关人员只需将更新后的源代码文件替换相应文件,然后通过makeboot.bin命令一键生成boot.bin文件,简单易行。

如图2所示,本发明提供了一种boot引导软件标准化生成方法,包括:

步骤101)构建64位的linux虚拟机环境;

步骤102)配置预先测试充分的gs464核交叉编译器(版本gcc-4.8.332),配置环境变量;

步骤103)软件工程编译环境的标准化配置;

步骤104)上述步骤完成,生成了最终使用的标准化开发编译环境库:文件夹xiyinghui-zy;

步骤105)将更新后的源代码文件替换目录文件夹下相应的源代码,通过makeboot.bin命令一键生成boot.bin文件;boot.bin为最终的boot软件可执行文件。

如图3和图4所示,本发明的一种boot引导软件执行方法,包括:

步骤201)规定栈底的值,设为stack;

步骤202)系统启动;

步骤203)cpu外部初始化:a)配置gpio寄存器,初始化gpio模块;b)初始化串口initserial,pci模块;c)喂狗,feeddog模块;d)初始化sdram模块;配置sdram相关寄存器,ecc模式寄存器,flash控制器;e)初始化cache模块:cache_init,配cop_0_config,目的为设置固定的kseg0区域是否可缓存,011,非一致性可缓存;

步骤204)开始启动,清除sdram区域;

步骤205)sdram区域前4k空间初始化;

步骤206)boot软件运行空间初始化:1)软件映射空间初始化0x80fd4000~0x81000000;boot软件编译地址映射的空间部分;2)喂狗,feeddog模块

步骤207)拷贝模块汇编代码存放到sdram0x80000000:1)标号121以及122中指令内容拷贝;拷贝sdram0x80000000开始地址处;2)喂狗,feeddog模块

步骤208)刷新指令cache以及数据cache

步骤209)跳转到0x80000000处执行,执行拷贝模块:拷贝boot引导代码到0x80000000

步骤210)初始化vxworks管理的其他空间

步骤211)跳转到romstart模块,进行操作系统引导;

步骤212)若串号无输入,转入步骤213);

步骤213)对串号进行校验和判断,转入步骤216);

步骤214)下载sdram数据到sdram;

步骤215)运行程序存储器接口模块:1)程序存储器写保护关闭;2)选择程序存储器;3)擦除程序存储器信息;4)写程序存储器并计算校验和5)打开程序存储器写保护

步骤216)程序存储器中代码拷贝到sdram中并解压缩;

步骤217)操作系统解压缩模块csc4:代码解压缩到ram_low_adrs0x80100000;风河vxworks的解压缩算法;

步骤218)程序启动入口ram_low_adrs0x80100000。

最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1