[转]Wine的一些相关原理
来源:互联网 发布:域名转移流程 编辑:程序博客网 时间:2024/05/16 07:19
[转]Wine的一些相关原理
Wine2007-12-25 12:56:08 阅读165评论0 字号:大中小 订阅
作者:李笑天
关于把wineserver整合进linux的内核,曾经在在wine的官方有过这么一个项目,不过到2000年就没有人维护了,现在在wine的cvs里面还能看到,代码是针对kernel2.4的。它基本上实现了当时wineserver的功能,不过现在肯定用不了。
我想谈谈对wine的理解。wine分为wine客户端程序和wineserver。关于wineserver为什么要存在,主要是因为windows 的内核对象,跟linux(和其他的操作系统)的内核对象的不同,比如进程,线程,文件,信号...等等,实质上就是定义的数据结构,类型不一样,所以 windows程序运行的时候,需要启动一个虚拟的win32子系统,wineserver来管理这些对象以及一些公有的环境变量,如注册表。同时, wineserver还负责对消息和事件(主要是Xwindows事件)的同步。因此wineserver的效率以及windows程序跟 wineserver的通信机制是提高wine效率的关键。
windows程序由wine-preloader加载(加载所需的dll和共享库,完成代码的重定位)以后,首先检查wineserver是否运行,没有运行就启动它。利用socket建立连接。最新版的代码在wine/dlls/ntdll/server.c里面。wineserver运行以后,首先建立一个socket套接字,等待客户端连接,从客户端连接开始,调用create_process建立一个虚拟的windows进程,作为整个 wine的主进程,(相当于linux的init进程)。然后它创建一个pipe(管道),作为客户端和wineserver通信的工具。然后 wineserver进入main_loop()函数,main_loop主要轮训各个poll队列,读取客户端的请求,并执行相应的服务。 wineserver还具有"进程调度”的功能。因此wine的设计很具有科学性 的。
不过,由于wineserver和wineclient之间采用pipe通信,并且采用轮询的方式查询,所以效率不是很高,windows程序运行起来比较慢。因为wineserver本身是一个用户太的进程,优先级比较低,其他的因素加起来就更慢了。wineX曾经试图利用共享内存实现 wineserver跟wineclient之间的通信,事实上,效果还是比较理想,提高速度四倍。
所以,理论上说,把wineserver从用户态移植到内核里面,会显著的提高效率,而且很多用户态不能完成的事情,在内核里面都可以完成,比如,跨进程调用,跨进程读写,远程线程,全局内存分配等等。虽然这些在用户态用某些方式也能完成(比如使用ptrace函数)不过速度很慢很慢。移植到内核还可以至少节省一半的调度时间。
不过,说起来轻松,做起来比较麻烦,到底怎么移植,以何种方式移植是比较困难的事情。当然最直接的方式就是实现成系统调用,这样比较快,也容易理解。不过这样会改变现有的linux kernel 的结构,也会改变wine的结构,工作量很大。还有一种方式就是实现一个设备驱动,实现wineserer的功能,使用ioctl进行调用,这样工作量相对小一点,而且不用修改内核。还有一种有趣的方式是用netlink,linux支持netlink socket,使用它内核跟用户进程之间可以使用标准的socket函数进行通信,这样跟现有的wineserver结构很类似,工作量更小一点。我已经做过尝试,不过移植的时候还有一大堆的问题,主要还是对linux内核的一些特性不太了解,比如在内核态直接读取文件系统。不过我觉得用这种方式实现应该没什么太大的问题。如果各位有更好的方法,可以讨论讨论。
关于把wineserver整合进linux的内核,曾经在在wine的官方有过这么一个项目,不过到2000年就没有人维护了,现在在wine的cvs里面还能看到,代码是针对kernel2.4的。它基本上实现了当时wineserver的功能,不过现在肯定用不了。
我想谈谈对wine的理解。wine分为wine客户端程序和wineserver。关于wineserver为什么要存在,主要是因为windows 的内核对象,跟linux(和其他的操作系统)的内核对象的不同,比如进程,线程,文件,信号...等等,实质上就是定义的数据结构,类型不一样,所以 windows程序运行的时候,需要启动一个虚拟的win32子系统,wineserver来管理这些对象以及一些公有的环境变量,如注册表。同时, wineserver还负责对消息和事件(主要是Xwindows事件)的同步。因此wineserver的效率以及windows程序跟 wineserver的通信机制是提高wine效率的关键。
windows程序由wine-preloader加载(加载所需的dll和共享库,完成代码的重定位)以后,首先检查wineserver是否运行,没有运行就启动它。利用socket建立连接。最新版的代码在wine/dlls/ntdll/server.c里面。wineserver运行以后,首先建立一个socket套接字,等待客户端连接,从客户端连接开始,调用create_process建立一个虚拟的windows进程,作为整个 wine的主进程,(相当于linux的init进程)。然后它创建一个pipe(管道),作为客户端和wineserver通信的工具。然后 wineserver进入main_loop()函数,main_loop主要轮训各个poll队列,读取客户端的请求,并执行相应的服务。 wineserver还具有"进程调度”的功能。因此wine的设计很具有科学性 的。
不过,由于wineserver和wineclient之间采用pipe通信,并且采用轮询的方式查询,所以效率不是很高,windows程序运行起来比较慢。因为wineserver本身是一个用户太的进程,优先级比较低,其他的因素加起来就更慢了。wineX曾经试图利用共享内存实现 wineserver跟wineclient之间的通信,事实上,效果还是比较理想,提高速度四倍。
所以,理论上说,把wineserver从用户态移植到内核里面,会显著的提高效率,而且很多用户态不能完成的事情,在内核里面都可以完成,比如,跨进程调用,跨进程读写,远程线程,全局内存分配等等。虽然这些在用户态用某些方式也能完成(比如使用ptrace函数)不过速度很慢很慢。移植到内核还可以至少节省一半的调度时间。
不过,说起来轻松,做起来比较麻烦,到底怎么移植,以何种方式移植是比较困难的事情。当然最直接的方式就是实现成系统调用,这样比较快,也容易理解。不过这样会改变现有的linux kernel 的结构,也会改变wine的结构,工作量很大。还有一种方式就是实现一个设备驱动,实现wineserer的功能,使用ioctl进行调用,这样工作量相对小一点,而且不用修改内核。还有一种有趣的方式是用netlink,linux支持netlink socket,使用它内核跟用户进程之间可以使用标准的socket函数进行通信,这样跟现有的wineserver结构很类似,工作量更小一点。我已经做过尝试,不过移植的时候还有一大堆的问题,主要还是对linux内核的一些特性不太了解,比如在内核态直接读取文件系统。不过我觉得用这种方式实现应该没什么太大的问题。如果各位有更好的方法,可以讨论讨论。
- [转]Wine的一些相关原理
- 关于wine 的一些总结
- wine相关
- wine 安装一些windows软件的错误以及处理
- ubuntu12.10上安装wine遇到的一些问题
- Wine是什么-Wine能什么-Wine 工作原理
- [转]Eclipse 相关的一些资源
- Eclipse 相关的一些资源(转)
- 相关的一些专业术语
- 一些BIRT相关的
- 漫谈Wine之一: WINE的系统结构
- ViewState的一些原理
- OpenSessionInViewFilter的一些原理
- GCD的一些原理
- java的一些原理
- http的一些原理
- Wine的安装方法
- wine的使用
- ARM SWI 软中段 例程
- vim 替换^M
- 运行时动态创建报表(一)问题提出
- fgetc getc getchar fputc putc putchar
- 如何求两个有序数组的第K个数
- [转]Wine的一些相关原理
- How to Search?
- 第一次
- 成员函数指针与高性能的C++委托(下篇)
- RTEMS 的 AT91SAM9260 移植(5): 调试串口驱动
- Total Commander 7.56a
- vc串口编程使用mscomm控件的,接受字符个数多余8个时,会重复进中断的OnCommMscomm()的处理对策
- 命令提示符CMD美化
- 解决网速的问题