zoukankan      html  css  js  c++  java
  • [转]Wine的一些相关原理

    [转]Wine的一些相关原理

    Wine 2007-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内核的一些特性不太了解,比如在内核态直接读取文件系统。不过我觉得用这种方式实现应该没什么太大的问题。如果各位有更好的方法,可以讨论讨论。
  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/xiayong123/p/3717316.html
Copyright © 2011-2022 走看看