650) this.width=650;" onclick="window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)" border="0" alt="" src="http://img1.51cto.com/attachment/201005/201005041272977129677.jpg" />
650) this.width=650;" onclick="window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)" border="0" alt="" src="http://img1.51cto.com/attachment/201005/201005041272978097661.jpg" />
WINE是32位代码,Linux中的stdcall(gcc)支持Windows常规调用,因此可以直接替换WINE处理器中的地址导入Win32代码,但对于16位模块还需要添加thunk进行地址等方面的转换。
三、WINE启动分析
  由于Linux早期版本提供的线程API不够强大,不足以实现Windows API线程部分,WINE利用Linux kernel thread重新构建了Windows线程API函数,该部分在WINE中称为WINE-kthread。随着Linux的发展,Linux后来的版本中出现了功能强大的NPTL线程子系统,WINE利用此系统提供的API函数粘合了Windows线程API函数,此部分称为WINE-pthread。WINE在启动前首先检查用户使用的线程模式并执行由WINE-pthread或WINE-kthread实现的WINE preloader。它是一个没有main主函数的ELF文件,用于在新建立的WINE进程中设置Win32类型的进程地址空间布局后转入WINE的main函数,WINE被启动。Preloader通过这种方式传递一些必要信息到libwine(WINE的动态库)中,并调用函数Wine-init进行debug功能和地址空间方面的处理。以后顺次执行:
1.-WINE-process-init建立Win32程序运行所必需的结构,如PEB、TEB、进程堆以及与WINE server的连接等。
2.-Wine-kernel-init依次执行:从WINE server获得新进程启动时必需的信息;初始化新进程的的注册以及其它相关部分;确定被加载文件的类型以后该应用程序被载入内存。
3.新载入Windows程序运行的开始。首先,start-process建立SHE,调用NtdllLdr-Initializer Thuck执行进程初始化的其他部分,如进行重定位以及调用DLL的构造函数等。最后,执行转入被载入应用程序的入口点,应用程序开始执行,WINE提供的API就可以被正确地调用了,随后当执行从应用程序返回时,调用ExitProcess函数结束该进程。
四、Win32启动分析
  从命令行启动一个WINE进程时,WIN-E首先检查操作系统使用的线程模式,启动WINE装载器。WINE从Linux中取得诸如运行环境、命令行参数等必要的资源的后依次执行:
1.              NTDLL.dll.so被Linux的标准共享库装载器载入内存,在Linux中建立PEB、TEB、进程堆以及与WINE Server的连接等。
2.              利用Windows动态装载能力加载Ke-rne132,-WINE-kernel-init处理所有装载与执行的逻辑过程,包括初始化命令行参数,在文件系统中寻找相应的可执行文件。如果没有找到,WINE装载器停止装载并返回出错信息;否则,将找到的文件载入内存,建立一个堆栈供新建立的可执行文件的进程作用,堆栈大小由该文件结构中PE-header定义。
3.              Ntdll.LdrInitializeThunk执行其他部分如解析所有在可执行文件中引用的DLL与TLS槽的初始化。
4.              执行转入到可执行文件的入口点,可执行文件开始运行。
如果有多个Win32程序要求运行,WINE为这些Win32程序分别建立WINE进程。这些Win32程序在各自的WINE进程中运行。(如图2所示)。
 
 
 
五、Winelib启动分析
Win 16
程序

Win 16
程序

WINE
VDM

Win32
程序

WINE
Process

Win32
程序

WINE
Process

 
WINE
 
SERVER

 
X显示
 
服务器

 
 
 
 
 
 
 
 
 
 
 
图2
Winelib(假定有一个文件example.exe)对应有两个文件:example为一个链接到WINE装载器的符号链接;example.exe.so相当于一个Linux中的动态连接库。
从命令行启动一个Winelib程序时,Linux shell将example作为一个Linux的可执行文件。由于它实际是WINE的一个装载器,所有WINE被启动并利用Linux的共享库机制加载第二个文件example.exe.so。WINE根据文件的描述符确认它是一个32位模块,于是共享库被加载,再处理该可执行文件的导入节,调用全局对象的构造器,便于以后加载动态库函数,最后执行转入可执行文件的入口点,载入的文件开始运行。
六、Win16DOS程序启动分析
一个Win16程序要求运行时,WINE将该程序交给虚拟DOS机(VDM)。虚拟机首先建立一个16位的运行环境,Win16程序就在该虚拟环境中运行。此后由该程序创建的子程序均在同一虚拟机实例中运行。虚拟机为16位的进程提供了诸如多任务协作,共享地址空间,管理为16位进程建立的代码段、数据段与堆栈段的选择器等功能。
DOS程序的启动与Win16的启动过程类似,对虚拟机对DOS程序还采用互斥机制保证DOS程序的运行是单线程的,如图2所示。
七、Wine实战
我们可以在http://fedoraproject.org/wiki/AndreasBierfert/Wine下载到针对Fedora12的Wine最新版本是1.1.38 当下载到tar包后Cd到安装目录中运行wineinstall(安装释放文件)文件,之后它会运行./configure,然后显示:We need to install wine as root user, do you want us to build wine,'su root' and install Wine? Enter 'no' to continue without installing(yes/no) 我们选yes并回车如果在此处出现错误,请检查此命令的输出,如果他没有找到一些需要的包,而你又希望使用那个包提供的功能时,请安装相应的 devel 包。
如果你root用户设置了密码,还会提示你输入密码。
  待屏幕上出现:
  Installation complete for now. Good luck (this is still alpha software).
  If you have problems with WINE, please read the documentation first,
  as many kinds of potential problems are explained there.
 看到这条提示,则表示安装成功了。
 在shell下运行wine,第一次运行不成功,这是正常,因为没有在/root/.wine/config文件里配置好.找到这些吧。
  [Drive C]
  "Path" = "/usr/share/win_c"
  "Type" = "hd"
  "Label" = "MS-DOS"
  "Filesystem" = "win95"
  改为:[Drive C]
  "Path" = "/winc"
  "Type" = "hd"
  "Label" = "MS-DOS"
  "Filesystem" = "win95"
  就可以了,如果你安装了simsun字体.wine默认就会找到这个字体的。
  我们在运行windows 程序时,常常会出现看不到中文的情况,那是因为在GBK或 GB2312 编码状态下可以输入中文,但如果没有进行默认编码设置,就无法输入中文。
通过设置locale可以解决。具体方法如下:
编辑.bashrc文件在该文件尾部添加如下两行:
export LANG=zh_CN.gb2312
export LC_ALL=zh_CN.2312
重新运行bash后敲入locale命令,默认的编码就会显示GB2312
另外,还有就是如果没有中文字体也无法显示中文,自然也就看不见汉字。
下一步该运行应用程序 了,可以通过两种方式运行:
1.自动运行
  在KDE或者GNOME的文件管理器中切换到应用程序所在目录,单击就可以打开。虽然程序运行速度十分缓慢,不过聊胜于无。
2.手工运行
  在Console模式下,键入以下命令: wine <将要运行的应用程序>
3.举个例子来说吧
  想要通过WINE在Linux下使用Winzip,这么做呢? 重新运行winesetup,在配置Windows安装路径窗口中,选择“Create a new windows directory(创建一个新的Windows安装目录)”,其它的一切都很简单,在Linux中直接运行Winzip安装文件安装Winzip然后就可以调用了。
总结
本文对在Linux系统中运行Windows程序的一种实现--WINE内核运行的机理和实例进行了详尽分析。在比较了Windows程序转移到Linux中各种技术实现及各自特点的基础上,阐述了WINE的体系结构及各部分的功能,并通过对不同类型Windows程序启动过程的分析,揭示了WINE在Linux中创建Win32线程/进程环境与调用动态链接库的技术。由于当前Linux平台上应用程序的类型与数目不多,大部分企业还不能确定是否应该将Windows应用程序移植到Linux系统中,更多的厂商在等待Linux系统大规模应用于桌面。将Windows应用程序移植到Linux环境中运行对于此难题的解决则是一个非常有效的方式。

本文出自 “李晨光原创技术博客” 博客,谢绝转载!

基于Linux系统WINE虚拟机技术的研究的更多相关文章

  1. 基于Linux系统的Nagios网络管理模块的实现

    基于Linux 系统的Nagios网络管理模块的实现 1.引言 随着计算机网络的普及,网络管理已成为信息时代中最重要的问题之一.在现有的技术条件下,人们希望有一个更加稳定可靠的网络环境.计算机网络管理 ...

  2. 关于linux系统如何实现fork的研究(二)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 前一篇关于linux系统如何实现fork的研究(一)通过代码已经说明了从用户态怎么通过软中断实现调用系统调 ...

  3. 关于linux系统如何实现fork的研究(二)【转】

    转自:http://www.aichengxu.com/linux/7166015.htm 本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 前一篇关于li ...

  4. 基于Linux系统geth的安装

    转载地址 https://blog.csdn.net/qq_36124194/article/details/83658580 基于Linux系统geth的安装 安装ethereum sudo apt ...

  5. 005.操作系统及Linux系统,虚拟机的作用和发展历史

    操作系统及其作用 操作系统发展史 Linux系统 虚拟机 操作系统 操作系统 操作系统的作用 不同领域的主流操作系统 操作系统(Operation System,OS) 操作系统作为接口的示意图 没有 ...

  6. 基于Linux系统的病毒

    虽然在Linux里传播的病毒不多,但也是存在一些,我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...

  7. 安全威胁无孔不入:基于Linux系统的病毒(转)

    虽然在Linux里传播的病毒不多,但也是存在一些.我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...

  8. 关于linux系统如何实现fork的研究(一)

    引言     fork函数是用于在linux系统中创建进程所使用,而最近看了看一个fork()调用是怎么从应用到glibc,最后到内核中实现的,这片文章就聊聊最近对这方面研究的收获吧.我们主要聊聊从g ...

  9. 关于linux系统如何实现fork的研究(一)【转】

    转自:http://www.aichengxu.com/linux/4157180.htm 引言 fork函数是用于在linux系统中创建进程所使用,而最近看了看一个fork()调用是怎么从应用到gl ...

随机推荐

  1. Java的几个有用小Util函数(日期处理和http)

    /**      * 依据日期返回当前日期是一年的第几天      * @param date      * @return      */     public static int orderDa ...

  2. hdu 1102 Constructing Roads(kruskal || prim)

    求最小生成树.有一点点的变化,就是有的边已经给出来了.所以,最小生成树里面必须有这些边,kruskal和prim算法都能够,prim更简单一些.有一点须要注意,用克鲁斯卡尔算法的时候须要将已经存在的边 ...

  3. IIS集成和经典配置

    检測到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式).  我们将ASP.NET程序从IIS6移植到IIS7,可能执行提示下面错误: HTTP 错误 500. ...

  4. 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 添加 Maps数据类型并非非常突然,由于这个提议已经进行了2~3年之久,仅仅只是Joe Armstrong老爷子近期一篇文章Big changes to Erlang掀起不小了 ...

  5. Codeforces Round #316 (Div. 2) B. Simple Game

    思路:把n分成[1,n/2],[n/2+1,n],假设m在左区间.a=m+1,假设m在右区间,a=m-1.可是我居然忘了处理1,1这个特殊数据.被人hack了. 总结:下次一定要注意了,提交前一定要看 ...

  6. BZOJ 3211 线段树+并查集

    思路: 我们很容易发现 一个数开根号 开几(很小)次 就到了1 1 再怎么开 都是1 由于这个性质 我们就可以用并查集 了 //By SiriusRen #include <cmath> ...

  7. C++ BigInteger模板

    #include <cstdio> #include <cstring> #include <string> #include <iostream> # ...

  8. 关于IDEA无法完整显示项目文件结构

    今天发现一个奇怪的问题,就是我从本地导入了文件,明明已经成功了,但是在我的项目结构里面就是不显示,然而点击目录, 又能打开相应的文件,如图所示: 其实这个打开的只是包文件,只需要如下图操作即可:

  9. 在AT151上面测试串口通讯

    如下图所示,分别用putty打开两个窗口,一个是串口打开的,另外一个是网口连接的,分别是接收和发送,硬件上面RXD和TXD进行短接进行数据回流. 使用microcom工具,ctrl+x可以退出 参考文 ...

  10. flex RemoteObject 的两种使用方法

    这里使用的是django1.6 和 postgreSQL9.0  FlashBuilder4.5 django方面就不说了,根据文档来做,建好模块,配置好数据库等等 创建 gateway 和 time ...