《将WINE从X86移植到ARM平台的方法.pdf》由会员分享,可在线阅读,更多相关《将WINE从X86移植到ARM平台的方法.pdf(11页珍藏版)》请在专利查询网上搜索。
1、10申请公布号CN102364442A43申请公布日20120229CN102364442ACN102364442A21申请号201110173905522申请日20110624G06F9/44520060171申请人浙大网新科技股份有限公司地址310030浙江省杭州市三墩西园八路1号浙大网新软件园A楼15层72发明人毛德操王承志徐鼎鼎陈天洲俞立呈74专利代理机构杭州宇信知识产权代理事务所普通合伙33231代理人张宇娟54发明名称将WINE从X86移植到ARM平台的方法57摘要本发明公开了一种将WINE从X86移植到ARM平台的方法。WINE能够在其他操作系统中模拟WINDOWS应用的执行环境。
2、,从而可在其他操作系统中直接运行WINDOWS二进制程序。本发明提出的方法包括以下步骤1将X86汇编代码改写为ARM汇编代码;2增加ARM的CONTEXT数据结构表示ARM上的寄存器上下文;3增加对ARM可执行映像中CPU架构签名支持;4修正ITEMIDLIST数据结构存储位置,保证内存地址对齐。本发明使得WINE能够在使用ARM平台的系统如大量的嵌入式系统上运行,让大量WINDOWS程序在各种嵌入式平台上能直接运行,从而降低各种已有应用的部署成本。51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书1页说明书8页附图1页CN102364461A1/1页21将WINE从X8。
3、6移植到ARM平台的方法,其特征是11、改写X86汇编代码为ARM汇编代码;12、增加ARM的CONTEXT数据结构,表示ARM处理器上的寄存器上下文;13、增加对ARM架构可执行映像PE文件头CPU架构签名的支持,使WINE能识别ARM可执行映像;14、对ITEMIDLIST数据结构的存储位置进行修正,保证其内存地址是与长字或字的边界对齐的。2根据权利要求1所述的方法,其特征在于,改写X86汇编代码为ARM汇编代码的方法为21、将X86汇编指令的指令逐条改写为对应的ARM汇编指令,并将操作数改为ARM的寄存器;22、对于不存在对应ARM汇编指令的X86汇编指令,使用多条ARM汇编指令以实现与。
4、对应X86汇编指令相同的功能。3根据权利要求2所述的方法,其特征在于,需要改写的汇编代码包括LOADER/PRELOADERC中的所有汇编代码;LIBS/WINE/PORTC中的WINECALLONSTACK函数;LIBS/WINE/PORTC中的WINESWITCHTOSTACK函数。4根据权利要求1所述的方法,其特征在于,增加ARM架构可执行映像PE文件头CPU架构签名的支持方法具体为增加对文件头中ARM架构签名的判断,允许ARM架构可执行映像被装载执行。5根据权利要求1所述的方法,其特征在于,对ITEMIDLIST数据结构的存储位置进行修正,若ITEMIDLIST数据结构的大小为奇数,则。
5、计算地址时在原来的地址上加1,使得数据结构的地址总是偶数对齐的。权利要求书CN102364442ACN102364461A1/8页3将WINE从X86移植到ARM平台的方法技术领域0001本发明涉及计算机运行环境模拟器领域、操作系统领域和CPU体系结构领域,尤其是将WINE从X86移植到ARM平台的方法。背景技术0002MICROSOFTWINDOWS简称WINDOWS是目前桌面电脑上常见的操作系统,有多个不同的版本,适用于个人电脑、工作站和服务器。WINDOWS系列操作在桌面电脑市场的占有率于2010年底达到90以上,可见其普及率和受欢迎程度。WINDOWS之所以这么受到用户欢迎的一大原因就。
6、是WINDOWS平台上的应用软件非常多,大部分的软件开发商都愿意首先为WINDOWS平台开发应用,而很多用户不愿意切换到其他操作系统就是因为其他系统上没有用户所需的某个应用或令用户满意替代版本。0003ARM架构处理器是目前非常流行的一种处理器架构,其精简指令集RISC的设计比起桌面电脑处理器中常见的X86的复杂指令集CSIC更加高效,能耗也更低。因此目前很多嵌入式设备或移动设备如智能手机大多都采用了ARM架构的处理器。然而由于ARM的指令集与X86指令集完全不同,无法在ARM处理器上运行传统桌面电脑的WINDOWS操作系统,因而也无法运行WINDOWS操作系统中的众多软件。0004WINE是。
7、一个在X86处理器上的模拟运行环境,利用WINE可在其他操作系统通常为类UNIX的操作系统如LINUX中直接运行WINDOWS的可执行程序。因此利用WINE能够在不同操作系统上直接获得WINDOWS环境下丰富的应用资源,很多WINDOWS应用不需要进行任何修改不需要重新编译就能直接在WINE中运行,并且保持较高的运行效率。然而WINE只支持X86的处理器架构,并不支持ARM,因而无法在目前众多基于ARM的设备上运行。发明内容0005本发明提出一种将WINE从X86移植到ARM平台的方法,从而使得ARM平台上也能运行众多的WINDOWS程序,应用开发商能够快速地将原有的应用部署到目前众多的基于A。
8、RM的设备中,获得更多经济效益。0006要将原为X86架构CPU编写的WINE模拟器移植到ARM架构的CPU上,首先需要解决的问题就是把X86指令集的机器代码转换为ARM指令集的机器代码。对于使用C等高级语言编写的源代码,只需要在PC上使用生成ARM架构机器代码的编译器交叉编译即可。但WINE为了更有效地控制底层硬件,有一部分源代码是使用汇编代码编写的,由于汇编代码是与CPU指令集有关的,因此需要手工将这些汇编代码改写成ARM指令集的汇编代码。具体的方法是将X86汇编的指令逐条改写为对应的ARM汇编指令,并将指令中的操作数从X86寄存器改为ARM寄存器。由于X86指令集和ARM指令集的差异性,。
9、对于不存在对应ARM汇编指令的X86指令,需要使用多条ARM汇编指令来实现对应与对应X86汇编指令相同的功能。说明书CN102364442ACN102364461A2/8页40007所要改写的汇编代码有以下几部分0008LOADER/PRELOADERC中的所有汇编代码;0009LIBS/WINE/PORTC中的WINECALLONSTACK函数;0010LIBS/WINE/PORTC中的WINESWITCHTOSTACK函数。0011另有一些数据结构并不是汇编指令,但也与具体的CPU有关。WINE中的CONTEXT数据结构用于表示CPU的寄存器上下文,寄存器上下文指某一时刻CPU所有寄存器的。
10、值,存储CPU在这一时刻的状态。不同的CPU具有不同的寄存器集合,所以表示它们的寄存器上下文的CONTEXT数据结构也不同。WINE在WINE/INCLUDE/WINNTH中提供了ARM的CONTEXT数据结构定义,但代码中却并没提供有关的代码实现,需要加以补充,增加ARM寄存器上下文保存、恢复、复制以及具体寄存器值提取的函数。0012WINE中运行的WINDOWS可执行映像格式为PEPORTABLEEXECUTABLE,其文件头中有一个字段指明此可执行文件是针对哪一种CPU的,称为CPU架构签名。对于ARM处理器,这个字段的值为IMAGEFILEMACHINEARM或IMAGEFILEMAC。
11、HINETHUMB,这两个常数的值分别是0X01C0和0X01C2。WINE不能识别这两个CPU架构签名,所以无法装载或运行ARM的可执行映像。因此要添加对这种CPU架构签名的支持,需要修改KERNEL32/PROCESSC。0013定义在INCLUDE/SHTYPESIDL中的数据结构ITEMIDLIST如下00140015其中SHITEMID的定义为00160017这里数组ABID的大小可变,其大小记录在字段CB中,这个数组用来存放文件名。当文件名的长度为奇数时,数据结构SHITEMID的大小是奇数,从而ITEMIDLIST的大小也是奇数,因而不与长字或字的边界对齐。在实际使用中,好几个S。
12、HITEMID数据结构会首尾相连叠在一起,形成一个列表。这样,如果第一个SHITEMID数据结构的大小是奇数,第二个SHITEMID数据结构的起点就不与长字或字的边界对齐了。X86处理器允许这样的不对齐的地址访问,但ARM处理器只允许与长字或字边界对齐的内存访问,否则就不保证操作的正确性。由于这个原因,当CPU从非对齐的SHITEMID数据结构中读取其CB字段的数值说明书CN102364442ACN102364461A3/8页5时,所得到的可能是个错误的数值。本发明通过对有关的函数ILGETSIZE、ILGETNEXT进行修改来解决这个问题,ILGETSIZE函数用于获得单个SHITEMID数。
13、据结构的大小,ILGETNEXT函数用于获得SHITEMID数据结构组成的列表中某一项的下一项地址。修改方法为在ILGETSIZE函数计算单个SHITEMID结构大小以及ILGETNEXT函数计算下一项地址时,新增一个_INSIGMA_ALIGN函数计算CB部分的大小,其计算方法是如果ABID数组的大小为奇数的话,就在此数值上加1,使其与长字或字的边界对齐。通过复制一组SHITEMID数据结构形成一个列表的时候,实际复制的长度取决于ILGETSIZE函数的返回值,而返回值经过了_INSIGMA_ALIGN函数调整,地址一定是偶数。因此在一个列表中,每一个SHITEMID数据结构的起点就都是与长。
14、字或字的边界对齐的,解决了ARM处理器访问内存时边界必须对齐的问题。附图说明0018图1是本发明实施例的将WINE从X86移植到ARM平台的流程图。具体实施方式0019如图1所示。本实施例的将WINE从X86移植到ARM平台的流程包括如下步骤0020第一,将X86汇编的指令逐条改写为对应的ARM汇编指令,并将指令中的操作数从X86寄存器改为ARM寄存器。由于X86指令集和ARM指令集的差异性,对于不存在对应ARM汇编指令的X86指令,需要使用多条ARM汇编指令来实现对应与对应X86汇编指令相同的功能。0021具体的实现方法是通过增加宏定义_ARM_来在编译时控制编译ARM专用的代码,因此ARM。
15、的汇编代码会被检测_ARM_宏是否定义的条件编译语句包围。由于有较多的源代码涉及到X86汇编代码到ARM汇编代码的转换,因此这里只针对LIBS/WINE/PORTC中的WINE_CALL_ON_STACK函数进行举例说明。WINE_CALL_ON_STACK函数在转换后的代码如下0022说明书CN102364442ACN102364461A4/8页60023以上代码保留_I386_宏的条件编译指令包围的X86的汇编代码X86的具体代码使用“”省略,新增用_ARM_宏的条件编译指令包围的ARM汇编代码,其代码内容是将X86的对应指令按照功能改写为ARM汇编指令。0024第二,增加ARM表示寄存器。
16、上下文的CONTEXT数据结构步骤如下00251、在DLLS/NTDLL目录下创建名为SIGNAL_ARMC的文件,其中需要实现与原说明书CN102364442ACN102364461A5/8页7SIGNAL_I386C相同的函数,包括SAVE_CONTEXT、RESTORE_CONTEXT等函数。00262、在DLLS/NTDLL/THREADC中有个函数COPY_CONTEXT,需要增加对ARM的CONTEXT与X86的CONTEXT中不同的字段的复制代码。00273、在WINESERVER的代码中,需要在SERVER目录下面创建名为CONTEXT_ARMC的文件,其中需要实现与原CONT。
17、EXT_I386C相同的函数,例如COPY_CONTEXT、GET_CONTEXT_IP等函数。0028第三,增加对ARM架构可执行映像PE头文件CPU架构签名支持的具体方法是修改KERNEL32/PROCESSC中的START_PROCESS函数为002900300031以上代码中增加了对头文件的CPU架构签名字段FILEHEADERMACHINE为IMAGEFILEMACHINETHUMB或IMAGEFILEMACHINEARM时的情况判断,使得ARM处理器的可执行文件能够被加载运行。0032第四,ITEMIDLIST数据结构的存储位置修正需要修改ILGETSIZE和ILGETNEXT函数。
18、,分别都要在计算ITEMIDLIST数据结构大小时增加对_INSIGMA_ALIGN函数的调用,_说明书CN102364442ACN102364461A6/8页8INSIGMA_ALIGN函数的定义如下00330034以上函数被_INSIGMA_宏定义的条件编译包围,即定义了_INSIGMA_宏后才提供存储位置修正。_INSIGMA_ALIGN函数提供的修正方法是若ABID数组的大小为奇数的话,就在此数值上加1,使其与长字或字的边界对齐。0035修改后的ILGETSIZE函数和ILGETNEXT函数如下00360037说明书CN102364442ACN102364461A7/8页90038说明书CN102364442ACN102364461A8/8页100039以上两个函数在计算SHITEMID数据结构大小时根据是否定义了_INSIGMA_宏来决定是否调用_INSIGMA_ALIGN函数获得修正后的SHITEMID数据结构大小或下一SHITEMID数据结构的起始地址。说明书CN102364442ACN102364461A1/1页11图1说明书附图CN102364442A。