64位Linux操作系统兼容32位应用软件的方法_2

文档序号:9375264阅读:来源:国知局
,其中一份用于支持64位程序运行,另一份用来支持32位程序运行。
[0027]在兼容32位指令的64位处理器的前提下进行步骤SI,在所述64位处理器对应地设有64位操作系统,在所述64位操作系统中设计一 32位系统调用接口,与该系统调用接口对应的32位运行库、链接器以及程序加载器均设计于该处理器中,所述32位运行库、链接器、程序加载器以及32位系统调用接口共同形成32位子操作系统。
[0028]分别编译得到32位与64位两套运行库,一般为C语言运行库,由于32位与64位相同功能的运行库的文件名称相同,所以32位和64位的运行库放于不同的文件夹,方便应用程序运行的时候链接使用,具体地,在应用时将32位运行库安装到操作系统当中的/usr/lib和/Iib目录下,将64位运行库放在/usr/lib64和/lib64目录下。
[0029]所述运行库具有标准接口定义,由运行库中的函数间接地使用系统调用。
[0030]接下来以步骤S2进行判断,分别编译得到32位链接器、64位链接器和32位装载器、64位装载器,32位和64位的链接器以及装载器分别有相同的名字,需要将32位链接器和32位装载器放置到/Iib目录下,将64位链接器和64位装载器放到/lib64目录下。
[0031]执行系统调用的另一种方法是,添加一个判断,对-运行的应用程序格式进行判断:
(1)if(size of (long *) ==4) 32bit,由条件得出判断结果,即判断结果是32位应用程序,则调用32位子操作系统中的32位加载器来装载该应用程序;
(2)if(size of (long *) ==8)64bit,由条件得出判断结果,即判断结果是64位应用程序,则调用64位Linux操作系统中的64位加载器来装载该应用程序。
[0032]系统调用的工作过程为:当用户发送一个系统调用的请求时,该系统调用用一个标准的C语言运行库的封装例程来引导,在封装例程中含有汇编指令代码:
move v0, s0syscall
该move v0, s0将系统调用号载入v0寄存器,并执行汇编指令syscall使用该系统调用进入内核:handle_sys (),由handle_sys ()找到指定的系统调用函数,该系统调用被执行,并返回执行结果。
[0033]在64位Linux操作系统中,在启用32位程序时仍然会使用syscall实现系统调用,在内核当中则需要将32位和64位系统调用分开处理,64位系统调用直接执行系统调用所指向的内核函数,而32位系统调用则需先进行处理,转化为64位调用,在执行行系统调用所指向的内核函数,即32位系统调用转化后再实现系统调用并执行。
[0034]运行库是程序在运行时所需要的库文件,通常运行库是以ELF文件形式提供的,运行库一般包括编程时常用的函数,如字符串操作、文件操作、界面等内容。其为一个经过封装的程序模块,对外提供接口,只要知道接口参数就可以自由使用,如果不使用运行库,则程序中会有很多的重复代码,而使用运行库以后,则可以大大缩小编译后的程序的大小,如果在Linux操作系统中找不到相应的运行库程序就无法运行,
具体使用时,一个编译链接好的C程序,在Linux上执行的过程如下:exec会使用BRK()函数设置当前的数据段,然后打开预告编译时指定好的共享库的文件,并且把共享库加载到内存中,因为程序在编译的时候,默认是使用共享库的方式,只有加载了共享库到内存,才能保证程序执行的正确性,最后执行编写的代码执行,共享库即动态库。共享库是Linux系统最广泛的一种程序使用方式。
[0035]它的工作原理是相同功能的代码可以被多个程序共同使用,在程序加载的时候,内核会检查程序使用到的动态库是否已经加载到内存,如果没有被加载到内存,则从系统库路径搜索并且加载相关的动态库;如果动态库已经被加载到内存,程序可以直接使用而无须加载,使用动态库可以减小应用程序占用的空间和加载时间。
[0036]在本实施例中,系统调用接口是Linux操作系统内核与上层应用程序进行交互通信的唯一接口。从对中断机制的说明可知,用户程序通过直接或间接(通过库函数)调用syscall汇编指令,并在vO寄存器中指定系统调用功能号,即可使用内核资源,包括系统硬件资源。不过通常应用程序都是使用具有标准接口定义的C函数库中的函数间接地使用内核的系统调用。
[0037]经过实测,龙芯平台附带32位子系统的64位Linux操作系统无论是在应用32位程序还是64位程序以及在多线程的控制下,系统均能够流畅运行,真正实现了不同位数的应用程序对应不同的系统调用而不影响系统的稳定性,通过简单的方法就可以让32位软件完全适应64位系统,对64位系统的普及起到了重要的推动作用。
[0038]上述实施例仅仅是为清楚地说明本发明创造所作的举例,而并非对本发明创造【具体实施方式】的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所引伸出的任何显而易见的变化或变动仍处于本发明创造权利要求的保护范围之中。
【主权项】
1.一种64位Linux操作系统兼容32位应用软件的方法,其特征在于,包括以下步骤: 步骤S1:于所述64位处理器对应地设有64位操作系统,在所述64位操作系统的内核中设计一 32位系统调用接口,与该系统调用接口对应的32位运行库、链接器以及程序加载器均设计于该64位操作系统中,所述32位运行库、链接器、程序加载器以及32位系统调用接口共同形成32位子操作系统; 步骤S2:对运行的应用程序进行判断,并选择与程序相对应的操作系统,调用与该程序位数相对应的加载器、链接器以及运行库进行执行。2.如权利要求1所述的方法,其特征在于,进一步地,还包括判断步骤: 声明一个指针判断,对运行的应用程序格式进行判断: (1)若判断结果是32位应用程序,则调用32位子操作系统中的32位加载器来装载该应用程序; (2)若判断结果是64位应用程序,则调用64位Linux操作系统中的64位加载器来装载该应用程序。3.如权利要求1所述的方法,其特征在于,进一步地,还包括判断步骤: 在所述操作系统的内核上一层为虚拟系统调用中间层,用于识别32位与64位应用程序; 获取运行的应用程序所属的系统调用的格式,由该中间层对该格式进行判断,若判断为32位系统调用,则对该系统调用的数据结构进行转换,进而执行该系统调用; 若判断为64位系统调用,则直接执行该系统调用。4.如权利要求2或3所述的方法,其特征在于,所述应用程序在装载应用结束后,根据该应用程序在编译时标定的运行库位置来装载该应用程序所对应的运行库。5.如权利要求2或3所述的方法,其特征在于,应用程序装载结束以后,32位应用程序的装载器调用32位动态链接器来完成内存中的应用程序与运行库的链接工作,64位应用程序的装载器调用64位动态链接器完成内存中的应用程序与所属运行库的链接工作。6.如权利要求1所述的方法,其特征在于,所述操作系统采用龙芯64位处理器。7.如权利要求3所述的方法,其特征在于,所述操作虚拟系统调用中间层以上的运行库、装载器、链接器均为两份,其中一份为32位,另一份为64位。8.如权利要求7所述的方法,其特征在于,所述运行库具有标准接口定义,由运行库中的函数间接地使用系统调用。9.如权利要求5所述的方法,其特征在于,所述内存为内核的一个组成部分,应用程序执行时,首先装载形成应用程序的内存镜像以及运行库的内存镜像,然后由链接器链接内存镜像中的应用程序以及运行库镜像,同时加载共享库到内存中,之后执行编写的代码执行。
【专利摘要】本发明涉及一种在64位Linux操作系统兼容32位应用软件的方法,通过在龙芯平台64位操作系统内核中设计一32位子系统,对需要运行的程序进行判断进行选择相对应的系统调用,或者通过指针长度判断应用程序格式,进一步选择与程序相对应的系统,调用与该程序位数相对应的加载器、链接器以及运行库进行执行。本发明的有益效果为:使一些在短时间内无法在龙芯64位Linux操作系统如Linux平台上部署的应用程序,或是从32位Linux操作系统向64位迁移比较繁琐、甚至一些不适合64位平台的应用程序,完全运行在64位Linux操作系统中的32位子兼容子系统,从而保证了资源利用率以及运行效率,提高了系统的兼容性以及可应用程序的数量,从而推动了普及64位Linux操作系统的应用。
【IPC分类】G06F9/445, G06F17/30
【公开号】CN105094870
【申请号】CN201410202125
【发明人】张久伶, 党立斌
【申请人】中标软件有限公司
【公开日】2015年11月25日
【申请日】2014年5月13日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1