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