[爆卦]Wine 無法 使用是什麼?優點缺點精華區懶人包

為什麼這篇Wine 無法 使用鄉民發文收入到精華區:因為在Wine 無法 使用這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者rextsai (Rex Tsai)看板Linux標題[心得] Wine 簡介時間Fri Apr...

Wine 無法 使用 在 Mickey 米奇|黃鈺文 Instagram 的最佳貼文

2020-08-10 21:18:57

我以前也覺得甜白酒好膩,幹嘛不喝檸檬綠就好了?追酒精的話幹嘛不喝雞尾酒?然後公司派我代表去了Joh.Jos Prüm的餐酒會。  德國的葡萄園最出名的就是它陡峻的斜坡,抖到無法使用機器採收,所以人工費算進去再加上「晚摘」型酒款本來就量少,所以貴也是剛好而已。  一次嚐到J.J Prüm ...


[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
mgdesigner:說到尷尬的部份真是於心有戚戚焉....orz 04/08 01:14
deepking:想灌的就只有遊戲XD 其他幾乎都找得到可取代或更好用的@@ 04/09 00:53
deepking:可是每次都搞了老半天 還是開windows來玩= = 04/09 00:53
joohsieh:跟樓上一樣 想玩WINDOWS遊戲最後還是切回到WINDOWS系統 04/09 11:40

你可能也想看看

搜尋相關網站