如果你是 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项目。

支持ing
阅读更多


慵懒的猫mi
1 声望0 粉丝