法律状态公告日
法律状态信息
法律状态
2014-06-25
授权
授权
2012-04-11
实质审查的生效 IPC(主分类):G06F9/445 申请日:20110624
实质审查的生效
2012-02-29
公开
公开
技术领域
本发明涉及计算机运行环境模拟器领域、操作系统领域和CPU体系结构 领域,尤其是将Wine从x86移植到ARM平台的方法。
背景技术
Microsoft Windows(简称Windows)是目前桌面电脑上常见的操作系统, 有多个不同的版本,适用于个人电脑、工作站和服务器。Windows系列操作在 桌面电脑市场的占有率于2010年底达到90%以上,可见其普及率和受欢迎程 度。Windows之所以这么受到用户欢迎的一大原因就是Windows平台上的应用 软件非常多,大部分的软件开发商都愿意首先为Windows平台开发应用,而很 多用户不愿意切换到其他操作系统就是因为其他系统上没有用户所需的某个 应用或令用户满意替代版本。
ARM架构处理器是目前非常流行的一种处理器架构,其精简指令集(RISC) 的设计比起桌面电脑处理器中常见的x86的复杂指令集(CSIC)更加高效,能 耗也更低。因此目前很多嵌入式设备或移动设备如智能手机大多都采用了ARM 架构的处理器。然而由于ARM的指令集与x86指令集完全不同,无法在ARM 处理器上运行传统桌面电脑的Windows操作系统,因而也无法运行Windows 操作系统中的众多软件。
Wine是一个在x86处理器上的模拟运行环境,利用Wine可在其他操作系 统(通常为类Unix的操作系统如Linux)中直接运行Windows的可执行程序。 因此利用Wine能够在不同操作系统上直接获得Windows环境下丰富的应用资 源,很多Windows应用不需要进行任何修改(不需要重新编译)就能直接在 Wine中运行,并且保持较高的运行效率。然而Wine只支持x86的处理器架构, 并不支持ARM,因而无法在目前众多基于ARM的设备上运行。
发明内容
本发明提出一种将Wine从x86移植到ARM平台的方法,从而使得ARM平 台上也能运行众多的Windows程序,应用开发商能够快速地将原有的应用部署 到目前众多的基于ARM的设备中,获得更多经济效益。
要将原为x86架构CPU编写的Wine模拟器移植到ARM架构的CPU上,首 先需要解决的问题就是把x86指令集的机器代码转换为ARM指令集的机器代 码。对于使用C等高级语言编写的源代码,只需要在PC上使用生成ARM架构 机器代码的编译器交叉编译即可。但Wine为了更有效地控制底层硬件,有一 部分源代码是使用汇编代码编写的,由于汇编代码是与CPU指令集有关的,因 此需要手工将这些汇编代码改写成ARM指令集的汇编代码。具体的方法是:将 x86汇编的指令逐条改写为对应的ARM汇编指令,并将指令中的操作数从x86 寄存器改为ARM寄存器。由于x86指令集和ARM指令集的差异性,对于不存在 对应ARM汇编指令的x86指令,需要使用多条ARM汇编指令来实现对应与对应 x86汇编指令相同的功能。
所要改写的汇编代码有以下几部分:
●loader/preloader.c中的所有汇编代码;
●libs/wine/port.c中的wine call on stack函数;
●libs/wine/port.c中的wine switch to stack函数。
另有一些数据结构并不是汇编指令,但也与具体的CPU有关。Wine中的 CONTEXT数据结构用于表示CPU的寄存器上下文,寄存器上下文指某一时刻CPU 所有寄存器的值,存储CPU在这一时刻的状态。不同的CPU具有不同的寄存器 集合,所以表示它们的寄存器上下文的CONTEXT数据结构也不同。Wine在 wine/include/winnt.h中提供了ARM的CONTEXT数据结构定义,但代码中却 并没提供有关的代码实现,需要加以补充,增加ARM寄存器上下文保存、恢复、 复制以及具体寄存器值提取的函数。
Wine中运行的Windows可执行映像格式为PE(Portable Executable), 其文件头中有一个字段指明此可执行文件是针对哪一种CPU的,称为CPU架构 签名。对于ARM处理器,这个字段的值为IMAGE FILE MACHINE ARM或 IMAGE FILE MACHINE THUMB,这两个常数的值分别是0x01c0和0x01c2。Wine 不能识别这两个CPU架构签名,所以无法装载或运行ARM的可执行映像。因此 要添加对这种CPU架构签名的支持,需要修改kernel32/process.c。
定义在include/shtypes.idl中的数据结构ITEMIDLIST如下:
其中SHITEMID的定义为:
这里数组abID的大小可变,其大小记录在字段cb中,这个数组用来存 放文件名。当文件名的长度为奇数时,数据结构SHITEMID的大小是奇数,从 而ITEMIDLIST的大小也是奇数,因而不与长字或字的边界对齐。在实际使用 中,好几个SHITEMID数据结构会首尾相连叠在一起,形成一个列表。这样, 如果第一个SHITEMID数据结构的大小是奇数,第二个SHITEMID数据结构的起 点就不与长字或字的边界对齐了。x86处理器允许这样的不对齐的地址访问, 但ARM处理器只允许与长字或字边界对齐的内存访问,否则就不保证操作的正 确性。由于这个原因,当CPU从非对齐的SHITEMID数据结构中读取其cb字段 的数值时,所得到的可能是个错误的数值。本发明通过对有关的函数 ILGetSize、ILGetNext进行修改来解决这个问题,ILGetSize函数用于获得单 个SHITEMID数据结构的大小,ILGetNext函数用于获得SHITEMID数据结构组 成的列表中某一项的下一项地址。修改方法为:在ILGetSize函数计算单个 SHITEMID结构大小以及ILGetNext函数计算下一项地址时,新增一个 _insigma_align函数计算cb部分的大小,其计算方法是如果abID数组的大 小为奇数的话,就在此数值上加1,使其与长字或字的边界对齐。通过复制一 组SHITEMID数据结构形成一个列表的时候,实际复制的长度取决于ILGetSize 函数的返回值,而返回值经过了_insigma_align函数调整,地址一定是偶数。 因此在一个列表中,每一个SHITEMID数据结构的起点就都是与长字或字的边 界对齐的,解决了ARM处理器访问内存时边界必须对齐的问题。
附图说明
图1是本发明实施例的将Wine从x86移植到ARM平台的流程图。
具体实施方式
如图1所示。本实施例的将Wine从x86移植到ARM平台的流程包括如下 步骤:
第一,将x86汇编的指令逐条改写为对应的ARM汇编指令,并将指令中 的操作数从x86寄存器改为ARM寄存器。由于x86指令集和ARM指令集的差异 性,对于不存在对应ARM汇编指令的x86指令,需要使用多条ARM汇编指令来 实现对应与对应x86汇编指令相同的功能。
具体的实现方法是通过增加宏定义_arm_来在编译时控制编译ARM专用 的代码,因此ARM的汇编代码会被检测_arm_宏是否定义的条件编译语句包 围。由于有较多的源代码涉及到x86汇编代码到ARM汇编代码的转换,因此这 里只针对libs/wine/port.c中的wine_call_on_stack函数进行举例说明。 wine_call_on_stack函数在转换后的代码如下:
以上代码保留_i386_宏的条件编译指令包围的x86的汇编代码(x86的 具体代码使用“......”省略),新增用_arm_宏的条件编译指令包围 的ARM汇编代码,其代码内容是将x86的对应指令按照功能改写为ARM汇编指 令。
第二,增加ARM表示寄存器上下文的CONTEXT数据结构步骤如下:
1、在dlls/ntdll目录下创建名为signal_arm.c的文件,其中需要实现 与原signal_i386.c相同的函数,包括save_context、restore_context等 函数。
2、在dlls/ntdll/thread.c中有个函数copy_context,需要增加对ARM 的CONTEXT与x86的CONTEXT中不同的字段的复制代码。
3、在WineServer的代码中,需要在server目录下面创建名为 context_arm.c的文件,其中需要实现与原context_i386.c相同的函数,例 如copy_context、get_context_ip等函数。
第三,增加对ARM架构可执行映像PE头文件CPU架构签名支持的具体方 法是修改kernel32/process.c中的start_process函数为:
以上代码中增加了对头文件的CPU架构签名字段(FileHeader.Machine) 为IMAGE FILE MACHINE THUMB或IMAGE FILE MACHINE ARM时的情况判断,使 得ARM处理器的可执行文件能够被加载运行。
第四,ITEMIDLIST数据结构的存储位置修正需要修改ILGetSize和 ILGetNext函数,分别都要在计算ITEMIDLIST数据结构大小时增加对 _insigma_align函数的调用,_insigma_align函数的定义如下:
以上函数被_Insigma_宏定义的条件编译包围,即定义了_Insigma_ 宏后才提供存储位置修正。_insigma_align函数提供的修正方法是若abID 数组的大小为奇数的话,就在此数值上加1,使其与长字或字的边界对齐。
修改后的ILGetSize函数和ILGetNext函数如下:
以上两个函数在计算SHITEMID数据结构大小时根据是否定义了 _Insigma_宏来决定是否调用_insigma_align函数获得修正后的SHITEMID 数据结构大小或下一SHITEMID数据结构的起始地址。
机译: Jamaramento到Marmar油田的勘探平台的结构,钻井Marmar油田的“海上”钻井平台的对准方法和油井的海上井口对准方法
机译: 用于跨平台移植业务应用程序并使它们在目标平台上上下文相关的系统和方法
机译: 用于业务应用程序跨平台移植并使它们以目标平台为中心的统一意识的系统和方法