Wine 开发者指导/架构概览

Wine是一个实现Windows API的开源库,用于在非Windows操作系统上运行Windows应用程序。它不模拟CPU,而是直接实现API。Wine通过启动单独的进程来处理Win32进程,对Win16任务则在一个称为WOW的专用进程中运行。Wine架构接近Windows NT,包含Wine服务器,用于进程间通信和同步。内置DLL的实现涉及中继、Thunks和DLL描述符,Wine还使用Unix驱动程序访问硬件。原生和内置DLL之间有各自的优缺点,加载顺序可以通过winecfg设置。
摘要由CSDN通过智能技术生成

Wine 开发者指导/架构概览

中文翻译 https://wiki.winehq.org/Wine_Developer's_Guide/Architecture_Overview#Memory_management

1 Wine的概览

1.1 前言

Wine常常被看做一个缩写,代表“Wine Is Not an Emulator”。有时它也被称为“Windows模拟器”。从某种意义上说,这两种意义都是正确的,只是从不同的角度来看。第一个含义是,Wine不是虚拟机,它不模拟CPU,也不应该在W天上安装Windows或任何Windows设备驱动程序;相反,Wine是Windows API的一个实现,可以用作将Windows应用程序移植到Unix上的库。显然,第二个含义是,对于Windows二进制文件(.exe文件),Wine确实看起来像Windows,并且相当接近地模拟了它的行为和怪癖。

注意:“模拟器”的观点,就好像Wine是一个典型的低效模拟层,是不应该被认可的。Wine不会很慢 - 对设计不当的Windows API的忠诚可能会在某些情况下产生较小的开销,但是这可以通过运行Wine的Unix平台的更高效率来平衡,其他可能的抽象库(如Motif,GTK+,CORBA等)的运行时间开销通常与Wine’s相当。

1.2 可执行文件

Wine的主要任务是在非Windows操作系统下运行Windows可执行文件。它支持不同类型的可执行文件:

  • DOS可执行文件。那些更老的程序,使用DOS格式(.com或.exe(后者也称为MZ))。
  • Windows NE可执行文件,也称为16位。它们是由Windows 2.x和3.x运行的原生进程。 NE代表New Executable <g>。
  • Windows PE可执行文件。这些程序是在Windows 95中引入的(并成为所有后续更高版本Windows的原生格式),即使仍支持16位应用程序。 PE(Portable Executable)在某种意义上表示可执行文件的格式(作为文件)独立于CPU(即使文件的内容,也即代码,与CPU相关)。
  • Winelib可执行文件。这些是使用Windows API编写的应用程序,但编译为Unix可执行文件。 Wine提供了创建这种可执行文件的工具。

让我们快速查看受支持的可执行文件的主要区别:

DOS (.COM or .EXE) Win16 (NE) Win32 (PE) Win64 (PE) Winelib
多任务处理 同时只使用一个应用程序(除了TSR) 合作的 先占式 先占式 先占式
地址空间 1MB内存,每个应用程序都在内存中加载和卸载。 所有16位应用程序共享一个地址空间,保护模式。 每个应用程序都有自己的地址空间。需要获得CPU的MMU支持。 每个应用程序都有自己的地址空间。需要获得CPU的MMU支持。 每个应用程序都有自己的地址空间。需要获得CPU的MMU支持。
Windows API 没有Windows API,而是DOS API(比如Int 21h traps)。 会调用16位Windows API。 会调用32位的Windows API。 会调用32位的Windows API。 会调用32/64位的Windows API,可能也会调用Unix API。
代码(CPU级) 只在x86上以实模式可用。代码和数据是分段的,有16位偏移量。处理器处于实模式。 只在IA-32架构上可用,代码和数据都是分段式的,有16位偏移量(因此得名)。处理器处于保护模式。 在数个(带有NT的)cpu上可用,包括IA-32。在这个CPU上,使用一个带有32位偏移量的平面内存模型(因此得名) 只能在AMD64和AArch64架构上使用。 带有32/64位地址的平板模式(Flat model)
多线程 不可用 不可用 可用 可用 可用,但对于线程和同步,必须使用Win32/64 API,不能使用Unix API

Wine通过为每个Win32进程启动一个单独的Wine进程(实际上是一个Unix进程)来处理这个问题,但不适用于Win16任务。 Win16任务在同一个专用Wine进程中以不同于相互同步的Unix线程的方式运行;这个Wine进程通常被称为WOW进程(Windows上的Windows),指的是Windows NT使用的类似机制。

在WOW进程中运行的Win16任务之间的同步通常是通过Win16互斥体完成的——每当它们中的一个正在运行时,它就拥有Win16互斥体,从而阻止其他任务运行。当任务希望让其他任务运行时,线程将释放Win16互斥体,然后其中一个等待线程将获取它并让其任务运行。

winevdm 是致力于运行Win16进程的Wine进程。请注意,可能存在此进程的多个实例,因为Windows支持不同的VDM(虚拟Dos机器)以使Win16进程在不同的地址空间中运行。 Wine也使用相同的架构来运行DOS程序(在这种情况下,DOS模拟由 KRNL386.EXE 提供)。

2 标准Windows架构

2.1 Windows 9x 架构

Windows体系结构(Win 9x方式)如图:

+---------------------+        \
|     Windows EXE     |         } application
+---------------------+        /

+---------+ +---------+        \
| Windows | | Windows |         \ application & system DLLs
|   DLL   | |   DLL   |         /
+---------+ +---------+        /

+---------+ +---------+      \
|  GDI32  | | USER32  |       \
|   DLL   | |   DLL  
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值