Wine 是一个令人神往而且目标远大的开放源代码项目,它尝试去解决在 Linux 上运行 Windows 可执行文件的复杂问题。尽管 Wine 不是一个新项目,但是,人们对 Linux 桌面的期望以及对 Linux 应用程序的需求日益增加,使得它现在仍具有重要意义。本文对 Wine 进行了介绍,并提出了几种获得 Wine 内部操作经验的途径。
Wine 项目起始于 1993 年,它的根源可以追溯到 90 年代早期出现的用于 Unix 的 Dos 和 Windows 模拟器。Wine 项目最初是将 16 位的应用程序移植到 Linux,而几年之后,已可以在 Linux 上运行 Microsoft Word 和 Excel。现在它有一百多万行代码。
人们一直认为,在桌面上采用 Linux 的主要障碍是应用程序不足。商用桌面应用程序供应商还不能确定他们是否应该投入时间和精力将他们的 Windows 应用程序移植到 Linux,他们基本上是在等待 Linux 大规模应用于桌面。另一方面,Linux 需要应用程序才能大规模应用于桌面。这是一个经典的先有鸡还是先有蛋的问题,而 Wine 通过在 Linux 上运行现有的 Windows 应用程序而解决了这一问题。
Wine 能做什么
Wine 项目实际是一个二合一的项目。它们提供了一个名字叫做 Winelib 的开发工具包,用于将应用程序从 Windows 移植到 Linux(和 Unix);它们还提供了一个程序加载器,让 Windows 二进制文件可以在 Unix 和类 Unix 系统中运行。本文讨论的主要是后者;在 参考资料中有关于 Winelib 的更多资料的链接。
Wine 程序加载器让运行于 x86 上的 Linux 和其他类 Unix 操作系统可以加载并运行 Windows x86 可执行文件 -- 不过那只是它要解决的问题的一部分。因为 Windows 可执行文件总是会链接到其他库,而这些库是 Windows 操作系统的一部分(如本文稍后图 1 中的 Dependency Walker 截图中可以看到),Wine 还最大可能限度地实现了那些 Windows 内部构件,即 Linux 上通常所指的 Win32 API5。
虽然 Windows 和 Linux 有很大的不同,但是就基本的层次而言,与任何现代操作系统一样,还是有很多类似之处的 -- 比较明显的包括,对文件和目录的支持,对同时运行多个程序的支持,类似的用户界面以及对多媒体的支持。
不是仿真器
据 WineHQ的说法,“WINE 代表 Wine Is Not an Emulator(即,Wine 不是一个仿真器)。更确切地说,Wine 是 X 和 UNIX 之上对 Windows API 的一个开放源代码实现。您可以认为它是一个 Window 兼容层。Wine 不需要 Microsoft Windows,因为它是由 100% 非 Microsoft 代码构成的另一个实现。但是它可以使用本机系统 DLL,只要这些 DLL 可用。而且它可以让您在 Linux 或者其他类 UNIX 操作系统之上运行大部分 Windows 软件。”
显示了 callDLL.exe 的依赖,这个可执行文件可以由本文提供的源代码编译得到。对一般的用户而言,依赖的复杂度可能是惊人的,但对任何一个系统程序员来说都不是这样,他们充分了解,哪怕是运行一个最简单的程序,操作系统也必须要做很多事情。
考虑可执行文件的第一个依赖 -- 对 USER32.DLL 的依赖。在 Windows 中,一个 DLL 就是一个动态链接库(dynamically linked library),类似于 Linux 中的一个共享对象(一个 .so 文件)。USER32.DLL 文件通常会由操作系统提供,位于 C:WINDOWSsystem32 或者 C:WINNTsystem32 目录下。这个文件中包含了 Windows API 中用于用户界面的函数实现。
我们的可执行文件调用 USER32.DLL 中的一些函数,USER32.DLL 然后去调用 NTDLL.DLL 中的其他函数,如此继续。这些函数大部分已经由 Microsoft 文档化 -- 但是还有很多没有被文档化。文档的缺乏对 Wine 来说是一个极大的障碍,本文稍后将更详细地讨论这一问题。
现在让我们来看我们的可执行文件的第二个依赖 -- 对 SIMPLEDLL.DLL 的依赖。这个 DLL 是在编译本文所附的源代码时创建的。这个 DLL 中实现了一些特别简单的函数;它作为常见于安装 CD 上的各种二进制文件的例子被包括进来。
如我们的例子所示,一般的 Windows 可执行文件有两种类型的依赖:一种是对操作系统提供的二进制文件的依赖,另一种是对作为应用程序一部分的二进制文件的依赖。
还需要特别注意的是,DLL 以难于管理而闻名,即使是在产生它们的 Windows 操作系统中也是如此(参见 参考资料)。值得一提的是,Wine 团队成功地创建了一个可以在 Linux 上运行很多商用 Windows 应用程序的框架
当前,开放源代码的 Wine 项目有一个健壮的平台来运行 Windows 二进制文件以及对 Win32 API 的部分实现。这个项目仍然处于最初的测试阶段(alpha),有很多部分还没有完成。尽管 Wine 提供了一些工具来帮助进行配置、安装以及运行应用程序,但是它们大部分都是面向程序员的,要让非技术用户也可以使用这些工具,还有很多事情需要去做。过去的 Corel 以及现在的 CodeWeavers 为此提供了很多帮助。