Wine 是一個令人神往而且目標(biāo)遠大的開放源代碼項目,它嘗試去解決在 Linux 上運行 Windows 可執(zhí)行文件的復(fù)雜問題。盡管 Wine 不是一個新項目,但是,人們對 Linux 桌面的期望以及對 Linux 應(yīng)用程序的需求日益增加,使得它現(xiàn)在仍具有重要意義。本文對 Wine 進行了介紹,并提出了幾種獲得 Wine 內(nèi)部操作經(jīng)驗的途徑。
Wine 項目起始于 1993 年,它的根源可以追溯到 90 年代早期出現(xiàn)的用于 Unix 的 Dos 和 Windows 模擬器。Wine 項目最初是將 16 位的應(yīng)用程序移植到 Linux,而幾年之后,已可以在 Linux 上運行 Microsoft Word 和 Excel。現(xiàn)在它有一百多萬行代碼。
人們一直認(rèn)為,在桌面上采用 Linux 的主要障礙是應(yīng)用程序不足。商用桌面應(yīng)用程序供應(yīng)商還不能確定他們是否應(yīng)該投入時間和精力將他們的 Windows 應(yīng)用程序移植到 Linux,他們基本上是在等待 Linux 大規(guī)模應(yīng)用于桌面。另一方面,Linux 需要應(yīng)用程序才能大規(guī)模應(yīng)用于桌面。這是一個經(jīng)典的先有雞還是先有蛋的問題,而 Wine 通過在 Linux 上運行現(xiàn)有的 Windows 應(yīng)用程序而解決了這一問題。
Wine 能做什么
Wine 項目實際是一個二合一的項目。它們提供了一個名字叫做 Winelib 的開發(fā)工具包,用于將應(yīng)用程序從 Windows 移植到 Linux(和 Unix);它們還提供了一個程序加載器,讓 Windows 二進制文件可以在 Unix 和類 Unix 系統(tǒng)中運行。本文討論的主要是后者;在 參考資料中有關(guān)于 Winelib 的更多資料的鏈接。
Wine 程序加載器讓運行于 x86 上的 Linux 和其他類 Unix 操作系統(tǒng)可以加載并運行 Windows x86 可執(zhí)行文件 -- 不過那只是它要解決的問題的一部分。因為 Windows 可執(zhí)行文件總是會鏈接到其他庫,而這些庫是 Windows 操作系統(tǒng)的一部分(如本文稍后圖 1 中的 Dependency Walker 截圖中可以看到),Wine 還最大可能限度地實現(xiàn)了那些 Windows 內(nèi)部構(gòu)件,即 Linux 上通常所指的 Win32 API5。
雖然 Windows 和 Linux 有很大的不同,但是就基本的層次而言,與任何現(xiàn)代操作系統(tǒng)一樣,還是有很多類似之處的 -- 比較明顯的包括,對文件和目錄的支持,對同時運行多個程序的支持,類似的用戶界面以及對多媒體的支持。
不是仿真器
據(jù) WineHQ的說法,“WINE 代表 Wine Is Not an Emulator(即,Wine 不是一個仿真器)。更確切地說,Wine 是 X 和 UNIX 之上對 Windows API 的一個開放源代碼實現(xiàn)。您可以認(rèn)為它是一個 Window 兼容層。Wine 不需要 Microsoft Windows,因為它是由 100% 非 Microsoft 代碼構(gòu)成的另一個實現(xiàn)。但是它可以使用本機系統(tǒng) DLL,只要這些 DLL 可用。而且它可以讓您在 Linux 或者其他類 UNIX 操作系統(tǒng)之上運行大部分 Windows 軟件。”
顯示了 callDLL.exe 的依賴,這個可執(zhí)行文件可以由本文提供的源代碼編譯得到。對一般的用戶而言,依賴的復(fù)雜度可能是驚人的,但對任何一個系統(tǒng)程序員來說都不是這樣,他們充分了解,哪怕是運行一個最簡單的程序,操作系統(tǒng)也必須要做很多事情。
考慮可執(zhí)行文件的第一個依賴 -- 對 USER32.DLL 的依賴。在 Windows 中,一個 DLL 就是一個動態(tài)鏈接庫(dynamically linked library),類似于 Linux 中的一個共享對象(一個 .so 文件)。USER32.DLL 文件通常會由操作系統(tǒng)提供,位于 C:WINDOWSsystem32 或者 C:WINNTsystem32 目錄下。這個文件中包含了 Windows API 中用于用戶界面的函數(shù)實現(xiàn)。
我們的可執(zhí)行文件調(diào)用 USER32.DLL 中的一些函數(shù),USER32.DLL 然后去調(diào)用 NTDLL.DLL 中的其他函數(shù),如此繼續(xù)。這些函數(shù)大部分已經(jīng)由 Microsoft 文檔化 -- 但是還有很多沒有被文檔化。文檔的缺乏對 Wine 來說是一個極大的障礙,本文稍后將更詳細(xì)地討論這一問題。
現(xiàn)在讓我們來看我們的可執(zhí)行文件的第二個依賴 -- 對 SIMPLEDLL.DLL 的依賴。這個 DLL 是在編譯本文所附的源代碼時創(chuàng)建的。這個 DLL 中實現(xiàn)了一些特別簡單的函數(shù);它作為常見于安裝 CD 上的各種二進制文件的例子被包括進來。
如我們的例子所示,一般的 Windows 可執(zhí)行文件有兩種類型的依賴:一種是對操作系統(tǒng)提供的二進制文件的依賴,另一種是對作為應(yīng)用程序一部分的二進制文件的依賴。
還需要特別注意的是,DLL 以難于管理而聞名,即使是在產(chǎn)生它們的 Windows 操作系統(tǒng)中也是如此(參見 參考資料)。值得一提的是,Wine 團隊成功地創(chuàng)建了一個可以在 Linux 上運行很多商用 Windows 應(yīng)用程序的框架
當(dāng)前,開放源代碼的 Wine 項目有一個健壯的平臺來運行 Windows 二進制文件以及對 Win32 API 的部分實現(xiàn)。這個項目仍然處于最初的測試階段(alpha),有很多部分還沒有完成。盡管 Wine 提供了一些工具來幫助進行配置、安裝以及運行應(yīng)用程序,但是它們大部分都是面向程序員的,要讓非技術(shù)用戶也可以使用這些工具,還有很多事情需要去做。過去的 Corel 以及現(xiàn)在的 CodeWeavers 為此提供了很多幫助。