91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Wine原理介紹和開發(fā)教程

深度操作系統(tǒng) ? 來源:深度操作系統(tǒng) ? 2024-12-31 10:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

說起 Wine,稍微資深一點(diǎn)的 Linux 用戶應(yīng)該都聽過,但是真要說起 Wine 到底是怎么回事,可能大多數(shù)人不見得說得清。這篇文章會(huì)簡單地介紹 Wine 的工作原理,以及如何開始 Wine 的開發(fā)。所以如果您屬于以下三類讀者之一:

想?yún)⑴c Wine 開發(fā),但是不知如何開始的。

僅僅想大致了解 Wine 是如何工作的。

只是想能夠愉快的用上最新版本 Wine 的。

希望在看完本文后,能夠有一些收獲。

Part 1 Wine 是什么

Wine 是 "Wine Is Not an Emulator" 的遞歸縮寫,如同 "GNU" 一樣(GNU's Not Unix),字面意思就是 Wine 不是一個(gè)模擬器。這里的模擬器主要是指 Wine 并不是一個(gè)虛擬機(jī),而是一個(gè) Windows API 實(shí)現(xiàn)兼容層。這么說可能不太好理解,大家可以把 Windows 應(yīng)用程序類比成 Android 應(yīng)用程序,而 Wine 的角色就和 Android 很像了,將操作系統(tǒng)提供的各種功能封裝成 API,并讓應(yīng)用程序在隔離的環(huán)境內(nèi)運(yùn)行。至于 API 長成啥樣,隔離的力度如何,這些都是實(shí)現(xiàn)相關(guān)的,和本質(zhì)并不沖突。另一方面,Wine 其實(shí)又是一個(gè)模擬器,不過模擬的對象不是硬件 CPU,而是 Windows 的行為。

Part 2 Wine 原理介紹

本節(jié)內(nèi)容相對來說稍顯基礎(chǔ)和單一啦,并且閱讀時(shí)最好對操作系統(tǒng)有一定程度的了解哦。如果只是想編譯、運(yùn)行,對原理不敢興趣的同學(xué),可以跳過,不影響后面的閱讀。

Wine 的目的是運(yùn)行 Windows 上的可執(zhí)行程序(PE,portable executable)。我們知道,可執(zhí)行程序的本質(zhì)其實(shí)就是按照某一規(guī)則排列的機(jī)器碼,而機(jī)器碼是指令集相關(guān)的。得益于常見的 PC 機(jī)一般是 x86/x64 的,因此 Windows 應(yīng)用程序從指令集的角度看,是完全可以在 x86/x64 的 Linux 機(jī)器上直接運(yùn)行,而不需要硬件層模擬的。

但是為了能夠直接加載運(yùn)行 PE 文件,需要滿足一些 ABI 兼容。最基本的,Windows PE 程序會(huì)假定自己被加載到地址 0x400000 處,因此 Wine 實(shí)現(xiàn)自己的 loader 時(shí),需要保證將 PE 鏡像加載到同樣的位置。對于靜態(tài)鏈接的程序,需要做的事情可能不是太多,但是對于動(dòng)態(tài)鏈接的程序,Wine 需要模仿 Windows loader 的行為,加載依賴的庫,并進(jìn)行相應(yīng)的重定位工作。

為了最大程度上減少對二進(jìn)制層面的依賴,Wine 決定實(shí)現(xiàn)至少 GDI32,KERNEL32,USER32 三個(gè)動(dòng)態(tài)庫,因?yàn)槠渌麕於际墙⒃谶@三個(gè)庫的基礎(chǔ)之上的。所以理論上來說,除此之外的其他動(dòng)態(tài)庫是可以直接使用 Windows 上面現(xiàn)有的庫,但由于各種原因,Wine 還是傾向于盡量實(shí)現(xiàn)所有的 API。我們把 Wine 自己實(shí)現(xiàn)的 API 庫稱作 builtin,把 Windows 上現(xiàn)成的庫稱作 native。當(dāng) Wine 在加載 builtin 動(dòng)態(tài)庫的同時(shí),還會(huì)在內(nèi)存中建立 PE header,用來模仿 Windows 上的內(nèi)存布局。更加詳細(xì)的實(shí)現(xiàn),有機(jī)會(huì)可以寫一篇 Wine loader 相關(guān)的文章來介紹 Wine 本身、PE 程序和動(dòng)態(tài)庫是如何被加載的。

除開 loader 的功能外,Wine 還需要解決進(jìn)程間通信(IPC)的問題。Wine 的實(shí)現(xiàn)方式是將所有跨進(jìn)程的對象和機(jī)制,比如 GDI 對象,比如信號量,全部實(shí)現(xiàn)在 Wine server 中。同時(shí) Wine 允許系統(tǒng)運(yùn)行多個(gè) Wine server 的實(shí)例。這樣存在于同一個(gè) Wine server 中的對象自然是可以相互通信,好像在同一個(gè)空間內(nèi);而不同 Wine server 下的對象,是相互隔離的,這種架構(gòu)使得不同容器之間的程序相互沒有影響。Wine server 的具體實(shí)現(xiàn)是通過 unix socket,實(shí)現(xiàn)了一套 IPC 機(jī)制,完成和 API 層的交互。

有了以上這些基礎(chǔ),Wine 實(shí)現(xiàn)起各種功能就可以按部就班了,只需理解 Windows 下 API 的行為和含義,然后再重新實(shí)現(xiàn)一遍就行了。聽起來雖然簡單,實(shí)際難度不小,特別是一些未公開的行為,必須對整體有相當(dāng)?shù)牧私夂蟛拍芟率?。甚至一些差異,比?UI 相關(guān)的內(nèi)容,由于 Windows 窗口系統(tǒng)和 X 在設(shè)計(jì)哲學(xué)上的不同,實(shí)現(xiàn)上需要有所舍取。目前 Wine 支持的平臺(tái)不僅包括 Linux,還包括 BSD、Mac OS X 和 Android。

Part 3 環(huán)境

下面的開發(fā)環(huán)境都以 deepin 為例進(jìn)行說明。

首先獲取代碼。Wine 官方代碼倉庫地址為

git://source.winehq.org/git/wine.git

如果你想方便打包給別人使用,又不太想折騰打包的一些細(xì)節(jié),可以用各個(gè)發(fā)行版自己維護(hù)的 Wine。比如 Debian 維護(hù)的 Wine 倉庫地址為

https://salsa.debian.org/wine-team/wine.git

這里以官方的 Wine 為例:

git clone git://source.winehq.org/git/wine.git

然后安裝開發(fā)的依賴。為了簡單起見,我們只編譯 32 位的 Wine,因?yàn)?64 位的 Wine 只支持 64 位的 PE 程序,而目前 Windows 上仍有大量的程序只提供了 32 位的版本。

    sudo apt install
        gcc-multilib
        flex
        bison
        libx11-dev:i386
        libfreetype6-dev:i386
        libxcursor-dev:i386
        libxi-dev:i386
        libxshmfence-dev:i386
        libxxf86vm-dev:i386
        libxrandr-dev:i386
        libxfixes-dev:i386
        libxinerama-dev:i386
        libxcomposite-dev:i386
        libglu1-mesa-dev:i386
        libosmesa6-dev:i386
        ocl-icd-opencl-dev:i386
        libpcap-dev:i386
        libdbus-1-dev:i386
        libgnutls28-dev:i386
        libncurses-dev:i386
        libsane-dev:i386
        libv4l-dev:i386
        libgphoto2-dev:i386
        liblcms2-dev:i386
        libpulse-dev:i386
        libgstreamer-plugins-base1.0-dev:i386
        libudev-dev:i386
        libcapi20-dev:i386
        libcups2-dev:i386
        libfontconfig1-dev:i386
        libgsm1-dev:i386
        libkrb5-dev:i386
        libtiff-dev:i386
        libmpg123-dev:i386
        libopenal-dev:i386
        libldap2-dev:i386
        libxrandr-dev:i386
        libxml2-dev:i386
        libxslt1-dev:i386
        libjpeg62-turbo-dev:i386
        libusb-1.0-0-dev:i386
        gettext
        libsdl2-dev:i386
        libvulkan-dev:i386
接著運(yùn)行腳本:
./configure --with-gnutls --without-hal --without-oss

根據(jù)不同的 Wine 版本,此時(shí)可能會(huì)提示不同的 feature 支持情況。我們可以根據(jù)需求,對上面的依賴庫和傳入的參數(shù)進(jìn)行調(diào)整,具體可以查看 configure.ac 的內(nèi)容。

Wine 的源碼比較大,編譯有些耗時(shí),可以根據(jù) CPU 情況增加并行參數(shù),比如 make -j8,進(jìn)行編譯。

編譯完成后,運(yùn)行:

./wine --version
可以查看版本號。如果想安裝到系統(tǒng),可以運(yùn)行:
sudo make install
但是注意,安裝后可能會(huì)修改一些文件的默認(rèn)打開方式。

Part 4 使用

運(yùn)行:

./wine winecfg
可以對默認(rèn)容器進(jìn)行設(shè)置,默認(rèn)的容器位于 HOME 目錄下的 .wine,環(huán)境變量 WINEPREFIX 用來修改當(dāng)前的容器路徑。比如有一個(gè)叫 demo.exe 的可執(zhí)行文件,我們想測試能否正常運(yùn)行,可以運(yùn)行。
WINEPREFIX=~/.demo_exe ./wine demo.exe
HOME 目錄下的`demo_exe`就會(huì)作為其容器目錄。

Part 5 開發(fā)

編譯過后的 Wine 源碼目錄結(jié)構(gòu)如下:

    ├── aclocal.m4
    ├── ANNOUNCE
    ├── AUTHORS
    ├── config.log
    ├── config.status
    ├── configure
    ├── configure.ac
    ├── COPYING.LIB
    ├── dlls
    ├── documentation
    ├── fonts
    ├── include
    ├── libs
    ├── LICENSE
    ├── LICENSE.OLD
    ├── loader
    ├── MAINTAINERS
    ├── Makefile
    ├── Makefile.in
    ├── po
    ├── programs
    ├── README
    ├── server
    ├── tools
    ├── VERSION
    └── wine -> tools/winewrapper

目錄 dlls 按照模塊存放了所有 API 的實(shí)現(xiàn)。

目錄 loader 是和 Wine 啟動(dòng)、加載相關(guān)的代碼。

目錄 programs 存放了外部程序的代碼,比如注冊表管理工具 regedit 。

目錄 server 顧名思義,是 Wine server 的實(shí)現(xiàn)。

接下來需要做的就和普通開發(fā)沒什么兩樣了。比如說我們發(fā)現(xiàn)某個(gè)應(yīng)用存在字體相關(guān)的 BUG,可以首先根據(jù)經(jīng)驗(yàn)判斷在 Windows 上,該程序是如何實(shí)現(xiàn)的,然后查看對應(yīng)的實(shí)現(xiàn)。例如 GDI 相關(guān)的字體實(shí)現(xiàn),位于 dlls/gdi32/font.c 和 dlls/gdi32/freetype.c 。修改完代碼后,在所在模塊的目錄,比如上例就是 dlls/gdi32 下重新 make 就可以快速驗(yàn)證了。

對于復(fù)雜的問題,不太好直接定位的,可以通過輸出日志的方式來調(diào)試,環(huán)境變量 WINEDEBUG 指定了需要輸出的日志。

有時(shí)我們可能需要把復(fù)雜的情況簡單化,這時(shí)候難免會(huì)寫一些小的 demo 程序來重現(xiàn)問題。如果不想到 Windows 上面編譯,可以使用 mingw 直接在 deepin 下編譯出 exe 文件。方法很簡單,首先安裝 mingw:

sudo apt install mingw-w64
接著正常利用 Windows API 實(shí)現(xiàn)程序,最后利用 mingw 編譯工具鏈生成文件即可,Makefile 示例:
hello.exe: hello.c
    i686-w64-mingw32-g++ -o hello.exe hello.c -DUNICODE -D_UNICODE -municode -lgdi32

上面的例子,定義了 UNICODE,所以使用的 UNICODE 版本的 API,入口函數(shù)為 wmain,-lgdi32 表示需要鏈接庫 gdi32 。生成出來的 hello.exe,可以同時(shí)在 Windows 和 deepin 下運(yùn)行。

Part 6 其他

本文介紹的內(nèi)容只涉及到 Wine 開發(fā)的基礎(chǔ),Wine 本身還有很多東西值得去探索。比如 Wine 是如何使用 driver 機(jī)制讓接口和實(shí)現(xiàn)分離的,再比如 Wine 是如何使用純 C 實(shí)現(xiàn) COM 機(jī)制的。雖然 Wine 的出現(xiàn)已經(jīng)有一些年頭了,但是目前的開發(fā)仍然比較活躍,感興趣的同學(xué)可以加入進(jìn)來,為 Linux 生態(tài)添磚加瓦,讓大家能用到更多的優(yōu)質(zhì)應(yīng)用,也算是曲線救國了。

Part 7 更新

7.1 新的 WOW64

上面編譯的例子中,我們只編譯了 32 位的 Wine,忽略了編譯 64 位 Wine 的細(xì)節(jié)。從 Wine 8 開始,Wine 開始了一個(gè)稱為 PE Convertion 的開發(fā)過程,重新實(shí)現(xiàn)了 WOW64 的機(jī)制。此模式下只需要編譯出一份 Wine,既可以運(yùn)行 32 位程序,也能運(yùn)行 64 位程序。同時(shí)也不再依賴 32 位的運(yùn)行時(shí)庫。雖然此模式還被認(rèn)為處于實(shí)驗(yàn)階段,但是從 deepin-wine8 開始,我們已經(jīng)默認(rèn)使用此方式。

編譯新的 WOW64 方式的 Wine,步驟如下:

Wine 官方的源碼地址已經(jīng)更改,在https://gitlab.winehq.org/wine/wine.git下載源代碼。

依舊需要安裝編譯時(shí)依賴的開發(fā)庫,不同在于我們這次只需要安裝 amd64 的版本,在安裝開發(fā)庫時(shí)不再需要指定 :i386 后綴。此外 mingw-w64 在此模式下成為必須項(xiàng)。

在 Wine 源碼目錄的同級目錄下新建 build-wine 目錄,并進(jìn)入此目錄。

運(yùn)行 ../wine/configure --prefix=/opt/wine-newwow64 --enable-archs=i386,x86_64。這一步如果有任何提示,比如缺少編譯期依賴,可以在安裝后再次運(yùn)行。

make -j8,進(jìn)行編譯。

sudo make install 安裝,Wine 會(huì)安裝在第 4 步通過 prefix 指定的位置,即 /opt/wine-newwow64 。當(dāng)然也可以選擇不安裝,直接在編譯目錄下運(yùn)行。

7.2 其他架構(gòu)

在關(guān)于原理一節(jié)的描述中我們提到過,x86/x64 機(jī)器的 Linux 系統(tǒng)可以通過 Wine 運(yùn)行 x86/x64 的 PE 程序。實(shí)際上如今通過 DBT(dynamic binary translation)技術(shù),在 ARM 及其他架構(gòu)上已經(jīng)有了運(yùn)行 Wine 的方案。感興趣的讀者可以查看Box64項(xiàng)目。

11月份,微信在 deepin 商店上架了Linux原生版本,功能與 Windows、MacOS 相差無幾。Wine 版本的微信終于可以"功成身退"了,我們也期待今后有更多軟件推出原生版本,讓 Wine 早點(diǎn)完成"歷史使命"。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    218995
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3702

    瀏覽量

    93994
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3344

    瀏覽量

    60242
  • 模擬器
    +關(guān)注

    關(guān)注

    2

    文章

    1010

    瀏覽量

    45664

原文標(biāo)題:想開啟 Wine 開發(fā)?看這篇就夠了!

文章出處:【微信號:linux_deepin,微信公眾號:深度操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Wine運(yùn)行exe軟件的教程

    Linux有很多的軟件,但是在桌面操作軟件生態(tài),還是不如Windows,有些軟件只有Windows版本沒有對應(yīng)的Linux版本,如果我們想在Linux系統(tǒng)上運(yùn)行exe程序,就需要借助一些第三方的軟件,下面我就介紹一下用Wine運(yùn)行exe軟件的教程.
    發(fā)表于 10-10 09:40 ?1.7w次閱讀

    linux下的快捷鍵全面介紹

    輸入剩下的名字。使用tab鍵補(bǔ)全還支持對于擴(kuò)展名的識別,比如您的文件夾下有”TH2AD_CHS.exe文件和 TH2AD_CHS.ini文件,當(dāng)您輸入”wine TH”再按下tab后,會(huì)補(bǔ)全成
    發(fā)表于 07-09 08:44

    介紹基于協(xié)議棧外設(shè)的開發(fā)

    本節(jié)介紹基于芯科協(xié)議棧設(shè)備的開發(fā)本節(jié)介紹基于芯科協(xié)議棧外設(shè)的開發(fā)
    發(fā)表于 01-07 08:26

    intel edison 開發(fā)板的開發(fā)平臺(tái)介紹

    intel edison 開發(fā)板的開發(fā)平臺(tái)介紹,以及板載資源的介紹,重量級
    發(fā)表于 10-30 16:12 ?15次下載

    android框架與應(yīng)用開發(fā)介紹

    android框架與應(yīng)用開發(fā)介紹
    發(fā)表于 10-24 09:35 ?7次下載
    android框架與應(yīng)用<b class='flag-5'>開發(fā)</b><b class='flag-5'>介紹</b>

    linux下wine的使用

    Wine 仍在發(fā)展階段,僅能執(zhí)行少部份的 Windows 軟體,大部份的軟體仍然無法正常執(zhí)行。 Wine的官方站點(diǎn)是http://www.winehq.com/,雖然你可以在它的官方站點(diǎn)下載源代碼
    發(fā)表于 11-07 15:37 ?14次下載

    異亮科技發(fā)布新品AIR VALLEY WINE智能凈化落地?zé)?/a>

    異亮科技日前宣布發(fā)布新品 AIR VALLEY WINE智能凈化落地?zé)?,該產(chǎn)品將照明與凈化相結(jié)合,顛覆性的提出凈化與照明新概念。AIR VALLEY WINE采用紅酒杯流線型設(shè)計(jì)理念,機(jī)身配備了一鍵式操控,既是開關(guān)鍵又擁有調(diào)節(jié)風(fēng)速等功能,設(shè)計(jì)簡潔干凈。
    的頭像 發(fā)表于 05-21 07:19 ?3436次閱讀

    JEEWeb的開發(fā)相關(guān)技術(shù)介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是JEE Web的開發(fā)相關(guān)技術(shù)介紹
    發(fā)表于 02-15 17:19 ?4次下載
    JEEWeb的<b class='flag-5'>開發(fā)</b>相關(guān)技術(shù)<b class='flag-5'>介紹</b>

    盤點(diǎn)一下這些可以通過Wine在Linux上玩的游戲

    上古卷軸 5 已經(jīng)不是款新游戲了,但它的 mod 社區(qū)依舊活躍。如果你的 Linux 系統(tǒng)有足夠資源的話,你可以很輕松地加上很多很多 mod。需要記住的是 Wine 運(yùn)行時(shí)要比游戲占用更多的系統(tǒng)資源,所以使用 mod 時(shí)也要考慮這一點(diǎn)。
    的頭像 發(fā)表于 04-16 12:41 ?8198次閱讀

    Wine 5.4版本更新更多新功能

    IT之家了解到,WineWine Is Not an Emulator)是一個(gè)能夠在多種 POSIX-compliant 操作系統(tǒng)(包括 Linux,Mac OSX 及 BSD 等)上運(yùn)行 Windows 應(yīng)用的兼容層。
    的頭像 發(fā)表于 03-14 09:33 ?2847次閱讀

    Wine中將提供Windows應(yīng)用程序與USB更好支持

    Wine 中運(yùn)行的 Windows 應(yīng)用程序直接與 USB 設(shè)備交互將會(huì)有更好的支持。Wine 項(xiàng)目的提交記錄顯示,最新合并的 WineUSB 初始部分將成為 Wine USB 驅(qū)動(dòng),類似于微軟的 WinUSB。
    的頭像 發(fā)表于 04-19 09:52 ?3108次閱讀
    <b class='flag-5'>Wine</b>中將提供Windows應(yīng)用程序與USB更好支持

     Wine更新:支持 Linux 運(yùn)行 Windows 應(yīng)用,PE 格式核心模塊

    1月19日消息 外媒 Windows Central 報(bào)道,Wine 最近收到了更新,改善了在 Linux 系統(tǒng)上運(yùn)行 Windows 應(yīng)用的體驗(yàn)。該更新以 Win3 6.0 的形式出現(xiàn),根據(jù)其完整
    的頭像 發(fā)表于 01-19 11:49 ?2961次閱讀

    如何在Ubuntu上安裝最新版本的Wine

    新的 Wine 8.0 版本比以往任何時(shí)候都更好地支持在 Linux 發(fā)行版(如 Ubuntu)上運(yùn)行 Windows 應(yīng)用程序。
    的頭像 發(fā)表于 02-01 10:01 ?8041次閱讀

    Wine開發(fā)系列——如何使用Wine日志調(diào)試問題

    助于快速理解代碼的執(zhí)行流程和功能。在大型項(xiàng)目中,通常會(huì)先實(shí)現(xiàn)一套自己的調(diào)試日志框架,主要有兩個(gè)目的: 統(tǒng)一日志風(fēng)格和存儲(chǔ):確保日志格式一致,并且有統(tǒng)一的存儲(chǔ)方式,這有助于用戶更容易地報(bào)告問題。 方便開發(fā)人員:開發(fā)人員
    的頭像 發(fā)表于 01-06 11:29 ?2303次閱讀

    Wine常用調(diào)試方法

    本文主要以 Wine 官網(wǎng)的這篇文章 《 Debugging Wine 》 來講解。大部分內(nèi)容是對該文的翻譯,修正了原文的一些書寫錯(cuò)誤,刪除了原文跟最新的 Wine 不適應(yīng)的內(nèi)容。
    的頭像 發(fā)表于 01-16 09:52 ?2433次閱讀
    <b class='flag-5'>Wine</b>常用調(diào)試方法