CN117193872A - 一种基于符号表动态执行的芯片启动固件装置和方法 - Google Patents
一种基于符号表动态执行的芯片启动固件装置和方法 Download PDFInfo
- Publication number
- CN117193872A CN117193872A CN202311128729.2A CN202311128729A CN117193872A CN 117193872 A CN117193872 A CN 117193872A CN 202311128729 A CN202311128729 A CN 202311128729A CN 117193872 A CN117193872 A CN 117193872A
- Authority
- CN
- China
- Prior art keywords
- firmware
- symbol table
- function
- input program
- chip
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 49
- 230000004048 modification Effects 0.000 claims abstract description 37
- 238000012986 modification Methods 0.000 claims abstract description 36
- 230000006870 function Effects 0.000 claims description 293
- 230000008569 process Effects 0.000 description 19
- 238000010586 diagram Methods 0.000 description 8
- 230000008439 repair process Effects 0.000 description 7
- 230000002159 abnormal effect Effects 0.000 description 4
- 239000011800 void material Substances 0.000 description 4
- 230000009471 action Effects 0.000 description 2
- 238000013524 data verification Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000012856 packing Methods 0.000 description 2
- 238000012795 verification Methods 0.000 description 2
- 102100037114 Elongin-C Human genes 0.000 description 1
- 101001011859 Homo sapiens Elongin-A Proteins 0.000 description 1
- 101001011846 Homo sapiens Elongin-B Proteins 0.000 description 1
- 101000881731 Homo sapiens Elongin-C Proteins 0.000 description 1
- 101000836005 Homo sapiens S-phase kinase-associated protein 1 Proteins 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000009434 installation Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000008023 solidification Effects 0.000 description 1
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提供的一种基于符号表动态执行的芯片启动固件装置和方法,存储模块、读取模块、修改模块、调用模块和执行模块。其中,修改模块确定输入程序根据需求确定是否修改固件符号表,如果修改,则调用修改函数修改,并最终生成本次启动固件符号表;调用模块用于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数并执行入口函数。本发明可根据输入程序的需求,对芯片固件的符号表的函数地址进行修改,实现对芯片固件程序的修复;通过调用入口函数,实现输入程序复杂的逻辑需求。
Description
技术领域
本发明涉及芯片启动固件控制领域,尤其涉及一种基于符号表动态执行的芯片启动固件装置和方法。
背景技术
芯片启动固件(bootloader)是用于更新自身应用软件并独立运行的代码,常被用于升级产品和修复产品bug。在嵌入式系统中,芯片启动固件是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像电脑软件那样的固件程序,因此整个系统的加载启动任务就完全由芯片启动固件来完成。
目前的芯片启动固件对启动的一些后续设备配置、初始化时钟和修复芯片bug等,采用以下三种方案:
1、后级程序镜像处理:采用从外部的存储器,如flash、emmc、网络等读取后级程序镜像,由后级程序镜像处理。
2、读取配置:采用GPIO或者外部存储器的配置,来确定采用内置的配置表。
3、按照一定规则组成的数组:从外部存储器中读取一定长度的,由厂家规定好的格式数组,依次解析执行,配置到相应的寄存器中。
然而,这三种的不足在于:
1、后级程序镜像处理中,若芯片出现问题则无法提早通过程序介入,只能由后续程序处理,并且由于没有对时钟和内存之类进行初始化,运行速度慢,且外部较大的存储装置不能使用,对后续启动流程有较多要求和限制,大多数后级镜像还需要于启动固件代码中高度重复的程序代码。
2、在读取配置中,该方案只能在有限的配置里进行切换,而且由于具体配置在内部固化程序内,配置出现错误无法修改,也无法增加配置,无法应对额外出现的问题和需求,也只能交由后级程序处理。
3、按照一定规则组成的数组,只能按照规则运行,无法应对需要复杂逻辑才能实现的需求或修改,执行带规则的配置时间点因程序固化而固定,因此无法修复后续流程上出现的问题。
然而,对于第二种技术方案,现有技术中可通过修改驱动程序的方式,来更新芯片固件函数的地址以实现各种复杂的逻辑功能,这种方式是采用函数指针方式调用程序;且需要将固件扩充功能的函数编译生成驱动程序(或者按照指定的框架),扩展函数还需要通过函数指针方式调用固件里的程序;对驱动程序来说,现有技术中需要提供一个驱动模型,后续调用的函数是依照驱动模型的格式来完成调用工作,这种方式限定了驱动程序的类型及格式等,具有一定的局限性。此外,在扩充函数编译之前采用预先注册的方式将驱动程序的函数地址预先注册在入口函数表中,这种方式可能会导致固件在加载输入程序过程中出现死机的情况,会给用户带来诸多的不便。
发明内容
本发明为了克服现有技术的不足,提供了一种基于符号表动态执行的芯片启动固件装置和方法。
为了实现上述目的,本发明提供了一种基于符号表动态执行的芯片启动固件装置,包括:
存储模块,用于存储芯片中启动固件编译生成的固件符号表;
读取模块,用于读取固件符号表,获取输入程序并加载含符号表的输入程序,生成输入程序符号表;
修改模块,输入程序根据需求确定是否修改固件符号表,如果修改,则调用修改函数修改,并最终生成本次启动固件符号表;
调用模块,用于基于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数并执行入口函数;
执行模块,用于确定是否继续固件启动流程,若继续启动,则按照本次启动固件符号表执行启动流程;若不继续启动,则执行输入程序自定义流程。
优选的,固件符号表的数据包括函数名/变量名和函数地址;所述修改模块中,若需修改固件符号表,则确定修改的固件符号后将其函数地址变更为输入程序符号表中的函数地址,并生成本次启动固件符号表;若无需修改固件符合,固件符号表为本次启动固件符号表。
优选的,读取模块中的输入程序由外部存储设备加载。
优选的,输入程序的逻辑功能设置于芯片外,由芯片外部设备存储和加载,调用模块调用入口函数实现输入程序的逻辑需求的功能;所述入口函数符号为固定函数符号。
优选的,调用模块调用入口函数时,对入口函数程序镜像进行校验,对符号表进行比对。
本发明还提供了一种基于符号表动态执行的芯片启动固件的方法,包括:
S1:读取存储模块中存储的固件符号表;
S2:获取输入程序并加载含符号表的输入程序,生成输入程序符号表;
S3:输入程序根据需求确定是否修改固件符号表,如果修改,则调用修改函数修改,并最终生成本次启动固件符号表;
S4:基于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数并执行入口函数;
S5:确定是否继续固件启动流程,若继续启动,则按照本次启动固件符号表执行启动流程;若不继续启动,则执行输入程序自定义流程。
优选的,步骤固件符号表的数据包括函数名/变量名和函数地址;所述步骤S3中,若需修改固件符号表,则确定修改的固件符号后将其函数地址变更为输入程序符号表中的函数地址,并生成本次启动固件符号表;若无需修改固件符合,固件符号表为本次启动固件符号表。
优选的,步骤S2中的输入程序由外部存储器加载。
优选的,输入程序的逻辑功能设置于芯片外,由芯片外部设备存储和加载,步骤S4调用入口函数实现输入程序的逻辑需求的功能;所述入口函数为固定函数符号。
优选的,步骤S4调用入口函数时,对入口函数程序镜像进行校验和符号表进行比对。
本发明提供的一种基于符号表动态执行的芯片启动固件装置和方法的有益效果在于:
1、在固件启动阶段,通过芯片固件生成固件符号表,并根据从外部存储中读取的输入程序的配置,对固件符号表中的函数地址进行变更,进而将有异常的芯片程序或异常的固件程序,修改为输入程序配置中的程序,以实现程序修复的功能。
2、无需后级boot程序,输入程序可通过固件符号表中的函数地址直接使用固件内的函数,减少了重复代码量,减少了输入程序镜像尺寸,提高了芯片固件启动的速度。
3、在固件符号表中,若时钟、内存的初始化函数在输入程序的镜像中有配置,则可直接通过固件符号表获取正确的函数地址,并执行,这样在启动固件中就可以及时初始化时钟、内存等关键设备,在后续的启动流程中,可在更高的主频和完整的内存空间内运行。
4、本发明中还提供了用于完成输入程序逻辑需求功能的入口函数,该函数为固定的函数符号并作为输入程序镜像的总入口,固件通过调用入口函数以实现输入程序复杂的逻辑需求。另外实现输入程序复杂的逻辑需求的程序设置于芯片外,由外部设备存储和加载,避免了固件程序过于复杂导致功能出错,导致芯片固件需要反复修改的问题。同时,因输入程序复杂的逻辑需求的程序由外部设备存储和加载,因此可随意增加复杂逻辑的补丁程序、用户需求等。
附图说明
图1为本发明提供的一种基于符号表动态执行的芯片启动固件装置的结构示意图;
图2为本发明提供的一种基于符号表动态执行的芯片启动固件装置修改符号表的第一个示例图;
图3为芯片固件编译后生成的具有函数名/变量名和函数地址的文件内容;
图4为本发明提供的一种基于符号表动态执行的芯片启动固件装置的第二个示例中固件的符号表;
图5为本发明提供的一种基于符号表动态执行的芯片启动固件装置修改符号表的调用第二个示例函数的编译结果;
图6为本发明提供的一种基于符号表动态执行的芯片启动固件装置修改符号表的第二个示例中修改之后的符号表;
图7为本发明提供的一种基于符号表动态执行的芯片启动固件的方法的流程图。
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为任意的改变,且其组件布局型态也可能更为复杂。
本发明实施例中所有方向性指示(诸如上、下、左、右、前、后、横向、纵向……)仅用于解释在某一特定姿态下各部件之间的相对位置关系、运动情况等,如果该特定姿态发生改变时,则该方向性指示也相应地随之改变。
因安装误差等原因,本发明实施例中所指的平行关系可能实际为近似平行关系,垂直关系可能实际为近似垂直关系。
如图1所示,本发明提供了一种基于符号表动态执行的芯片启动固件装置,包括存储模块1、读取模块2、修改模块3、调用模块4和执行模块5。存储模块1用于存储芯片中启动固件编译生成的固件符号表。读取模块2用于读取固件符号表,获取输入程序并加载含符号表的输入程序,生成输入程序符号表。修改模块3中输入程序根据需求确定是否修改固件符号表,如果修改,则调用修改函数修改,并最终生成本次启动固件符号表。调用模块4用于基于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数。执行模块5用于确定是否继续固件启动流程,若继续启动,则按照本次启动固件符号表执行启动流程;若不继续启动,则执行输入程序自定义流程。
本实施例中,输入程序为用户程序,在启动存储模块1前,还需复位释放,对芯片上电以启动芯片,而后对芯片进行的时钟、内存等进行简单的初始化。之后读取模块2读取存储模块1中的固件符号表的数据。固件符号表的数据包括函数名/变量名和函数地址;同时读取外部输入的用户程序,并由外部存储器加载含符号表的用户程序,并生成由输入程序编译生成的输入程序符号表,其中外部存储器可以是闪存flash、嵌入式多媒体卡emmc、网络等。
存储模块1中存储的固件符号表为固定函数,即固件函数符号表中存储有一定的函数数组。固件符号表由编译器编译,其中,编译器通过执行以下命令实现:
$(compiler)-nm bootloader.elf|grep-v'\(compiled\)\|\(\.o$$\)\|\([aUw]\)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)'|LC_ALL=C sort>bootloader.sym。
其中,$(compiler)-nm为当前芯片固件的nm工具;为bootloader.elf为芯片固件编译后的elf文件;bootloader.sym为生成的芯片固件符号表。
其编译后生成如图3所示的具有函数名/变量名和函数地址的文件。芯片设计阶段,上述文件生成后,按照函数名对应一个地址的格式,将其转换成内部使用的符号表,固化在芯片内部。在芯片使用阶段,上述文件生成后,会与芯片内部的固件对比,按照用户需求或者芯片是否有bug和功能增加,通过接口修改芯片内部的符号表,从而生成新的符号表,供芯片固件和用户的输入程序一起使用。
基于输入程序符号表,修改模块3输入程序根据需求确定是否修改固件符号表,即输入程序根据需求确定芯片固件内的符号表是否满足输入程序的逻辑需求或芯片固件是否有错误程序。若芯片固件内识别到错误程序或是固件符号表不能满足输入程序的逻辑功能,需要修改时,输入程序编译后,调用修改函数将其生成的输入程序符号表中的函数地址,配置到芯片启动固件的符号表中,并最终生成本次启动固件符号表,芯片固件则会将替换的旧函数废弃而使用新编译的函数替换,进而满足输入程序的逻辑需求。需要说明的是,在修改固件符号表中的函数地址时,不会对输入程序的格式、文件类型或驱动等进行限定,用户可任意编写程序,并采用符号表动态加载模式实现自定义的逻辑功能,当输入程序需要修改逻辑功能或固件出错时,可直接替换固件符号表内的地址函数,便能实现功能修改或增加以及修复固件错误信息。此外本发明中的各种逻辑功能的函数是通过打包指定的形式完成函数调用,可避免需要通过编译或者程序指定,更灵活,且有调用过程还通过校验来确保调用的准确性,避免加载的用户程序在加载过程中出错而导致死机。
另外,相对于现有技术中需要通过函数指调用固件里的程序的方式,本发明中编译不需要固定格式,用户可以根据自身编程习惯编写代码,而且调用也无需使用函数指针,可以直接使用固件的函数,通过符号表直接访问。通过函数指针运行,需要对函数指针进行赋值,其说明示例如下:
若现有技术中,有个func2_real函数,地址是addr2,写成代码大致如下:
typedef void(*func2_t)(void);
func2_t func2;
func2=(func2_t)addr2;
func2();
通过上述代码,函数指针就调到了func2_real这个函数。而本实施例中采用符号表的方法,只需要直接使用func2_real();便能实现函数的调用。相对于现有技术来说,本方案简化了输入程序的程序代码,为用户提供了便利,节约了用户调用输入程序的各逻辑功能函数地址的时间。
如图2所示,存储模块1中存储的固定固件符号为就符号表,修改后生成的本次启动固件符号表为新符号表,新旧符号表的修改过程为:新旧符号修改过程中,函数名/变量名不改变,仅对符号表中的函数地址进行修改,例如:将固件符号表中函数func_b的函数地址0x00020000函数符号根据输入程序配置,修改为函数名为func_b,函数地址为0x20000000的函数符号,而其余函数,如函数名为func_a及其函数地址均保留在新符号表中。修改后的新符号表,无论是固件还是用户的输入程序,在调用函数func_b时均是访问0x20000000的函数地址;固件中旧符号表中的函数地址0x00020000的程序则被废弃,将就函数废弃是指就函数依旧保留在固件函数中,只是当输入程序运行时直接运行新函数。通过这种方式实现了对芯片固件错误程序的修复。同时通过对固件函数符号表中函数地址的动态修改,简化了芯片固件的程序,输入程序可任意增加逻辑功能的函数,在简单的和复杂的逻辑程序上均适用,提高了芯片固件的通用性。
为了更详细的说明本实施例中修改固件函数的实现方式,其修改原理如下:如图4所述,芯片内启动固件后开始运行固件符号表,其中固件符号表中包括函数变量名为cancel lib by_user,其函数地址为0x00000696,输入程序(即用户程序)使用固件符号表时,直接调用cancel lib by_user,输入程序编译时编译器则会连接到0x696这个地址,十进制则为2026这个地址,其连接到2026这个地址的关系图如图5所示。若cancel lib by_user这个函数有问题需要修改时,用户程序新编写一个同名函数后,会生成一个新的地址,如0x02201234这个地址,并生成新的符号表,如图6所示,修改后的符号表作为本次启动固件符号表。启动固件里的符号表相关程序,会将原先调用的函数的指令全部从0x696这个值修改成0x02201234,进而实现函数地址的动态修改。
若芯片固件内的符号表支持输入程序的逻辑功能或无需修复芯片固件的情况下,即固件符号表中固定的函数满足输入程序的逻辑功能,可直接通过芯片固件符号表获取正确的函数地址,生成本次启动固件符号表,并执行函数地址对应的程序,此时芯片固件符号表为本次启动固件符号表。另外,无论是否修改符号表,若时钟、内存的初始化函数在输入程序的镜像(即用户镜像)中有配置,则可直接通过固件符号表获取正确的函数地址,并执行,这样在启动固件过程中就便能及时初始化时钟、内存等关键设备,使芯片固件在后续的启动流程中,可在更高的主频和完整的内存空间内运行,同时输入程序还可以通过直接调用芯片固件中的函数,可节约用户重新编写相同逻辑功能程序的时间,为用户提供了便利,减少了重复代码量,也加快了芯片固件启动的时间。
在一些实施例中,还可以采用其他方式修改芯片固件中的程序,如以数组的方式;函数指针方式,包括结构体内的函数指针定义;以二进制保存在ROM或者RAM的方式;以动态库、函数列表、函数指针、钩子(Hook)、回调函数等将方式替换本实施例中的符号表,上述方式均是通过替换函数地址的方式,来完成固件程序的修改。除上述描述的修改方式外,还可以是其他的通过修改函数地址来完成程序修改的方式,本实施例再次不做限定。
修改模块3将芯片固件中的错误或需要代替的函数地址修改完成后,生成修改后的本次启动固件符号表。基于本次启动固件符号表,调用模块4调用完成输入程序逻辑功能的入口函数,并执行入口函数。其中,入口函数为固定的函数符号,调用模块4调用该函数符号作为用户程序镜像的总入口,用户可根据需要编写若干子函数,实现输入程序的各种需求,如编写复杂的时钟、内存初始化流程或者其他功能需求。然而该若干子函数均集成于芯片外,由外部设备存储和加载,避免了固件程序过于复杂导致功能出错,导致芯片固件需要反复修改的问题。同时,因输入程序复杂的逻辑需求的程序由外部设备存储和加载,因此可随意增加复杂逻辑的补丁程序、用户需求等,且输入程序则可以少量的代码量完成复杂的逻辑功能,而外部存储器加载代码时,提高了加载速度,同时也减少了重复代码的数量。
调用模块4执行入口函数后,通过执行模块5确定后续流程是否继续固件启动流程,若继续,则继续按照本次启动固件符号表执行启动流程;若不继续启动,则按照输入程序中自定义流程启动固件程序,以满足用户的需求。解决了现有技术中对芯片初始化之后启动流程的限制和要求。同时也解决了现有技术中后续启动流程中固件程序高度重复的程序,加快了芯片固件启动速度,提高了启动效率。
本实施例中,调用模块4调用入口函数时,为了保证入口函数程序镜像的数据完整以及符号表版本匹配,会对入口函数程序镜像进行数据校验以及符号表的散列函数hash比对,校验或者比对有任意一个或者两个失败,则放弃调用入口函数。校验和比对都正确后,从入口程序镜像的头部信息配置中读取入口函数的函数地址,并调用此地址的入口函数。其中,比对的符号表为输入程序符号表和芯片中存储的固件符号表。
如图7所示,本发明还提供了一种基于符号表动态执行的芯片启动固件的方法,包括:
S1:读取存储模块中存储的固件符号表。
步骤1还包括以下步骤:
S1.1:复位释放、芯片启动;
S1.2:简单初始化
具体的,复位释放对芯片上电以启动芯片,而后对芯片进行的时钟、内存等进行简单的初始化。之后读取存储模块1中的固件符号表的数据。
芯片中存储模块1存储的固件符号表由以下步骤完成:
SI:芯片启动固件编译;
SII:生成固件符号表;
SIII:固化到芯片中。
其中,步骤SI中,固件符号表为固定函数,即固件函数符号表中存储有一定的函数数组,固件符号表采用编译器对芯片固件进行编译,而编译器通过执行以下命令生成固件符号表:
$(compiler)-nm bootloader.elf|grep-v'\(compiled\)\|\(\.o$$\)\|\([aUw]\)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)'|LC_ALL=C sort>bootloader.sym。
其中,$(compiler)-nm为当前芯片固件的nm工具;为bootloader.elf为芯片固件编译后的elf文件;bootloader.sym为生成的芯片固件符号表。
其编译后生成如图3所示的具有函数名/变量名和函数地址的文件。芯片设计阶段,上述文件生成后,按照函数名对应一个地址的格式,将其转换成内部使用的符号表,固化在芯片内部。在芯片使用阶段,上述文件生成后,会与芯片内部的固件对比,按照用户需求或者芯片是否有bug和功能增加,通过接口修改芯片内部的符号表,从而生成新的符号表,供芯片固件和用户的输入程序一起使用。
S2:读取固件符号表,获取输入程序并加载含符号表的输入程序,生成输入程序符号表。
具体的,固件符号表生成后,读取固件内的符号表,同时读取外部输入的用户程序由外部存储器加载含符号表的用户程序,并生成由输入程序编译生成的输入程序符号表,其中外部存储器可以是闪存flash、嵌入式多媒体卡emmc、网络等。其中,输入程序为用户程序,固件符号表的数据包括函数名/变量名和函数地址。
S3:输入程序根据需求确定是否修改固件符号表,如果修改,则调用修改函数修改,并最终生成本次启动固件符号表。
具体的,输入程序根据需求确定是否修改固件符号表,即输入程序根据需求确定芯片固件内的符号表是否满足输入程序的逻辑需求或芯片固件是否有错误程序。若芯片固件内识别到错误程序或是固件符号表不能满足输入程序的逻辑功能,需要修改时,输入程序编译后,调用修改函数将其生成的输入程序符号表中的函数地址,配置到芯片启动固件的符号表中,并最终生成本次启动固件符号表,芯片固件则会将替换的旧函数废弃而使用新编译的函数替换,进而满足输入程序的逻辑需求。需要说明的是,在修改固件符号表中的函数地址时,不会对输入程序的格式、文件类型或驱动等进行限定,用户可任意编写程序,并采用符号表动态加载模式实现自定义的逻辑功能,当输入程序需要修改逻辑功能或固件出错时,可直接替换固件符号表内的地址函数,便能实现功能修改或增加以及修复固件错误信息。此外本发明中的各种逻辑功能的函数是通过打包指定的形式完成函数调用,可避免需要通过编译或者程序指定,更灵活,且有调用过程还通过校验来确保调用的准确性,避免加载的用户程序在加载过程中出错而导致死机。
另外,相对于现有技术中需要通过函数指针调用固件里的程序的方式,本发明中编译不需要固定格式,用户可以根据自身编程习惯编写代码,而且调用也无需使用函数指针,可以直接使用固件的函数,通过符号表直接访问。通过函数指针运行,需要对函数指针进行赋值,其说明示例如下:
若现有技术中,有个func2_real函数,地址是addr2,写成代码大致如下:
typedef void(*func2_t)(void);
func2_t func2;
func2=(func2_t)addr2;
func2();
通过上述代码,函数指针就调到了func2_real这个函数。而本实施例中采用符号表的方法,只需要直接使用func2_real();便能实现函数的调用。相对于现有技术来说,本方案简化了输入程序的程序代码,为用户提供了便利,节约了用户调用输入程序的各逻辑功能函数地址的时间。
例如图2所示,步骤1中存储的固定固件符号为就符号表,修改后生成的本次启动固件符号表为新符号表,新旧符号表的修改过程为:新旧符号修改过程中,函数名/变量名不改变,仅对符号表中的函数地址进行修改,例如:将固件符号表中函数func_b的函数地址0x00020000函数符号根据输入程序配置,修改为函数名为func_b,函数地址为0x20000000的函数符号,而其余函数,如函数名为func_a及其函数地址均保留在输入程序符号表中。修改后的输入程序符号表,不论是固件还是用户的输入程序调用函数func_b时均是访问0x20000000的函数地址;芯片固件中旧符号表中被替换的函数地址0x00020000的程序则被废弃,将就函数废弃是指就函数依旧保留在固件函数中,只是当输入程序运行时直接运行新函数。通过这种方式实现了对芯片固件错误程序的修复。同时通过对固件函数符号表中函数地址的动态修改,简化了芯片固件的程序,输入程序可任意增加逻辑功能的函数,在简单的和复杂的逻辑程序上均适用,提高了芯片固件的通用性。
为了更详细的说明本实施例中修改固件函数的实现方式,其修改原理如下:如图4所述,芯片内启动固件后开始运行固件符号表,其中固件符号表中包括函数变量名为cancel lib by_user,其函数地址为0x00000696,输入程序(即用户程序)使用固件符号表时,直接调用cancel lib by_user,输入程序编译时编译器则会连接到0x696这个地址,十进制则为2026这个地址,其连接到2026这个地址的关系图如图5所示。若cancel lib by_user这个函数有问题需要修改时,用户程序新编写一个同名函数后,会生成一个新的地址,如0x02201234这个地址,并生成新的符号表,如图6所示,修改后的符号表作为本次启动固件符号表。启动固件里的符号表相关程序,会将原先调用的函数的指令全部从0x696这个值修改成0x02201234,进而实现函数地址的动态修改。
若芯片固件内的符号表支持输入程序的逻辑功能或无需修复芯片固件的情况下,即固件符号表中固定的函数满足输入程序的逻辑功能,可直接通过芯片固件符号表获取正确的函数地址,生成本次启动固件符号表,并执行函数地址对应的程序,此时芯片固件符号表为本次启动固件符号表。其中,无论是否修改符号表,若时钟、内存的初始化函数在输入程序的镜像(即用户镜像)中有配置,则可直接通过固件符号表获取正确的函数地址,并执行,这样在启动固件过程中就便能及时初始化时钟、内存等关键设备,使芯片固件在后续的启动流程中,可在更高的主频和完整的内存空间内运行,同时输入程序还可以通过直接调用芯片固件中的函数,可节约用户重新编写相同逻辑功能程序的时间,为用户提供了便利,减少了重复代码量,也加快了芯片固件启动的时间。
在一些实施例中,还可以采用其他方式修改芯片固件中的程序,如以数组的方式;函数指针方式,包括结构体内的函数指针定义;以二进制保存在ROM或者RAM的方式;以动态库、函数列表、函数指针、钩子(Hook)、回调函数等将方式替换本实施例中的符号表,上述方式均是通过替换函数地址的方式,来完成固件程序的修改。处上述描述的修改方式外,还可以是其他通过修改函数地址来完成程序的方式,本实施例再次不做限定。
S4:基于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数并执行入口函数;
具体的,芯片固件中的错误或需要代替的函数地址修改完成后,生成修改后的本次启动固件符号表。基于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数,并执行入口函数。其中,入口函数为固定的函数符号,调用该函数符号作为用户程序镜像的总入口,用户可根据需要编写若干子函数,实现输入程序的各种需求,如编写复杂的时钟、内存初始化流程或者其他功能需求。然而该若干子函数均集成于芯片外,由外部设备存储和加载,避免了固件程序过于复杂导致功能出错,导致芯片固件需要反复修改的问题。同时,因输入程序复杂的逻辑需求的程序由外部设备存储和加载,因此可随意增加复杂逻辑的补丁程序、用户需求等,且输入程序则可以少量的代码量完成复杂的逻辑功能,而外部存储器加载代码时,提高了加载速度,同时也减少了重复代码的数量。
S5:确定是否继续固件启动流程,若继续启动,则按照本次启动固件符号表执行启动流程;若不继续启动,则执行输入程序自定义流程。
具体的,执行入口函数后,确定后续流程是否继续固件启动流程,若继续,则继续按照本次启动固件符号表执行启动流程;若不继续启动,则按照输入程序中自定义流程启动固件程序,以满足用户的需求。解决了现有技术中对芯片初始化之后启动流程的限制和要求。同时也解决了现有技术中后续启动流程中固件程序高度重复的程序,加快了芯片固件启动速度,提高了启动效率。
本实施例中,步骤S4调用入口函数时,为了保证入口函数程序镜像的数据完整以及符号表版本匹配,会对入口函数程序镜像进行数据校验以及本次启动固件符号表的散列函数hash比对,校验或者比对有任意一个或者两个失败,则放弃调用入口函数。校验和比对都正确后,从入口程序镜像的头部信息配置中读取入口函数的函数地址,并调用此地址的入口函数。其中,比对的符号表为输入程序符号表和芯片中存储的固件符号表。
综上所述,本发明提供的一种基于符号表动态执行的芯片启动固件装置和方法,在固件启动阶段,通过芯片固件生成固件符号表,并根据从外部存储中读取的输入程序的配置,对固件符号表中的函数地址进行变更,进而将有异常的芯片程序或异常的固件程序,修改为输入程序配置中的程序,以实现程序修复的功能。本发明无需后级boot程序,输入程序可通过固件符号表中的函数地址直接使用固件内的函数,减少了重复代码量,减少了输入程序镜像尺寸,提高了芯片固件启动的速度。在固件符号表中,若时钟、内存的初始化函数在输入程序的镜像中有配置,则可直接通过固件符号表获取正确的函数地址,并执行,这样在启动固件中就可以及时初始化时钟、内存等关键设备,在后续的启动流程中,可在更高的主频和完整的内存空间内运行。本发明中还提供了用于完成输入程序逻辑需求功能的入口函数,该函数为固定的函数符号并作为输入程序镜像的总入口,固件通过调用入口函数,实现输入程序复杂的逻辑需求。另外实现输入程序复杂的逻辑需求的程序设置于芯片外,由外部设备存储和加载,避免了固件程序过于复杂导致功能出错,导致芯片固件需要反复修改的问题。同时,因输入程序复杂的逻辑需求的程序由外部设备存储和加载,因此可随意增加复杂逻辑的补丁程序、用户需求等。
显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
Claims (10)
1.一种基于符号表动态执行的芯片启动固件装置,其特征在于,包括:
存储模块,用于存储芯片中启动固件编译生成的固件符号表;
读取模块,用于读取固件符号表,获取输入程序并加载含符号表的输入程序,生成输入程序符号表;
修改模块,输入程序根据需求确定是否修改固件符号表,如果修改,则调用修改函数修改,并最终生成本次启动固件符号表;
调用模块,用于基于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数并执行入口函数;
执行模块,用于确定是否继续固件启动流程,若继续启动,则按照本次启动固件符号表执行启动流程;若不继续启动,则执行输入程序自定义流程。
2.根据权利要求1所述的基于符号表动态执行的芯片启动固件装置,其特征在于,所述固件符号表的数据包括函数名/变量名和函数地址;在所述修改模块中,若需修改固件符号表,则确定修改的固件符号后将其函数地址变更为输入程序符号表中的函数地址,并生成本次启动固件符号表;若无需修改固件符合,固件符号表为本次启动固件符号表。
3.根据权利要求1所述的基于符号表动态执行的芯片启动固件装置,其特征在于,所述读取模块中的输入程序由外部存储设备加载。
4.根据权利要求3所述的基于符号表动态执行的芯片启动固件装置,其特征在于,所述输入程序的逻辑功能设置于芯片外,由芯片外部设备存储和加载,调用模块调用入口函数实现输入程序的逻辑需求的功能;所述入口函数符号为固定函数符号。
5.根据权利要求4所述的基于符号表动态执行的芯片启动固件装置,其特征在于,所述调用模块调用入口函数时,对入口函数程序镜像进行校验,对符号表进行比对。
6.一种基于符号表动态执行的芯片启动固件的方法,其特征在于,包括:
S1:读取存储模块中存储的固件符号表;
S2:获取输入程序并加载含符号表的输入程序,生成输入程序符号表;
S3:输入程序根据需求确定是否修改固件符号表,如果修改,则调用修改函数修改,并最终生成本次启动固件符号表;
S4:基于本次启动固件符号表,调用完成输入程序逻辑功能的入口函数并执行入口函数;
S5:确定是否继续固件启动流程,若继续启动,按照本次启动固件符号表执行启动流程;若不继续启动,执行输入程序自定义流程。
7.根据权利要求6所述的基于符号表动态执行的芯片启动固件的方法,其特征在于,所述步骤固件符号表的数据包括函数名/变量名和函数地址;所述步骤S3中,若需修改固件符号表,则确定修改的固件符号后将其函数地址变更为输入程序符号表中的函数地址,并生成本次启动固件符号表;若无需修改固件符合,固件符号表为本次启动固件符号表。
8.根据权利要求7所述的基于符号表动态执行的芯片启动固件的方法,其特征在于,所述步骤S2中的输入程序由外部存储器加载。
9.根据权利要求8所述的基于符号表动态执行的芯片启动固件的方法,其特征在于,输入程序的逻辑功能设置于芯片外,由芯片外部设备存储和加载,步骤S4调用入口函数实现输入程序的逻辑需求的功能;所述入口函数为固定函数符号。
10.根据权利要求9所述基于符号表动态执行的芯片启动固件的方法,其特征在于,所述步骤S4调用入口函数时,对入口函数程序镜像进行校验,对符号表进行比对。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2023110932552 | 2023-08-28 | ||
CN202311093255 | 2023-08-28 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117193872A true CN117193872A (zh) | 2023-12-08 |
Family
ID=89002781
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311128729.2A Pending CN117193872A (zh) | 2023-08-28 | 2023-09-01 | 一种基于符号表动态执行的芯片启动固件装置和方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117193872A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117435258A (zh) * | 2023-12-18 | 2024-01-23 | 美智纵横科技有限责任公司 | 系统加载方法及装置、存储介质、计算机程序产品和芯片 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102147743A (zh) * | 2011-03-28 | 2011-08-10 | 博视联(苏州)信息科技有限公司 | 加快嵌入式系统应用程序启动速度的方法 |
CN103294457A (zh) * | 2012-02-27 | 2013-09-11 | 百度在线网络技术(北京)有限公司 | 动态替换主程序中c/c++函数的方法及装置 |
US20160124733A1 (en) * | 2014-10-30 | 2016-05-05 | International Business Machines Corporation | Rewriting symbol address initialization sequences |
-
2023
- 2023-09-01 CN CN202311128729.2A patent/CN117193872A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102147743A (zh) * | 2011-03-28 | 2011-08-10 | 博视联(苏州)信息科技有限公司 | 加快嵌入式系统应用程序启动速度的方法 |
CN103294457A (zh) * | 2012-02-27 | 2013-09-11 | 百度在线网络技术(北京)有限公司 | 动态替换主程序中c/c++函数的方法及装置 |
US20160124733A1 (en) * | 2014-10-30 | 2016-05-05 | International Business Machines Corporation | Rewriting symbol address initialization sequences |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117435258A (zh) * | 2023-12-18 | 2024-01-23 | 美智纵横科技有限责任公司 | 系统加载方法及装置、存储介质、计算机程序产品和芯片 |
CN117435258B (zh) * | 2023-12-18 | 2024-03-08 | 美智纵横科技有限责任公司 | 系统加载方法及装置、存储介质、计算机程序产品和芯片 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10282195B2 (en) | Generating and applying patches to computer program code concurrently with its execution | |
JP2006092544A (ja) | プリオペレーティングシステム環境におけるモジュールの動的リンク | |
JPH0836488A (ja) | ダイナミック・パッチングを使用するランタイム・エラー・チェック方法と装置 | |
US20070101115A1 (en) | Information processing device, bios processing method and program | |
CN111666210A (zh) | 一种芯片验证方法及装置 | |
CN117193872A (zh) | 一种基于符号表动态执行的芯片启动固件装置和方法 | |
US7676774B2 (en) | System LSI verification system and system LSI verification method | |
CN112130926A (zh) | 应用程序运行的方法、装置、终端设备及存储介质 | |
US10452364B2 (en) | Method and system for preparing code to be executed by programmable control devices | |
US20210132959A1 (en) | Bootstrapping frameworks from a generated static initialization method for faster booting | |
US7640421B1 (en) | Method and system for determining context switch state | |
US20070300054A1 (en) | Universal BSP tool for porting on embedded systems and an application thereof | |
US8276132B1 (en) | System and method for representing and managing a multi-architecture co-processor application program | |
CN110489167B (zh) | 双内核码流下载方法、装置、计算机设备及存储介质 | |
CN114047952B (zh) | 用于单片机的处理器、方法、单片机和存储介质 | |
CN113342389B (zh) | 一种服务的更新方法、装置及计算机可读存储介质 | |
CN111984329B (zh) | 一种boot引导软件标准化生成、执行方法及系统 | |
CN112463262A (zh) | 一种安卓系统gps模块自适应方法及终端 | |
US8347310B1 (en) | System and method for representing and managing a multi-architecure co-processor application program | |
JP4998861B2 (ja) | コンピュータシステム及びそのhw抽象化方法 | |
US11520597B2 (en) | Operating system architecture for microkernel generations support | |
US11249733B2 (en) | Electronic apparatus and control method thereof | |
US20240168732A1 (en) | Method for generating driver package, method for deploying driver, electronic device, and computer readable storage medium | |
CN115113916A (zh) | 一种Linux内核解耦方法、装置及可读存储介质 | |
KR100321999B1 (ko) | 스크립트를이용한프로그램패치방법 |
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 |