一种轻量普适化编译方法、系统及设备与流程

文档序号:32002588发布日期:2022-11-02 11:50阅读:40来源:国知局
一种轻量普适化编译方法、系统及设备与流程

1.本发明属于微内核嵌入式操作系统技术领域,更具体地,涉及一种应用于微内核操作系统的轻量普适化编译方法、系统及设备。


背景技术:

2.现有操作系统根据指令集生成编译器。例如,linux具有arm、armv7和arm64等多个版本的编译器,以支持相应的cpu;windows通过不同的子系统支持不同类型的cpu;还有一部分操作系统自带arm版本或者x86版本的编译器,这种处理方式是基于假定cpu对指令集的支持是稳定的。另一方面,近年来大量国产cpu越来越多地应用于嵌入式应用领域,这些国产cpu通常自带编译器,而不使用标准版arm编译器,但是这些国产cpu到底因做了哪些修改而能够不使用标准版arm编译器往往无从知晓,上述cpu厂商仅能够保证使用他们提供的编译器能够编译出正常工作的系统内核和应用程序。与此同时,原本芯片市场只有x86和arm两个架构的cpu,但是近年来risc-v架构的cpu逐渐兴起,很多cpu厂商开始提供risc-v架构的cpu,这些cpu厂商也会提供自己的编译器。除此之外,原本只用于显卡的gpu也在扩展应用范围,不同的gpu厂商也在提供自己的编译器。
3.目前,在嵌入式系统领域中,上述处理器均有应用。对于操作系统提供商,为了支持所有类型的处理器,不得不付出更多的工作量,同时使用标准版编译器的风险也越来越高。现有的操作系统提供商根据指令集提供编译工具,以支持自己的操作系统。例如windows操作系统提供windows studio平台,借助sdk和ddk等支持工具,辅助x86_64和arm32/64等平台开发,开发人员可以选择多种第三方工具和库进行软件开发。linux操作系统有多种开发工具支持各种cpu架构和各个cpu厂商,gpu厂商也都在提供linux平台开发工具,开发人员可以选择多种开发工具和库进行软件开发。其他操作系统往往缺少第三方开发工具支持,通常需要对所支持的每种cpu架构都按照其标准指令集提供相应的开发工具,进而带有多种语言编译器,这些编译器通常都是基于宏内核操作系统的gcc编译器。
4.然而,对于上述缺少第三方开发工具支持的嵌入式操作系统,其开发编译器的流程导致操作系统内核越来越臃肿。具体地,操作系统内核需要与不同的指令集紧耦合,仅arm架构就分为armv4-v8等不同的指令集,绑定类似armv4/func.c、armv5/func.c、armv6/func.c、armv7/func.c和armv8/func.c等不同的代码,但是为了支持不同的指令集,这些代码又是必需的。另一方面,在现有嵌入式应用程序的开发流程中,对编译工具本身没有限制,开发人员可任意使用各种接口,由此在进行测试时不同的工程需要根据不同的项目的具体开发方式确定需要测试的接口,然后测试团队分析具体使用的接口和取值范围生成测试用例。然而,这会导致不同的项目测试计划和测试用例难以复用,测试计划难以充分覆盖被测试项目,进而可能造成客户的有限需求难以保证功能安全。进一步地,对于缺少第三方开发工具支持的微内核嵌入式操作系统,由于其内存分配方式、动态库加载方式和权限管理方式均不同于宏内核操作系统,因此采用基于宏内核操作系统的gcc编译器编译出的程序无法在微内核操作系统中使用。


技术实现要素:

5.本发明的目的在于解决现有缺少第三方开发工具支持的微内核嵌入式操作系统因实现对各种架构的处理器的普适性支持而系统内核臃肿以及相应应用程序的可测试性差的问题。
6.为了实现上述目的,本发明提供一种应用于微内核操作系统的轻量普适化编译方法、系统及设备。
7.根据本发明的第一方面,提供一种应用于微内核操作系统的轻量普适化编译方法,该编译方法包括以下步骤:
8.获取所述微内核操作系统的源代码,该源代码包括内核代码、动态库加载代码、c函数库代码、限定调用接口库函数和调用代理代码;
9.获取目标处理器的编译器,所述目标处理器为用户所使用的处理器;
10.采用所述编译器对所述内核代码、所述动态库加载代码、所述c函数库代码和所述限定调用接口库函数进行编译,得到兼容内核、兼容动态库加载器、兼容c函数库和兼容限定调用接口库;
11.根据所述目标处理器的架构对所述调用代理代码进行修改和/或补充,并采用所述编译器对修改和/或补充后的调用代理代码进行编译,得到兼容调用代理库。
12.作为可选的是,所述应用于微内核操作系统的轻量普适化编译方法还包括以下步骤:
13.获取预先根据所述限定调用接口库函数所限定的调用接口进行开发的应用程序的源代码;
14.调用所述限定调用接口库函数;
15.采用预更新的编译器对所述应用程序的源代码进行编译,并链接所述兼容调用代理库,得到目标代码;
16.将所述兼容动态库加载器、所述兼容c函数库和所述兼容限定调用接口库链接到所述目标代码,得到可执行程序。
17.作为可选的是,所述兼容内核具有以下功能:
18.兼容posix标准、支持elf格式、支持常用变量类型以及支持常用宏定义和预编译选项。
19.作为可选的是,所述根据所述目标处理器的架构对所述调用代理代码进行修改包括:
20.根据所述目标处理器的架构获取所述目标处理器的内存分配方式、动态库加载方式和权限管理方式;
21.根据所述目标处理器的内存分配方式、动态库加载方式和权限管理方式对所述调用代理代码进行适应性修改。
22.作为可选的是,在所述获取目标处理器的编译器之后,根据所述目标处理器的架构设置所述编译器的编译选项。
23.作为可选的是,在采用所述编译器对所述应用程序的源代码进行编译,并链接所述兼容调用代理库,得到目标代码之前还包括:
24.采用所述兼容动态库加载器、所述兼容c函数库、所述兼容限定调用接口库和所述
兼容调用代理库对所述编译器的相应库文件进行替换,得到所述预更新的编译器。
25.根据本发明的第二方面,提供一种应用于微内核操作系统的轻量普适化编译系统,该编译系统包括以下功能模块:
26.第一源代码获取模块,用于获取所述微内核操作系统的源代码,该源代码包括内核代码、动态库加载代码、c函数库代码、限定调用接口库函数和调用代理代码;
27.编译器获取模块,用于获取目标处理器的编译器;
28.第一编译模块,采用所述编译器对所述内核代码、所述动态库加载代码、所述c函数库代码和所述限定调用接口库函数进行编译,得到兼容内核、兼容动态库加载器、兼容c函数库和兼容限定调用接口库;
29.修补及编译模块,用于根据所述目标处理器的架构对所述调用代理代码进行修改和/或补充,并采用所述编译器对修改和/或补充后的调用代理代码进行编译,得到兼容调用代理库。
30.作为可选的是,所述应用于微内核操作系统的轻量普适化编译系统还包括以下功能模块:
31.第二源代码获取模块,用于获取预先根据所述限定调用接口库函数所限定的调用接口进行开发的应用程序的源代码;
32.库函数调用模块,用于调用所述限定调用接口库函数;
33.第二编译模块,用于采用预更新的编译器对所述应用程序的源代码进行编译,并链接所述兼容调用代理库,得到目标代码,
34.以及,将所述兼容动态库加载器、所述兼容c函数库和所述兼容限定调用接口库链接到所述目标代码,得到可执行程序。
35.根据本发明的第三方面,提供一种应用于微内核操作系统的轻量普适化编译设备,该编译设备包括处理器和存储器,所述处理器执行所述存储器中保存的计算机程序时执行上述任一种应用于微内核操作系统的轻量普适化编译方法。
36.本发明的有益效果在于:
37.本发明的应用于微内核操作系统的轻量普适化编译方法,首先获取所述微内核操作系统的源代码,该源代码包括内核代码、动态库加载代码、c函数库代码、限定调用接口库函数和调用代理代码;其次获取目标处理器的编译器;再次采用所述编译器对所述内核代码、所述动态库加载代码、所述c函数库代码和所述限定调用接口库函数进行编译,得到兼容内核、兼容动态库加载器、兼容c函数库和兼容限定调用接口库;最后根据所述目标处理器的架构对所述调用代理代码进行修改和/或补充,并采用所述编译器对修改和/或补充后的调用代理代码进行编译,得到兼容调用代理库。
38.本发明的应用于微内核操作系统的轻量普适化编译方法,调用代理代码用于实现调用代理,通过调用代理封装不同架构的处理器在内存分配、动态库加载和权限管理上差别,从而使得微内核操作系统可以识别不同架构的处理器对限定功能的调用,以实现微内核操作系统内核与指令集的绑定,进而解决现有缺少第三方开发工具支持的微内核嵌入式操作系统因实现对各种架构的处理器的普适性支持而系统内核臃肿的问题。
39.本发明的应用于微内核操作系统的轻量普适化编译方法,限定调用接口库函数用于实现限定调用接口,即应用程序只能调用限定范围内的接口函数和数据类型,以实现限
定范围内的功能,从而保障应用程序的可测试性,保证嵌入式系统的功能安全,对上述限定范围内的调用接口可以进行完整测试。
40.本发明的应用于微内核操作系统的轻量普适化编译系统和应用于微内核操作系统的轻量普适化编译设备与上述应用于微内核操作系统的轻量普适化编译方法属于一个总的发明构思,其有益效果在此不再赘述。
41.本发明的其他特征和优点将在随后具体实施方式部分予以详细说明。
附图说明
42.本发明可以通过参考下文中结合附图所做出的描述而得到更好的理解,其中在所有附图中使用了相同或相似的附图标记来表示相同或者相似的部件。
43.图1示出了根据本发明的实施例的应用于微内核操作系统的轻量普适化编译方法的实现流程图;
44.图2示出了根据本发明的实施例的系统内核与指令集的解耦操作示意图;
45.图3示出了根据本发明的实施例的应用程序编译流程示意图;
46.图4示出了根据本发明的实施例的应用程序调用库函数后的实现功能流程图。
具体实施方式
47.为了使所属技术领域的技术人员能够更充分地理解本发明的技术方案,在下文中将结合附图对本发明的示例性的实施方式进行更为全面且详细的描述。显然地,以下描述的本发明的一个或者多个实施方式仅仅是能够实现本发明的技术方案的具体方式中的一种或者多种,并非穷举。应当理解的是,可以采用属于一个总的发明构思的其他方式来实现本发明的技术方案,而不应当被示例性描述的实施方式所限制。基于本发明的一个或多个实施方式,本领域的普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施方式,都应当属于本发明保护的范围。
48.实施例:图1示出了本发明实施例的应用于微内核操作系统的轻量普适化编译方法的实现流程图,图2示出了本发明实施例的系统内核与指令集的解耦操作示意图。参照图1和图2,本发明实施例的应用于微内核操作系统的轻量普适化编译方法包括以下步骤:
49.步骤s100、获取所述微内核操作系统的源代码,该源代码包括内核代码、动态库加载代码、c函数库代码、限定调用接口库函数和调用代理代码;
50.步骤s200、获取目标处理器的编译器,所述目标处理器为用户所使用的处理器;
51.步骤s300、采用所述编译器对所述内核代码、所述动态库加载代码、所述c函数库代码和所述限定调用接口库函数进行编译,得到兼容内核、兼容动态库加载器、兼容c函数库和兼容限定调用接口库;
52.步骤s400、根据所述目标处理器的架构对所述调用代理代码进行修改和/或补充,并采用所述编译器对修改和/或补充后的调用代理代码进行编译,得到兼容调用代理库。
53.进一步地,参照图1,本发明实施例的应用于微内核操作系统的轻量普适化编译方法还包括以下步骤:
54.步骤s500、获取预先根据所述限定调用接口库函数所限定的调用接口进行开发的应用程序的源代码;
55.步骤s600、调用所述限定调用接口库函数;
56.步骤s700、采用预更新的编译器对所述应用程序的源代码进行编译,并链接所述兼容调用代理库,得到目标代码;
57.步骤s800、将所述兼容动态库加载器、所述兼容c函数库和所述兼容限定调用接口库链接到所述目标代码,得到可执行程序。
58.再进一步地,本发明实施例中,所述编译器为gcc编译器。
59.再进一步地,本发明实施例中,所述兼容内核具有以下功能:
60.兼容posix标准、支持elf格式、支持常用变量类型以及支持常用宏定义和预编译选项。
61.再进一步地,本发明实施例中,步骤s400所述的根据所述目标处理器的架构对所述调用代理代码进行修改包括:
62.根据所述目标处理器的架构获取所述目标处理器的内存分配方式、动态库加载方式和权限管理方式;
63.根据所述目标处理器的内存分配方式、动态库加载方式和权限管理方式对所述调用代理代码进行适应性修改。
64.再进一步地,本发明实施例中,在步骤s200所述的获取目标处理器的编译器之后,根据所述目标处理器的架构设置所述编译器的编译选项。
65.再进一步地,本发明实施例中,在步骤s700所述的采用所述编译器对所述应用程序的源代码进行编译,并链接所述兼容调用代理库,得到目标代码之前还包括:
66.采用所述兼容动态库加载器、所述兼容c函数库、所述兼容限定调用接口库和所述兼容调用代理库对所述编译器的相应库文件进行替换,得到所述预更新的编译器。
67.图3示出了本发明实施例的应用程序编译流程示意图。参照图3,过去这种调用方式开销太大难以使用,但是随着arm等cpu性能的不断提升,大量嵌入式系统怠速运行,采用这种调用方式成为可能。使用调用代理使内核脱离和cpu架构的绑定,内核规模减小,增加了对不同cpu架构的兼容性,增强了可移植性。使用调用代理会导致效率降低,本编译环境针对的开发需求为按照现有cpu性能,效率不需要优先考虑的项目。
68.关于限定接口:从设计上,相对于现有的操作系统的编译环境,限定支持调用接口,对特定功能只提供特定接口,保障项目的可测试性。
69.关于不绑定编译器:从设计上,相对于现有的操作系统的编译环境,通过兼容posix标准,支持elf格式,支持常用变量类型,支持常用宏定义和预编译选项,根据不同cpu增加适配相应的编译选项,替换客户gcc编译器所用的crt1.o、crti.o、crtn.o等文件,链接兼容限定调用接口库文件,通过调用厂商提供的linux版本gcc编译器,编译支持国产微内核操作系统的内核和应用程序。
70.本发明实施例的应用于微内核操作系统的轻量普适化编译方法,通过限定接口支持限制编译器的开发规模,同时通过调用代理保证对各种架构的cpu的普适性支持,以适用于小型操作系统公司能够以有限的人力物力完成编译器的开发,同时提供对各种cpu架构的支持。关于限定调用接口:应用程序只能调用限定范围内的接口函数和数据类型,实现限定范围内功能。限定调用接口保证了小型操作系统公司可以用有限的人力物力完成编译器的开发,同时限定调用接口作用还包括:保障可测试性,保证嵌入式系统需要的功能安全,
对这些限定范围内的调用接口可以进行完整测试。客户嵌入式系统通常不需要完整的功能支持,例如用户开发板只需要串口和网口的支持,或只需要特定的显示功能只需要简单界面和交互。限定调用接口为只包括用户需要的操作,并提供对应的代码。这些代码在不同的cpu环境下,使用客户提供的编译环境重新编译,生成标准可执行elf格式文件。
71.关于调用代理:编译器编译结果是否能运行,问题不在于所用的elf文件格式,而在于内存分配,动态库加载,权限管理等操作,通过“调用代理”封装不同cpu在调用接口和权限管理等方面的差别,从而使得国产操作系统微内核可以识别不同cpu对限定功能的调用。
72.调用代理是封装了特定函数接口的库,用于对操作系统功能的代理,用于封装不同cpu架构和设计导致的对内核的不同要求。
73.调用代理功能主要涉及:进程间通信ipc,互斥锁内存池及资源管理,线程管理,timer计时器等中断管理。调用代理封装不同cpu架构和设计导致操作系统所需的调整。
74.调用代理有统一接口,只要能实现对应接口,操作系统就可以在对应cpu上运行;内核中包括对标准指令集的支持在重新编译后可以在对应cpu上运行,但在涉及相应功能时,内核通过调用代理完成。调用代理针对不同架构的cpu有不同的实现代码;对相同架构的cpu只要能编译通过就可以支持。
75.通过兼容posix标准,调用cpu厂商提供的宏内核linux平台gcc编译器,限定支持的调用接口,使用“调用代理”,生成可以在国产微内核操作系统运行的可执行程序并符合功能安全的编译架构。
76.图4示出了本发明实施例的应用程序调用库函数后的实现功能流程图。参照图4,本发明实施例中,应用程序调用库函数时,库函数访问内核相应接口,内核通过调用代理接口访问不同架构cpu功能。
77.本发明实施例的应用于微内核操作系统的轻量普适化编译方法具有以下有益效果:
78.在芯片支持方面通过限定调用接口,使用调用代理,忽略执行效率和编译结果大小,调用cpu厂商提供的编译环境,生成可以在国产微内核操作系统上运行的程序,从而最大可能地实现国产微内核操作系统对国内外各种芯片的最大兼容,为后续国产芯片的支持提供支撑和保障,实现国产芯片和国产高端操作系统的全产业链。突破国外高端操作系统的卡脖子。兼容posix等规范,兼容现有的算法、逻辑等应用需求。
79.以下通过一个具体示例说明本发明实施例的应用于微内核操作系统的轻量普适化编译方法的效果:
80.将kirk微内核核心在arm a35架构上进行了验证测试,使用瑞芯微编译器编译kirk微内核操作系统的内核部分,kirk为微内核操作系统的名称。
81.配置使用瑞芯微的编译环境中的/px30_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc程序。
82.编译调用代理库,编译kirk内核,编译ld-kirk和包括libc在内的限定接口库。
83.替换客户平台gcc编译器所用到的crt1.o、crti.o、crtn.o等文件。
84.使用客户平台gcc编译器编译helloworld测试程序。
85.在终端中可以看到helloworld输出。
86.关于限定接口相关部分代码:
87.//限定只支持标准8250串口操作
88.#define8250_io_reg0x00//8250i/odata
89.#define8250_ier_reg0x04//8250interruptenable
90.#define8250_ier_txen(1《《1)
91.#define8250_ier_rxen(1《《0)
92.#define8250_iir_reg0x08//8250interruptidentify
93.#define8250_lcr_reg0x0c//8250linecontrol
94.#define8250_mcr_reg0x10//8250modemcontrol
95.#define8250_lsr_reg0x14//8250linestatus
96.#define8250_msr_reg0x18//8250modemstatus
97.#define8250_cfg_status0x1c//8250configstatus
98.displaychar()
99....
100.ldrw2,[x7,#8250_lsr_reg]
[0101]
tbzw2,#5,0b//waitlinestatus
[0102]
andw2,w1,#0xff
[0103]
strw2,[x7,#8250_io_reg]//transmit
[0104]
ldrw2,[x7,#8250_lsr_reg]
[0105]
tbzw2,#6,1b//checklinestatusfortransmit
[0106]
...
[0107]
当内核进行中断处理时,不是直接处理中断,而是调用中断代理,内核本身代码不变:
[0108]
内核代码:
[0109]
intcall_isr_prodigy(isrevent*isrevent){
[0110]
returnisr_prodigy_handler(isrevent);
[0111]
}
[0112]
调用代理库代码:
[0113]
32位arm平台:
[0114]
intisr_prodigy_handler(isrevent*isrevent){
[0115]
...
[0116]
if(inel3){
[0117]
if(fsecurestate){
[0118]
handleirq(isrevent);
[0119]
}else{
[0120]
handlefiq(isrevent);
[0121]
}
[0122]
}
[0123]
...
[0124]
}
[0125]
64位arm平台:
[0126]
intisr_prodigy_handler(isrevent*isrevent){
[0127]
...
[0128]
if(inel3){
[0129]
handlefiq(isrevent);
[0130]
}
[0131]
...
[0132]
}
[0133]
相应地,在本发明实施例提出的应用于微内核操作系统的轻量普适化编译方法的基础上,本发明实施例还提出了一种应用于微内核操作系统的轻量普适化编译系统,该编译系统包括以下功能模块:
[0134]
第一源代码获取模块,用于获取所述微内核操作系统的源代码,该源代码包括内核代码、动态库加载代码、c函数库代码、限定调用接口库函数和调用代理代码;
[0135]
编译器获取模块,用于获取目标处理器的编译器;
[0136]
第一编译模块,采用所述编译器对所述内核代码、所述动态库加载代码、所述c函数库代码和所述限定调用接口库函数进行编译,得到兼容内核、兼容动态库加载器、兼容c函数库和兼容限定调用接口库;
[0137]
修补及编译模块,用于根据所述目标处理器的架构对所述调用代理代码进行修改和/或补充,并采用所述编译器对修改和/或补充后的调用代理代码进行编译,得到兼容调用代理库。
[0138]
进一步地,本发明实施例的应用于微内核操作系统的轻量普适化编译系统还包括以下功能模块:
[0139]
第二源代码获取模块,用于获取预先根据所述限定调用接口库函数所限定的调用接口进行开发的应用程序的源代码;
[0140]
库函数调用模块,用于调用所述限定调用接口库函数;
[0141]
第二编译模块,用于采用预更新的编译器对所述应用程序的源代码进行编译,并链接所述兼容调用代理库,得到目标代码,
[0142]
以及,将所述兼容动态库加载器、所述兼容c函数库和所述兼容限定调用接口库链接到所述目标代码,得到可执行程序。
[0143]
相应地,在本发明实施例提出的应用于微内核操作系统的轻量普适化编译方法的基础上,本发明实施例还提出了一种应用于微内核操作系统的轻量普适化编译设备,该编译设备包括处理器和存储器,处理器执行存储器中保存的计算机程序时执行本发明实施例提出的应用于微内核操作系统的编译方法。
[0144]
虽然以上对本发明的一个或者多个实施方式进行了描述,但是本领域的普通技术人员应当知晓,本发明能够在不偏离其主旨与范围的基础上通过任意的其他的形式得以实施。因此,以上描述的实施方式属于示意性的而非限制性的,在不脱离如所附各权利要求所定义的本发明精神及范围的情况下,对于本技术领域的普通技术人员而言许多修改和替换
均具有显而易见性。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1