如果你是 Linux 用户,尤其是深度操作系统(deepin)的用户,你可能对 Wine 这个名字并不陌生。Wine,全称“Wine Is Not an Emulator”,是一个允许你在非Windows系统上运行Windows应用程序的兼容层。本文将带你深入了解Wine的工作原理,并指导你如何开始Wine的开发之旅。
1. Wine 简介
Wine并不是一个模拟器,而是一个Windows API的实现兼容层。这意味着Wine不需要模拟硬件CPU,而是模拟Windows的行为,允许Windows应用程序在Linux等操作系统上运行。
2. Wine的工作原理
Wine的核心目标是运行Windows的可执行程序(PE)。这些程序本质上是按照特定规则排列的机器码。由于大多数PC机使用的是x86/x64架构,Windows应用程序从指令集角度看,可以直接在Linux机器上运行,无需硬件层模拟。
Wine需要满足一些ABI兼容要求,以直接加载运行PE文件。例如,Windows PE程序会假定自己被加载到地址0x400000处。Wine实现自己的loader,确保PE镜像加载到同样的位置。对于动态链接的程序,Wine需要模仿Windows loader的行为,加载依赖库,并进行重定位工作。
Wine至少实现了GDI32、KERNEL32、USER32三个动态库,因为其他库都建立在这三个库的基础之上。理论上,其他动态库可以直接使用Windows上的现有库,但Wine倾向于尽量实现所有API。
3. 开发环境搭建
以deepin为例,首先获取Wine的代码:
git clone git://source.winehq.org/git/wine.git
然后安装开发依赖:
sudo apt install gcc-multilib flex bison libx11-dev:i386 ...
接着运行配置脚本:
./configure --with-gnutls --without-hal --without-oss
根据需要调整依赖库和参数。Wine源码较大,编译耗时,可以根据CPU情况增加并行参数,如make -j8
。
4. 使用Wine
运行Wine配置工具:
./wine winecfg
可以设置默认容器,位于HOME
目录下的.wine
。环境变量WINEPREFIX
用来修改当前容器路径。
5. 开发实践
Wine的源码目录结构如下:
dlls
目录存放所有API的实现。loader
目录是Wine启动、加载相关的代码。programs
存放外部程序的代码,如注册表管理工具regedit
。server
是Wine server的实现。
开发过程中,可以根据需要修改代码,然后在相应模块目录下重新make
以快速验证。
6. 其他
Wine的开发仍然活跃,感兴趣的开发者可以加入,为Linux生态贡献力量。
7. 更新
7.1 新的WOW64
从Wine 8开始,Wine开始实现PE Conversion开发过程,重新实现了WOW64机制。此模式下,只需编译一份Wine,即可运行32位和64位程序。
7.2 其他架构
通过DBT技术,在ARM及其他架构上已有运行Wine的方案,如Box64项目。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。