一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种ROM中固化数据的访问方法、装置、芯片和存储介质与流程

2023-02-01 20:59:38 来源:中国专利 TAG:

一种rom中固化数据的访问方法、装置、芯片和存储介质
技术领域
1.本技术涉及芯片技术领域,尤其涉及一种rom中固化数据的访问方法、装置、芯片和存储介质。


背景技术:

2.对于芯片类产品,同样大小的存储空间,只读存储器(rom)的成本要大大小于随机存取存储器(ram)。因此,让代码尽可能在rom上运行,以减小对芯片上ram资源的需求,对于芯片的成本降低具有重要意义。
3.对于芯片而言,一旦流片(tape-out),芯片中rom中存储的内容无法再修改。因此,如果rom内容出现问题,而没有有效的修复手段,必然造成大量rom资源的浪费,严重影响芯片的成本和性能。
4.因此,如何固化及访问rom中的数据,以达到高效访问的同时,又具备必要、安全的修复手段的目标,是芯片技术领域的重要研究改进方向。


技术实现要素:

5.本公开实施例提供一种rom中固化数据的访问方法、装置、芯片和存储介质,针对不同类型的固化函数,确定相应的访问方法,充分适应不同类型固化函数的特点,以使得在需要进行rom固化数据修复的情况下,能够实施不同的打补丁方案,满足芯片开发应用需求,确保进行安全有效的数据修复。
6.本公开实施例提供一种rom中固化数据的访问方法,包括:
7.获取芯片中只读存储器rom中固化函数的访问方式;
8.根据所述访问方式,访问所述固化函数对应在所述rom中的原始代码或固件中的升级后代码;
9.其中,所述访问方式包括:直接函数调用或函数回调;
10.所述访问方式根据所述rom中固化函数的类型确定;
11.所述固化函数至少包括以下类型之一:库函数、简单函数和第三类型函数;
12.所述简单函数包括:不被其他固化函数调用,也不调用其它函数的非库函数;所述第三类型函数包括:既不是库函数,也不是简单函数的函数。
13.本公开实施例还提供一种rom中固化数据的访问装置,包括:
14.访问方式获取模块,设置为获取芯片中只读存储器rom中固化函数的访问方式;
15.访问模块,设置为根据所述访问方式,访问所述rom中的原始代码或固件中的升级后代码;
16.其中,所述访问方式包括:直接函数调用或函数回调;
17.所述访问方式根据所述rom中固化函数的类型确定;
18.所述固化函数至少包括以下类型之一:库函数、简单函数和第三类型函数;
19.所述简单函数包括:不被其他固化函数调用,也不调用其它函数的非库函数;所述
第三类型函数包括:既不是库函数,也不是简单函数的函数。
20.本公开实施例还提供一种芯片,包括处理器和存储器,所述存储器用于存储一组计算机程序,所述处理器用于调用所述计算机程序,以实现如本公开任一实施例所述的rom中固化数据的访问方法。
21.本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本公开任一实施例所述的rom中固化数据的访问方法。
22.在阅读并理解了附图和详细描述后,可以明白其他方面。
附图说明
23.为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图示出的结构获得其他的附图。
24.图1是本公开实施例提供的一种rom中固化数据的访问方法的流程图;
25.图2(a)-图2(b)是本公开实施例提供的一种函数回调表示意图;
26.图3是本公开实施例提供的一种函数回调使用方式意图;
27.图4是本公开实施例提供的一种rom中固化数据的访问装置结构图;
28.图5是本公开实施例提供的一种芯片的结构示意图;
29.图6是本公开实施例提供的另一种芯片的结构示意图。
30.本公开目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
31.下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开的一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
32.需要说明,在本公开中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本公开的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
33.另外,本公开各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本公开要求的保护范围之内。
34.通常来说,一旦芯片流片成功(taped-out),rom中存储的内容就无法修改。如果相对rom里的代码进行性能调优或bug修复,就必须用新代码替换rom中老的代码,这就是一般所说的rom打补丁(rom patching)。
35.本公开实施例提供一种rom中固化数据的访问方案,采用直接函数调用方式访问rom中的固化函数或采用直接访问rom的方式获取rom中的配置参数或常用字符串,包括:
36.将rom中存储的符号及其地址写入链接脚本里;
37.链接器根据所述链接脚本生成可执行文件;
38.其中所述符号包括以下至少一种:函数、常数和字符串。
39.需要说明的是,链接脚本描述了要链接的文件,以及链接顺序、链接首地址。链接器根据链接脚本将目标文件的代码段、数据段以及符号表等内容搜集起来并按照elf或者exe等格式组合成一个可执行的二进制文件。链接脚本的作用是将输入文件的段按照指定的地址空间布局合并到输出文件段中。
40.通过将rom中的符号及其地址写入链接脚本,使得链接后的程序代码可以使用rom中存储的符号,例如可以调用rom中的固化函数、获取配置参数或设定字符串。在这种访问方式下,一旦发现问题,可以通过删除链接脚本中对应符号,并在固件新版本中更新该符号对应的内容,可以达到给rom打补丁的目的。
41.研究发现,这种直接调用或直接访问方式下,如果rom中的函数嵌套调用,或者rom中函数调用了rom外部的函数,难以实现只对出现问题的函数进行打补丁。但是,总体实现机制较为简单,利用已有的链接机制即可实现rom中固化数据访问和对rom中固化数据的打补丁。
42.本公开实施例还提供一种rom中固化数据的访问方案,采用函数回调的方式访问rom中固化的函数,包括:
43.根据回调函数表,查找被访问函数的入口地址;
44.根据入口地址访问所述rom中的固化函数;
45.其中,rom中每一个函数的入口地址分别保存在函数回调表中的固定位置;各入口地址在链接各函数时由链接器生成。
46.一些示例性实施例中,应用启动后回调函数表加载到内存中。
47.可以看到,该方式下rom中的函数入口地址都放入函数回调表中,凡是使用rom中函数都需要通过查表获取入口地址,再访问对应的函数。在这种访问方式下,一旦发现问题,可以通过修改函数回调表中的函数入口地址,使用新的函数入口地址替换旧的入口地址,可以达到给rom打补丁的目的。新的函数入口地址指向更新后的函数。
48.研究发现,这种函数回调方式下,需要在芯片中实现该回调机制,同时必须保证函数回调表的安全性。对于逻辑功能复杂、调用关系较为复杂的函数能够有效实现打补丁。
49.本公开实施例还提供一种rom中固化数据的访问方法,如图1所示,包括:
50.步骤110,获取芯片中只读存储器rom中固化函数的访问方式;
51.步骤120,根据所述访问方式,访问所述固化函数对应在所述rom中的原始代码或固件中的升级后代码;
52.其中,访问方式包括:直接函数调用或函数回调;
53.访问方式根据所述rom中固化函数的类型确定;
54.固化函数的类型至少包括以下类型之一:库函数、简单函数和第三类型函数;
55.简单函数包括:不被其他固化函数调用,也不调用其它函数的非库函数;第三类型函数包括:既不是库函数,也不是简单函数的函数。
56.也就是说,所述第三类型函数包括:被其他固化函数调用或者调用其它函数的非库函数;所述简单函数包括:既不是库函数,也不是第三类型函数的函数。
57.可以理解,全部函数被分为三类:库函数、简单函数和第三类型函数,简单函数和
第三类型函数为非库函数。部分函数固化在rom上,称为固化函数。
58.一些示例性实施例中,在固化函数的类型为库函数或简单函数的情况下,访问方式为直接函数调用。
59.一些示例性实施例中,在固化函数的类型为第三类型函数的情况下,访问方式为函数回调。
60.一些示例性实施例中,在固化函数的类型为库函数或简单函数的情况下,访问方式为直接函数调用;在固化函数的类型为第三类型函数的情况下,访问方式为函数回调。
61.需要说明的是,本公开实施例中“固化函数”指代最初固化在rom中的函数,与升级后保存在固件中函数为同一函数,因此,在代码升级后的相关访问方案中也指代固件中的升级后函数。
62.可以理解,在相关软件实现中,一般将相对稳定、基础设施层面的函数采用函数库方式提供给其他函数调用,相比于业务功能层面的函数,需要升级或打补丁的可能性更低,因此,对于该类函数,采用直接函数调用方式进行rom中固化函数的访问,可以充分利用直接函数调用方式的高效性优点。简单函数,不被其他固化函数调用,也不调用其它函数的非库函数,相比之下独立性较强,对于此类函数,采用接函数调用方式进行rom中固化函数的访问,可以充分利用直接函数调用方式的高效性优点。
63.而对于第三类型函数,其既不是相对稳定的库函数,也不是与函数外部因素关联较少、独立的简单函数,一般是实现复杂业务功能或复杂业务逻辑的函数;对于此类函数,采用函数回调方式进行访问,无需考虑函数实现中涉及的各种外部关联,灵活地实现以函数为基本单元进行打补丁。
64.根据本公开实施例提供的rom中固化数据访问方案,根据固化数据的类型,采用对应的访问方式,可以充分利用不同访问方式的优点,在打补丁和不打补丁的情况下,能提供整体性能最优的rom数据固化及访问方案。
65.一些示例性实施例中,在固化函数的类型为库函数的情况下,rom中固化数据的访问方法还包括:
66.库函数用到的全局变量在芯片进行初始化时加载到随机动态存储器dram的固定区域;
67.其中,固定区域不允许在芯片运行中被来自固件的代码改变用途。
68.可以理解,rom中的库函数用到的全局变量在芯片初始化时加载到dram的固定区域,而固件代码不能在该固定区域定义新的内容,即固件代码不能改变这块内存的用途。基于此,可以确保部分库函数的升级,并不影响其他未升级库函数的调用,以实现最小范围的库函数升级。
69.一些示例性实施例中,库函数包括libc、libm、libgcc等函数库提供的库函数。需要说明的是,库函数不限于本公开所示例的方面,根据芯片或应用需要确定即可。
70.一些示例性实施例中,在访问方式为直接函数调用的情况下,访问所述固化函数对应在所述rom中的原始代码或固件中的升级后代码,包括:
71.在链接文件包括所述库函数或所述简单函数的链接信息的情况下,链接所述rom中库函数或简单函数的原始代码,生成可执行文件;
72.和/或,
73.在链接文件不包括库函数或简单函数的链接信息的情况下,链接所述固件中库函数或的简单函数的升级后代码,生成可执行文件。
74.需要说明的是,链接文件包括库函数或简单函数的链接信息,表示库函数或简单函数的链接信息在链接文件中生效,影响链接结果。链接文件不包括库函数或简单函数的链接信息,可以是删除了其链接信息,或者,是注释掉其链接信息。
75.可以理解,在无需打补丁的情况下,对于库函数或简单函数,在链接脚本中对应写入了所述库函数或简单函数的链接信息,包括函数名和对应在rom中的地址,根据该链接脚本进行链接所生成的可执行文件调用的是rom中对应地址的库函数或简单函数的原始代码;而在需要打补丁的情况下,在固件中保存所述库函数或所述简单函数的升级后代码,并将链接脚本中对应库函数或简单函数的链接信息删除,根据删除了相关内容的链接脚本再次链接生成的可执行文件不再调用rom中的所述库函数或简单函数的原始代码,而是调用固件中的所述库函数或简单函数的升级后的代码。
76.可以知晓,根据链接脚本生成可执行文件的过程,是编译工具链中链接器提供的基本功能。例如,链接脚本中包括如下一行:
[0077]“provide(mempcpy=0x000003d0);”[0078]
它表示mempcpy函数符号rom中的地址在0x000003d0,生成可执行文件时就会直接使用这个地址的mempcpy函数。
[0079]
在mempcpy升级后,新的mempcpy函数代码存储在固件中,则删除(或注释掉)链接脚本中该行,则连接器在生成可执行文件时就不知道这个地址有什么内容了,只能在固件中寻找这个mempcpy函数,即生成可执行文件时就会使用固件中升级后的mempcpy函数。
[0080]
可以知晓,各符号(函数、参数或字符串)对应在rom中的地址在进行rom固化前,可根据整体代码编译链接结果确定。
[0081]
一些示例性实施例中,在所述访问方式为函数回调的情况下,所述访问所述固化函数对应在所述rom中的原始代码或固件中的升级后代码,包括:
[0082]
从函数回调表中获取所述第三类型函数的入口地址,以所述入口地址作为回调地址链接所述rom中的原始代码或固件中存储的升级后代码,生成可执行文件;
[0083]
其中,所述函数回调表记载所述第三类函数的原始代码在rom中的入口地址或者记载所述第三类函数的升级后代码在固件中的入口地址。
[0084]
可以理解,对于第三类型函数,在无需打补丁的情况下,函数回调表中记载的是rom上的原始代码的入口地址;在需要打补丁的情况下,函数回调表中记载的是固件上升级后代码的入口地址。根据函数回调表中的回调地址,采用回调机制访问该入口地址,以实现对相应函数的调用。
[0085]
可以知晓,函数回调机制是将函数作为参数传递并被调用的机制,多以函数指针/函数入口地址的方式实现。
[0086]
一些可实现的函数回调方案,如图2(a)所示,在头文件chip_rom.h中定义函数回调表格式;如图2(b)所示设置函数回调表默认值和存放位置,其中,第20行指定函数回调表在链接时保存在哪个段里,即间接指定了存放位置,第24~28行指定函数回调表的初始值,具体值在固化rom前编译链接这些函数时由链接器生成。
[0087]
这些固化函数的使用过程中,在所有调用这个固化函数的地方(固化区和非固化
区)都必须通过函数回调。比如调用函数drv_uart_open就必须使用如图3所示的回调方式,不能直接调用。
[0088]
一旦发现某个rom固化函数有bug,只需要在固件代码里面重新实现升级的函数,并在系统启动时将升级后函数的入口地址更新到函数回调表中,这样rom中的原始函数就被替换掉了,根据升级后函数的入口地址链接生成的可执行文件将使用固件中升级后的函数,不使用rom中的原始函数。
[0089]
一些示例性实施例中,rom中固化数据的访问方法还包括:
[0090]
根据直接访问存储器的访问方式,访问rom或固件中的数据;
[0091]
其中,所述数据包括:配置参数或设定字符串。
[0092]
一些示例性实施例中,在链接文件包括配置参数或设定字符串的链接信息的情况下,根据链接信息从rom中获取所述配置参数或所述设定字符串;
[0093]
和/或,
[0094]
在链接文件不包括配置参数或设定字符串的链接信息的情况下,从所述固件中获取配置参数或设定字符串。
[0095]
需要说明的是,链接文件包括所述配置参数或所述设定字符串的链接信息,表示所述配置参数或所述设定字符串的链接信息在链接文件中生效,影响链接结果。链接文件不包括所述配置参数或所述设定字符串的链接信息,可以为删除了其链接信息,或者,为注释掉其链接信息。
[0096]
可以理解,在无需打补丁的情况下,对于配置参数和设定字符串,在链接脚本中对应写入了所述配置参数和设定字符串的链接信息,包括参数名/字符串标识和对应在rom中的地址,根据该链接脚本进行链接所生成的可执行文件获取的是rom中的原始数据;而在需要打补丁的情况下,在固件中保存所述配置参数/字符串的升级后数据,并将链接脚本中对应配置参数和设定字符串的链接信息删除(或注释掉),根据删除了相关内容的链接脚本再次链接生成的可执行文件获取的不再是rom中的原始数据,而是固件中的所述配置参数或设定字符串的升级后的数据。
[0097]
例如,链接脚本里有如下两行
[0098]“provide(sha256_init_value=0x0000ad38);”[0099]“provide(chip_name=0x0000ad58);”[0100]
sha256_init_value是hash 256计算的初始值的符号名,本质是一组参数,保存在rom地址0x0000ad38;chip_name是芯片的符号名,本质是一个字符串,保存在地址0x0000ad58。这样固件代码里引用相应符号名,就可以使用符号名对应的内容了。如果想更改芯片的符号名内容,只要将链接脚本里对应行注释掉(或删除),然后在固件代码里面重新定义一个相同名字的字符串,这样替换就完成了,链接生成可执行文件时将获取固件代码里的对应字符串,由此可以实现对配置参数或设定字符串的打补丁。
[0101]
可以看到,对于需要固化在rom中的非函数类的只读数据,例如:配置数据或设定字符串,也采用与库函数或简单函数相似的直接访问方式,以保持在打补丁或未打补丁的情况下,都能高效获取数据。
[0102]
本公开实施例还提供一种rom中固化数据的访问装置,如图4所示,包括:
[0103]
访问方式获取模块410,设置为获取芯片中只读存储器rom中固化函数的访问方
式;
[0104]
访问模块420,设置为根据访问方式,访问rom中的原始代码或固件中的升级后代码;
[0105]
其中,访问方式包括:直接函数调用或函数回调;
[0106]
访问方式根据所述rom中固化函数的类型确定;
[0107]
固化函数的类型至少包括以下类型之一:库函数、简单函数和第三类型函数;
[0108]
简单函数包括:不被其他固化函数调用,也不调用其它函数的非库函数;第三类型函数包括:既不是库函数,也不是简单函数的函数。
[0109]
一些示例性实施例中,在固化函数的类型为库函数或简单函数的情况下,访问方式为直接函数调用;
[0110]
和/或,
[0111]
在固化函数的类型为第三类型函数的情况下,访问方式为函数回调。
[0112]
一些示例性实施例中,rom中固化数据的访问装置还包括:
[0113]
加载模块,设置为在固化函数的类型为库函数的情况下,在芯片进行初始化时将库函数用到的全局变量加载到随机动态存储器dram的固定区域;
[0114]
其中,固定区域不允许在芯片运行中被来自所述固件的代码改变用途。
[0115]
一些示例性实施例中,在访问方式为直接函数调用的情况下,访问模块420还设置为,在链接文件包括库函数或简单函数的链接信息的情况下,链接rom中库函数或简单函数的原始代码,生成可执行文件;
[0116]
和/或,
[0117]
在访问方式为直接函数调用的情况下,访问模块420还设置为,在链接文件不包括库函数或简单函数的链接信息的情况下,链接固件中库函数或的简单函数的升级后代码,生成可执行文件。
[0118]
一些示例性实施例中,在访问方式为函数回调的情况下,访问模块420还设置为,从函数回调表中获取第三类型函数的入口地址,以该入口地址作为回调地址链接所述rom中的原始代码或固件中的升级后代码,生成可执行文件;
[0119]
其中,函数回调表记载第三类函数的原始代码在rom中的入口地址或者记载第三类函数的升级后代码在固件中的入口地址。
[0120]
一些示例性实施例中,访问模块420还设置为,根据直接访问存储器的访问方式,访问rom或固件中的数据;
[0121]
其中,所述数据包括:配置参数或设定字符串。
[0122]
一些示例性实施例中,所述访问rom或固件中的数据,包括:
[0123]
在链接文件包括配置参数或设定字符串的链接信息的情况下,根据链接信息从rom中获取配置参数或设定字符串;
[0124]
和/或,
[0125]
在链接文件不包括配置参数或设定字符串的链接信息的情况下,从固件中获取配置参数或设定字符串。
[0126]
本公开实施例还提供一种芯片,如图5所示,包括处理器510和存储器520,所述存储器520用于存储一组计算机程序,所述处理器510用于调用所述计算机程序,以实现如本
公开任一实施例所述的rom中固化数据的访问方法。
[0127]
本公开实施例还提供一种芯片,如图6所示,包括处理器610,rom620和固件630;
[0128]
其中,rom620中存储固化数据;固件630中存储补丁数据;
[0129]
所述处理器610配置成执行如本公开任一实施例所述方法访问rom620或固件630中存储的数据。
[0130]
一些示例性实施例中,补丁数据包括一下的一项或多项:
[0131]
升级后的函数代码、升级后的配置参数和升级后的设定字符串。
[0132]
本公开实施例还提供一种电子设备,包括如本公开任一实施例所述的芯片。
[0133]
本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本公开任一实施例所述的rom中固化数据的访问方法。
[0134]
本公开实施例还提供一种计算机程序产品,其上存储有计算机程序,该程序被处理器执行时实现如本公开任一实施例所述的rom中固化数据的访问方法。
[0135]
本公开实施例提供的rom中固化数据的访问方案,能够充分利用不同固化数据的特点,针对性的采用相应的访问方式,保证了外部关联度较低的固化数据的访问效率,又降低了外部关联度较高的固化数据的打补丁方案的复杂度,整体提升了rom中固化数据访问以及打补丁的综合性能。
[0136]
本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。
[0137]
以上所述仅为本公开的优选实施例,并非因此限制本公开的专利范围,凡是在本公开的构思下,利用本公开说明书及附图内容所作的等效结构变换,或直接/间接运用在其他相关的技术领域均包括在本公开的专利保护范围内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献