天天看点

Linux内核中实现Wineserver机制浅析

    Wine是“Wine Is Not an Emulator”的缩写,它是一个Windows模拟器ljJ,即在Linux用户空间仿真Windows操作系统环境,并提供了连接Windows应用程序与Linux内核的库文件,从而实现了让Windows应用程序在Linux上运行。Wine的作用主要有两个方面:对Windows应用程序来说,Wine为其提供了Windows操作系统的仿真环境,包括Windows操作系统中的对象、事件、句柄等功能结构以及相关的运行机制。·对Linux操作系统来说,Wine只是运行于其上的一个应用程序。Windows应用程序与Wine之间的通信对Linux来说是透明的。 Wine的运行结构如图所示。其中,Linux运行环境包括库文件、Linux内核结构以及与硬件交互的设备驱动程序。

Linux内核中实现Wineserver机制浅析

    在Wine中,主要包括了如下几个功能模块:·Windows DLL。Wine提供了各种Windows动态链接库文件,包括Wine内置的和原生的动态库,使用原生的动态库函数能够保证其与对应的Windows应用程序的功能需求完全兼容。内置的动态链接库则替换了Windows原生的动态库。

    ●Windows Core DLL。包括NTDLL、KERNEL32、GDl32和USER32这四个DLL[这四点DLL本人也不太了解,文章来自www.lunwenroom.com/jisuanjilei/560_2.html,大家不知道能不能看明白],它们都是Windows的内核文件,其他Windows DLL都建立在这些核心DLL基础上。·Wine Server。作为Wine体系结构中最核心的组件,Wineserver主要在Linux用户空间仿真了Windows操作系统环境,同时还处理来自应用程序的所有服务请求。·Wine Executable。主要是加载Windows映像文件并在Linux内核中创建一个Linux进程来运行该应用程序。

    ●Wine Drivers。支持Windows设备驱动。如果Windows程序在Linux中使用驱动,必需是Wine已经实现了Windows驱动的API与Linux驱动接口粘合的代理功能。目前Wine对Windows设备驱动的支持有待完善。

    Wineserver的运行机制

    Wineserver在Linux用户空间仿真了Windows操作系统环境,同时还提供了Windows进程及线程运行所需要的各种服务,包括进程间通信、同步机制和对象管理等。Windows线程创建时,首先需要与Wineserver建立socket连接,之后与Wineserver之间的通信都是通过该socket进行的。当Window线程需要请求Win32 API服务时,通过socket来通知Wineserver。Wineserver执行相关的操作,并在操作结果返回给Windows线程之前将其设置为等待状态。Wineserver本身是一个进程,它在一个无限循环中检测是否有Windows线程请求服务。Wineserver接收并处理Windows线程的服务请求的过程如图

Linux内核中实现Wineserver机制浅析

    在上图中, Winerserver处理多个Windows线程的服务请求的过程如下:

    1、线程1向Wineserver请求服务A。

    2、Wineserver收到服务请求以后将线程1设置为睡眠状态,并处理相应的服务请求。当需要Linux内核服务时,向Linux内核发出相关的系统调用请求。socket唤醒线程1以后,再来处理服务请求B。

    4、Wineserver处理完服务请求B时,再通过socket唤醒线程2。如果此时没有新的服务请求,则Wineserver继续轮询所有的socket连接直到有新的服务请求到来。    3、Wineserver正在处理服务请求A时,另外一个线程2也向Wineserver请求服务B。此时,Wineserver只是将线程2设置为睡眠状态。当Wineserver处理完服务请求A,并通过

转载于:https://blog.51cto.com/1812930/1353742

继续阅读