[心得] Wine 簡介

看板Linux作者 (Rex Tsai)時間13年前 (2011/04/08 00:44), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串1/1
[2]Wine – 在 Linux 中使用 Windows 程式 = 簡介 = 自從 [3]Wine 1.0 在[4] 2008 年六月釋出之後,便開始以兩、三周為週期,開始固定的 釋出[5]新版。Wine 是針對 POSIX 相容的作業系統所設計,目前 Wine 已經被移植許多平 臺上,除了 Linux 外,也可以在 Solaris, FreeBSD, x86 版本的 Mac OS 上使用。經過 長期的開發與社?支援,目前在?[6]Appdb 中已有超過一萬六千個軟體測試報告,其中有 將近 3000 筆是屬於[7]高度可用 (Platinum List) 的軟體。 在 Appdb 中仍有大量的軟體存在執行的問題,造成使用困擾,甚至無法使用。這與 Wine 的設計有關,Wine 跟?[8]Dosbox,?[9]zsnes 不同,既不是[10]模擬器,也不是[11]虛擬 機器。它是以軟體方式模擬出 Windows? 作業系統所需的軟體架構 (Software Stack),理 論上只新增一層 software layer 會比虛擬化成本低廉。 雖然 Wine 計劃經過十幾年發展,但是市面上目前為止沒有任何書籍介紹 Wine 及其程式 架構,開發者只能參考少數幾份[12]線上文件與 [13]Wiki 來理解 Wine 的程式架構。本 文稍加介紹 Wine 的相關設計。 = 軟體架構與初始化簡介 = 根據?[14]Wine Developer’s Guide,軟體架構如下 [15][wine-262x300] 要在 UNIX 中模擬一個 Windows? 作業系統,有許多差異需要克服,且 Wine 為了開源授 權的合法性,並不對 Windows? 本身進行反組譯,而是用[16]黑箱測試法所開發出來,並 參照開發文件逐步實做所有的 Win32 APIs。問題在與 Win32 API 文件並沒有完全開放, 不同版本作業系統間,也有些微行為上的差異。然而 Windows? 有著為數不少缺乏文件的 APIs. 甚至錯誤的 API 反應等等,Wine 都需要一一的實踐。加上仍有一些未開放的[17] 低階 API,以及一些缺乏文件的協定或設計,Wine 計劃可以說是以血淚走過來的開發工作 。 以 Wine 模擬 Windows??最重要的功能之一就是 Wine server, 它基本上是提供作業系統 核心模擬的功能,負責[18] Inter-Process Communication (IPC), synchronization 與 process/thread management 等等工作。Wine server 是一個獨立的程序,每次啟動任何 Windows 程式前,它會優先被叫起。若出現了什麼問題,也要確保砍掉 (kill) 它後,才 能乾淨的重新執行。 而在 Wine preloader 載入 .[19]COM / [20]NE / [21]DLL /?[22]PE 前,由於每個程序 都將使用自己的[23]記憶體空間,Wine?要先依照不同的執行檔格式需求建立 Memory layout,為了能夠在 Linux 中製造出跟 Win32 一樣的記憶體位置,除了試圖將相關的 DLLs 載到正確的記憶體位置。Wine 也要避免 dynamic linker 預先把 Wine 所需的函式 庫配置 (mapping) 到錯誤的位址,於是修改預設的 ELF 初始化程序,以 syscall 將相關 的函式庫配置到正確的位置。 另外在 Windows? 中,每個 process 或 thread 有一塊資料結構稱做 Environment Block (PEB – Process Environment block or TEB – Thread Environment Block),這些資料中 包含了 [24]TLS slots, message queue, error code (SEH,?[25]Structured Exception Handling) 等等,這塊資料結構提供了 Windowing, Threading 以及錯誤處理等所需資訊 。在建立 PEB/TEB 後,才初始化?[26]process heap,載入執行檔,依照執行檔指示建立? [27]stack,最後才將控制權交給執行檔的?[28]EntryPoint。 上述工作均由 NTDLL/KERNEL32 處置,NTDLL/KERNEL32 也會負責傳遞執行序資訊給 Wine Server.?至於啟動後的 [29]Graphics Device Interface 與 X11 的圖形界面轉換由?[30] GDI32 處理。?[31]USER32 則實做 Windowing and Messaging subsystem. 像是一些狀態 列顯示等功能,都已經實做完成。 例外一個值得一提的是[32]錯誤處理的機制,在 Windows 上 [33]exception handling 的 方式比 Linux 中複雜許多。以?[34]STATUS_ACCESS_VIOLATION /?Segmentation fault 為 例子,在 Linux 中只是吐一個?[35]SIGSEGV 錯誤,在 Windows 中則會吐出一個 [36] Exception,還會帶上錯誤位址 (faulting address) 等資訊,也可在 SEH 中指定 handler function 來處理錯誤事件。在 Linux 中,並沒有所謂的 system exception interface,Wine 為了模擬出 Windows 的[37]錯誤處理機制,是將 exception 轉為 [38] signal 來模擬。 除了上述幾個主要的核心程式外,Wine 也實做了許多[39]軟體原件,像是?[40] Cryptography,?[41]DirectShow Framework,?[42]Direct3D shader -> GL mapper, Network protocol stacks,?DirectSound (ALSA, OSS),?[43]DirectInput,?DirectShow,? [44]DirectDraw,?Direct3D 等等。甚至連 [45]MSHTML / IE 都已經以 [46]Gecko Engine 實做。 目前 Wine 在編譯時已經支援?[47]64 bits 也支援?[48]WoW64 來跑 32 bits 程式。 = 開發模式 = Wine 是用 git 管理,任何人都可以隨意 commit patches, test cases 到?[49]patches mailing list 上,經過公開的 code review 後就會再下一次 release 中被合併。如果有 任何技術上的疑問,則會被提到開發論壇進行討論,有歧異或暫時無法解決的問題,會被 彙整到[50]問題追蹤系統中,是相當透明開放、平等的開發模式。 由於 Wine 是完全重製 Win32 APIs, 且是黑箱測試開發模式,難免會出現修東壞西的悲慘 現象。為了避免舊問題在新版中重現,Wine 設計了一套[51]測試方法,來作?[52] Regression Testing,藉此確保軟體品質。不過這個方法只能測試功能性的問題,難免還 是避免不了一些圖形界面的變異。 Wine 計劃授權[53]原本是採用 MIT,但在市場高度期待,出現了數家不同的公司為不同的 平臺提供服務,社?為了避免多家營利公司商業競爭造成開發資源分散,2002 三月後已經 改成 LGPL. 也由於授權開放,Wine 的開發成果如 D3D 也被整合到 [54]VirtualBox 中。另外像是想 重新實做開源Windows? XP/2003 的?[55]ReactOS 計劃,其軟體層也使用 Wine?Libraries 。一般開發者也可以用?[56]Winelib 作為跨平臺的函式庫,在 Linux 上將程式移植到 Win32 平臺上。 (類似?[57]mingw) 目前在 Linux 上,Wine 對於音效支援,只有 OSS 與 ALSA。社?已有?[58]PulseAudio, 但由於開發團隊策略上的[59]考量,希望朝向支援?[60]OpenAL 的方向,因此尚未被整合 到官方版本。至於在?MacOS 上,其圖形界面驅動程式還是 winex11.drv ,需要使用 X Server 才能使用,OS X 上的?[61]Quartz 在 2010 時曾經有[62]一部分實做,但已停止 開發,功能也暫時無法使用。 = 使用現況 = 目前 Wine 計劃處在一個尷尬的狀態。Wine 已經完成很大部分的 Win32 Libraries. 但仍 有尚未實做的部分,為了能夠順利使用,使用者仍必須使用 Microsoft ?函式庫 (以下稱 為 native)。又因為已高度實做 Wine 的函式庫 (以下稱為 build-in)往往有不相容 native 函式庫的問題。也因此使用者現階段而言並不容易只使用一套 Wine 設定來套用所 有的 Win32 應用程式。 結局就是造成使用 Wine 執行 Win32 程式時,常需要搭配不同的函式庫。例如這一版本需 要 native 的 yyy.dll 配合 build-in 的 zzz.dll,另外一套軟體卻可以只用 build-in dll 執行。 如果軟體出現相容性問題,不再像初期一樣,只要靠換 Win32 Libraries 就可以排除,因 為每個原生函式庫有高度相依性。由於安裝軟體時,常常需要用到一些 Microsoft 的程式 碼,或者偶爾也許要微調一下?[63]Windows Registry Keys 才能順利安裝。因此常需要透 過特定到程序才能成功安裝,因此網路上有許多[64]第三方工具。最常用也最知名的就是? [65]Winetricks. 雖然 Wine 已經開始有些像是?[66]Picasa,?[67]TeamViewer 等等的商用軟體應用,以 Wine 直接提供原生 Win32 程式給 Linux 平臺。但他們的做法,都是隨贈一套已調整完成 的 Wine 系統。 由於 Wine 執行環境可以安裝在不同的 [68]sandbox,因此系統中可以有多套不同的 Wine 同時執行。這種技巧叫做 bottle. 使用者可以透過不同的環境變數,來設定 Wine 所要使 用的設定檔路徑,載入 Win32 程式時,也會啟動不同的 wine server,不同的 bottle 會 是獨立的執行環境,可作不同設定或安裝不同版本的函式庫。 使用者可以透過環境變數或[69]第三方工具,來測試配置各種不同的軟體,在 Linux 上可 以使用今年剛發表的?[70]wibom。在 MacOS 平臺上,由於編譯的困難性,可以使用?[71] Wineskin 之類的工具來協助安裝管理 Win32 系統。此外,像是?[72]Crossover,?[73] Bordeaux 等公司也提供商業版的友善界面與預先調整好的安裝工具等服務。 在 [74]Appdb 上已經有眾多程式資料,何不試試能否在 Linux 執行看看你最喜歡的 Windows 程式呢? :-) References: [1] http://people.debian.org.tw/~chihchun [2] http://people.debian.org.tw/~chihchun/2011/04/07/wine-using-windows-program-in-linux/ [3] http://people.debian.org.tw/~chihchun/2008/05/15/wine-10-rc1/ [4] http://wine-reviews.net/wine-release/wine-10-released.html [5] http://wine-reviews.net/archive.html#catid37 [6] http://appdb.winehq.org/ [7] http://appdb.winehq.org/objectManager.php?sClass=application&sTitle=Browse+Applications&iappVersion-ratingOp0=5&sappVersion-ratingData0=Platinum&sOrderBy=appName&bAscending=true [8] http://www.dosbox.com/ [9] http://www.scummvm.org/ [10] http://en.wikipedia.org/wiki/Emulator [11] http://en.wikipedia.org/wiki/Virtual_machine [12] http://www.winehq.org/documentation [13] http://wiki.winehq.org/ [14] http://www.winehq.org/docs/winedev-guide/x2543 [15] http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/wine.png
[16] http://en.wikipedia.org/wiki/Black-box_testing [17] http://en.wikipedia.org/wiki/Thunk_(compatibility_mapping) [18] http://en.wikipedia.org/wiki/Inter-process_communication [19] http://en.wikipedia.org/wiki/COM_file [20] http://en.wikipedia.org/wiki/New_Executable [21] http://en.wikipedia.org/wiki/Dynamic-link_library [22] http://en.wikipedia.org/wiki/Portable_Executable [23] http://en.wikipedia.org/wiki/Address_space [24] http://en.wikipedia.org/wiki/Thread-local_storage [25] http://www.winehq.org/docs/winedev-guide/seh [26] http://en.wikipedia.org/wiki/Dynamic_memory_allocation [27] http://en.wikipedia.org/wiki/Stack-based_memory_allocation [28] http://en.wikipedia.org/wiki/Entry_point [29] http://en.wikipedia.org/wiki/Graphics_Device_Interface [30] http://en.wikipedia.org/wiki/Microsoft_Windows_library_files#Gdi32.dll [31] http://en.wikipedia.org/wiki/Microsoft_Windows_library_files#User32.dll [32] http://en.wikipedia.org/wiki/Microsoft-specific_exception_handling_mechanisms [33] http://en.wikipedia.org/wiki/Exception_handling [34] http://en.wikipedia.org/wiki/Segmentation_fault [35] http://en.wikipedia.org/wiki/SIGSEGV [36] http://en.wikipedia.org/wiki/Exception_handling [37] http://en.wikipedia.org/wiki/Microsoft-specific_exception_handling_mechanisms [38] http://en.wikipedia.org/wiki/Signal_(computing) [39] http://wiki.winehq.org/SourceTreeStructure [40] http://wiki.winehq.org/Crypt32 [41] http://wiki.winehq.org/DirectShow [42] http://wiki.winehq.org/DirectX-Shaders [43] http://wiki.winehq.org/DInput [44] http://wiki.winehq.org/DirectDraw [45] http://msdn.microsoft.com/en-us/library/aa741317(v=vs.85).aspx [46] http://wiki.winehq.org/Gecko [47] http://wiki.winehq.org/Wine64 [48] http://en.wikipedia.org/wiki/WoW64 [49] http://news.gmane.org/gmane.comp.emulators.wine.patches [50] http://bugs.winehq.org/ [51] http://www.winehq.org/docs/winedev-guide/testing-test [52] http://wiki.winehq.org/RegressionTesting [53] http://wiki.winehq.org/WineHistory [54] http://www.virtualbox.org/ [55] http://www.reactos.org/ [56] http://www.winehq.org/docs/winelib-guide/index [57] http://www.mingw.org/ [58] http://art.ified.ca/?page_id=40 [59] http://bugs.winehq.org/show_bug.cgi?id=10495 [60] http://connect.creativelabs.com/openal/default.aspx [61] http://en.wikipedia.org/wiki/Quartz_(graphics_layer) [62] http://wiki.winehq.org/MacOSX/QuartzDriver [63] http://wiki.winehq.org/UsefulRegistryKeys [64] http://wiki.winehq.org/ThirdPartyApplications [65] http://wiki.winehq.org/winetricks [66] http://picasa.google.com/linux/download.html [67] http://www.teamviewer.com/ [68] http://en.wikipedia.org/wiki/Sandbox_(software_development) [69] http://wiki.winehq.org/ThirdPartyApplications [70] http://wibom.sourceforge.net/ [71] http://wineskin.doh123.com/ [72] http://www.codeweavers.com/ [73] http://bordeauxgroup.com/store/bordeaux-software [74] http://appdb.winehq.org/ -- http://people.debian.org.tw/~chihchun/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.53.166

04/08 01:14, , 1F
說到尷尬的部份真是於心有戚戚焉....orz
04/08 01:14, 1F

04/09 00:53, , 2F
想灌的就只有遊戲XD 其他幾乎都找得到可取代或更好用的@@
04/09 00:53, 2F

04/09 00:53, , 3F
可是每次都搞了老半天 還是開windows來玩= =
04/09 00:53, 3F

04/09 11:40, , 4F
跟樓上一樣 想玩WINDOWS遊戲最後還是切回到WINDOWS系統
04/09 11:40, 4F
文章代碼(AID): #1DdUdjK_ (Linux)