在龍芯3A5000上運(yùn)行Windows程序
龍芯3A5000是龍芯最新的桌面CPU,它基于龍芯自主設(shè)計(jì)的LoongArch架構(gòu)(指令集),性能接近市場(chǎng)主流CPU水平。因?yàn)楦鞣N操作系統(tǒng)和應(yīng)用程序都與指令集相關(guān),所以在x86架構(gòu)(指令集)的CPU就不能直接運(yùn)行ARM架構(gòu)(指令集)的應(yīng)用程序,反之亦然。因此誕生了各種各樣的二進(jìn)制(指令)翻譯技術(shù),用于跨架構(gòu)模擬運(yùn)行其它平臺(tái)的操作系統(tǒng)和應(yīng)用程序,各種二進(jìn)制(指令)翻譯技術(shù)可以分為軟件翻譯、硬件翻譯、軟硬結(jié)合的翻譯這三大類。

二進(jìn)制翻譯技術(shù)簡(jiǎn)述
以軟件方式進(jìn)行二進(jìn)制(指令)翻譯必須存在一個(gè)宿主系統(tǒng),模擬器程序在宿主系統(tǒng)上運(yùn)行。比如各種游戲模擬器,用來在電腦上玩紅白機(jī)游戲、街機(jī)游戲、PS游戲等,以純軟件的方式構(gòu)建了一個(gè)虛擬的主機(jī)環(huán)境,讓那些游戲程序成為缸中之腦,游戲程序執(zhí)行的所有指令、請(qǐng)求的所有資源都是由翻譯軟件模擬出來的,但它以為自己是在真正的主機(jī)中運(yùn)行。
模擬通用計(jì)算機(jī)的CPU和相關(guān)硬件環(huán)境要比模擬游戲主機(jī)復(fù)雜得多。這方面的代表軟件,有開源的可虛擬多種架構(gòu)的qemu、蘋果的rosetta 2、以及微軟Windows11在arm上模擬x86和在x86上模擬arm的技術(shù)等等。其中qemu可以在多種架構(gòu)(指令集)之間相互轉(zhuǎn)換,但性能最低,平均運(yùn)行效率僅為原生性能的5%左右。蘋果和微軟都是一對(duì)一的專用翻譯,且與操作系統(tǒng)深度結(jié)合,效率較高。
硬件翻譯以Transmeta CPU為代表,它的CPU本身是一種“超長(zhǎng)字指令集”架構(gòu),但在指令譯碼的階段,接受的是x86指令,然后把x86指令轉(zhuǎn)換為它自己的指令來運(yùn)行。這種方式使它的CPU看起來就是一塊x86架構(gòu)的CPU,并且不需要對(duì)電腦中的其它硬件進(jìn)行模擬,各種支持x86指令集的操作系統(tǒng)和應(yīng)用程序都可以在使用Transmeta CPU的電腦上直接安裝運(yùn)行。Intel/AMD現(xiàn)在的CPU其實(shí)也是硬件翻譯技術(shù)的代表,它們內(nèi)部是執(zhí)行的“微碼(類似于精簡(jiǎn)指令集)”,而對(duì)于的表現(xiàn)則依然是x86架構(gòu)的處理器。
龍芯的LoongArch架構(gòu)(指令集)則代表了第三個(gè)分類,即軟件和硬件結(jié)合的二進(jìn)制翻譯方式。這種方式既有軟件翻譯的靈活性,又能接近或達(dá)到硬件翻譯的效率,兼具二者的優(yōu)點(diǎn)。龍芯的二進(jìn)制翻譯本質(zhì)上也是軟件翻譯,但是對(duì)軟件翻譯中比較耗時(shí)的處理提供了專門的硬件指令來加速翻譯過程,因此稱它為軟硬結(jié)合的二進(jìn)制翻譯技術(shù)。龍芯之所以不使用純硬件的翻譯方式,是因?yàn)槲覀儽仨毥⒆灾鞯能浖鷳B(tài)體系。如果像Transmeta那樣對(duì)外表現(xiàn)為x86的CPU,那么它能直接運(yùn)行的就只有基于x86的操作系統(tǒng)和應(yīng)用程序,生存狀況高度依賴于Intel和微軟的態(tài)度,因此它雖然在Intel的訴訟中獲勝,但卻在Intel對(duì)市場(chǎng)的操作下慘然離場(chǎng)。
龍芯的LoongArch架構(gòu)(指令集)本身是一種獨(dú)立的,完善的指令系統(tǒng),可以建立獨(dú)立于x86/ARM之外的軟件生態(tài)體系。龍芯的二進(jìn)制翻譯技術(shù)主要是在LoongArch原生軟件生態(tài)建設(shè)的初期,用于補(bǔ)充原生軟件的不足,LoongArch架構(gòu)和龍芯CPU的生存不依賴于Intel/ARM/MS/Google等主導(dǎo)的軟件生態(tài)。二進(jìn)制翻譯技術(shù)具有單方面的決定權(quán),任何公司都沒有理由阻止任何軟件以二進(jìn)制翻譯的方式在某種原生不支持的架構(gòu)上運(yùn)行。即使軟件開發(fā)商以檢測(cè)CPU型號(hào)等技術(shù)手段阻止運(yùn)行,那么以軟件為主體的二進(jìn)制翻譯技術(shù)也能輕松解決這個(gè)問題,而固化在CPU硬件中的各種信息和特征則不可能像軟件那樣在線升級(jí)。以軟件翻譯為主體的二進(jìn)制翻譯,甚至可以針對(duì)特定程序把自己模擬成特定的CPU型號(hào)。
即使要翻譯的目標(biāo)架構(gòu)頻繁升級(jí)指令集版本,增加新的指令,不斷推陳出新,對(duì)于龍芯來說,要模擬最新的CPU和指令集,也只是更新一下軟件的事兒。而那些需要架構(gòu)授權(quán)的CPU產(chǎn)品,如果沒有購買到新版本的架構(gòu)授權(quán),那就無論如何發(fā)布多少個(gè)新款CPU產(chǎn)品,都不可能兼容新版架構(gòu)的新指令。
龍芯二進(jìn)制翻譯系統(tǒng)的簡(jiǎn)單結(jié)構(gòu)說明
龍芯的二進(jìn)制翻譯系統(tǒng)仍在開發(fā)當(dāng)中,尚未公開技術(shù)資料,但當(dāng)前已經(jīng)有可以使用的測(cè)試版本。我僅僅根據(jù)對(duì)當(dāng)前狀態(tài)分析的結(jié)果,簡(jiǎn)單描述一下它的基本結(jié)構(gòu)如下圖,可能不太準(zhǔn)確,也不夠詳細(xì),意會(huì)就好。

基于龍芯LoongArch架構(gòu)(指令集)的CPU,在運(yùn)行原生的LoongArch指令集的程序時(shí),不需要二進(jìn)制翻譯,可以直接運(yùn)行。
在運(yùn)行基于其它架構(gòu)(指令集)的Linux程序時(shí),由龍芯的二進(jìn)制翻譯模塊對(duì)指令進(jìn)行轉(zhuǎn)譯。程序?qū)inux的API調(diào)用,可以直接由操作系統(tǒng)本身提供支持。
在運(yùn)行Windows(x86)的程序時(shí),由于Linux系統(tǒng)本身不能提供Windows系統(tǒng)的API,因此需要使用Wine來提供對(duì)Windows API的支持。Wine是給Windows(x86)程序提供虛擬的API接口,而不負(fù)責(zé)對(duì)指令的轉(zhuǎn)譯。在x86的應(yīng)用程序中,不但程序自身邏輯以及第三方庫的二進(jìn)制代碼都是x86指令,而且用于調(diào)用Windows API的二進(jìn)制代碼也是x86指令,如果沒有二進(jìn)制翻譯,在LoongArch上是連Window API都無法調(diào)用的,更不用說程序自身的代碼了。
操作系統(tǒng)API(應(yīng)用程序編程接口)是由操作系統(tǒng)提供給應(yīng)用程序的接口,在Linux上運(yùn)行Windows程序時(shí),假如調(diào)用讀取文件數(shù)據(jù)的API,就可以由Wine給應(yīng)用程序提供這個(gè)接口,但接口內(nèi)部不再是Windows的代碼,而是由Wine去調(diào)用Linux的相關(guān)接口來實(shí)現(xiàn)相同的功能,這就是對(duì)API的模擬。在應(yīng)用程序讀取到數(shù)據(jù)之后做的操作,就不在Wine的管轄范圍內(nèi)了。比如程序取得數(shù)據(jù)后可能加密解密、可能作為圖像數(shù)據(jù)計(jì)算對(duì)比度、可能作為音頻數(shù)據(jù)計(jì)算制作音效……這些操作可能是由程序自身代碼來完成,也可能是調(diào)用其它的庫文件的接口來實(shí)現(xiàn)。這些在Wine支持范圍之外的代碼,在x86架構(gòu)(指令集)的CPU上是由CPU直接執(zhí)行,在LoongArch架構(gòu)(指令集)的CPU上,就只能由二進(jìn)制翻譯模塊轉(zhuǎn)譯為L(zhǎng)oongArch的指令來執(zhí)行。
操作系統(tǒng)和應(yīng)用程序?qū)PU指令的使用,是屬于ABI(應(yīng)用程序二進(jìn)制接口)的一部分,ABI的層級(jí)很低,是二進(jìn)制代碼的規(guī)范。在基于LoongArch架構(gòu)的CPU上運(yùn)行x86程序時(shí),就是由二進(jìn)制翻譯模塊來處理對(duì)指令的轉(zhuǎn)譯,也就是對(duì)x86的ABI規(guī)范的模擬。不管是Linux還是Windows的應(yīng)用程序,只要它不是LoongArch原生指令集的,最終都需要經(jīng)過二進(jìn)制翻譯才能在龍芯的CPU上運(yùn)行。
在龍芯3A5000上實(shí)戰(zhàn)運(yùn)行Windows程序
最簡(jiǎn)單的方式,是在使用3A5000的電腦上安裝統(tǒng)信的UOS系統(tǒng),然后等著UOS系統(tǒng)的應(yīng)用商店中提供了什么Windows軟件,就安裝什么軟件,可以無障礙,無門檻,無后顧之憂……可是Windows的軟件千奇百怪,UOS的應(yīng)用商店不可能提供所有的Windows軟件,那么我們就需要?jiǎng)觿?dòng)小手,自己解決自己的需求。
目前只有UOS for 3A5000(測(cè)試版)系統(tǒng)中集成了龍芯的二進(jìn)制翻譯模塊,而龍芯自己的Loongnix為什么反而還沒有提供二進(jìn)制翻譯的支持呢?“測(cè)試版”這三個(gè)字很重要,是否穩(wěn)定無關(guān)緊要。龍芯的Loongnix卻是已經(jīng)正式發(fā)布的產(chǎn)品,對(duì)于龍芯的政企用戶來說,往系統(tǒng)中更新一個(gè)還沒有開發(fā)完成的、可能不穩(wěn)定的功能模塊,大概不是什么喜聞樂見的事情。因此我下面就以UOS為例說明一下如何在龍芯3A5000上運(yùn)行“任何”的Windows軟件,“任何”是指可以嘗試任何軟件,但不能保證所有軟件都能正常運(yùn)行。
UOS中已經(jīng)集成了龍芯二進(jìn)制翻譯模塊,但要運(yùn)行Windows軟件仍然需要一個(gè)Wine環(huán)境。UOS本身有多個(gè)版本的Wine,有經(jīng)過深度/統(tǒng)信改良了效率和兼容性的deepin-wine,也有原生的版本,我們要使用deepin-wine。最簡(jiǎn)單的方式是從UOS應(yīng)用商店中安裝一個(gè)由Wine支持的軟件,環(huán)境就自動(dòng)配置好了。如果使用Loongnix或其它的系統(tǒng),就需要手工完成這個(gè)過程,可能還需要從UOS復(fù)制一些文件和配置,比較麻煩。建議安裝的軟件是PhotoShop,因?yàn)镻hotoShop是一個(gè)很大很復(fù)雜的軟件,能夠讓PhotoShop正常運(yùn)行的環(huán)境,就能讓大多數(shù)軟件正常運(yùn)行。
UOS對(duì)Wine版軟件的組織方式是給每個(gè)軟件一套單獨(dú)的Windows環(huán)境,也就是說每個(gè)軟件包中都有配套的Windows、Program Files、ProgramData、User等系統(tǒng)文件夾。這些文件夾和軟件本身,都被打包成一個(gè)files.7z文件,安裝到“/opt/apps”文件夾下以包名命名的子文件夾中。軟件首次運(yùn)行時(shí),files.7z被解壓到“/home/用戶名/.deepinwine/”文件夾中,并自動(dòng)配置相關(guān)的運(yùn)行環(huán)境。這種方式的好處是每個(gè)軟件都相對(duì)獨(dú)立,避免因某些共用文件的版本不同導(dǎo)致不能運(yùn)行,壞處就是會(huì)增加許多額外的文件。但實(shí)際增加的文件體積并不會(huì)很大,因?yàn)榍懊嬲f了Wine只是提供虛擬的API接口,因此包中的操作系統(tǒng)的DLL文件實(shí)際都是只有接口沒有代碼的“代理”版本,每個(gè)文件只幾KB大小。系統(tǒng)DLL接口的功能是由Wine文件夾中的對(duì)應(yīng)的.so文件來實(shí)現(xiàn)的。只有系統(tǒng)DLL之外的,軟件自身的以及第三方的DLL文件才是“真實(shí)”的DLL文件。
在安裝了PhotoShop(Wine)之后,在“
/opt/apps/com.pscs6.deepin/files”文件夾中的files.7z和run.sh是我們需要用到的。

如果你已經(jīng)運(yùn)行過剛剛安裝的PhotoShop,那么在“/home/用戶名/.deepinwine”文件夾中會(huì)有“Deepin-CS6”文件夾,“.deepinwine”是隱藏文件夾,在Linux中文件(夾)名字前面加“.”表示隱藏,在文件管理器中看不到,需要手工在地址欄輸入才能打開。它里面的內(nèi)容如下:

dosdevices文件夾中的內(nèi)容是虛擬硬盤盤符和com接口的鏈接文件,比如“c:”文件就鏈接到“drive_c”文件夾?!癲rive_c”文件夾是虛擬的Windodws系統(tǒng)的C盤,里面的內(nèi)容一看就眼熟:

如果你要向這個(gè)由Wine虛擬的Windows環(huán)境中安裝軟件,或復(fù)制綠色軟件來運(yùn)行,就把“drive_c”當(dāng)成Windows的C盤來用,都往里面復(fù)制就行了。其實(shí)直接使用PhotoShop的這個(gè)Wine環(huán)境文件夾也可以,但是為了避免一些麻煩,比如防止意外卸載了PhotoShop之后你放在里面的軟件也被一同刪除,我們還是最好自己弄個(gè)單獨(dú)的環(huán)境。另外說明一下,這是32位的Wine環(huán)境,不能運(yùn)行64位的Windows程序,如果要運(yùn)行64位的程序,需要手工配置64位的環(huán)境,因?yàn)閁OS還沒有提供直接安裝的64位Windows程序。
先把前面在“/opt/apps/com.pscs6.deepin/files”中看到的files.7z復(fù)制到“/home/用戶名/.deepinwine”文件夾中,然后在files.7z上單擊右鍵,在右鍵菜單中選擇“解壓到當(dāng)前文件夾”。然后“/home/用戶名/.deepinwine”下面就會(huì)多出一個(gè)“files”文件夾,把它改個(gè)名字,比如“MyGames”或者像我一樣改成“Default”。這個(gè)文件夾中的內(nèi)容和之前“Deepin-CS6”文件夾中的一樣,但你不需要在這里運(yùn)行PhotoShop,因此可以把“/home/guee/.deepinwine/Default/drive_c/Program Files”里面的Adoeb刪除掉,節(jié)省一些空間。
再然后可以把下載到的綠色軟件或者安裝程序等都復(fù)制到“/home/guee/.deepinwine/Default/drive_c”中你喜歡的位置,最后把前面看到的“run.sh”復(fù)制出來進(jìn)行一些修改,就可以運(yùn)行它們了。當(dāng)然也可以復(fù)制下面的內(nèi)容,保存為一個(gè)擴(kuò)展名為“.sh”的文件,注意要在文件屬性的“權(quán)限管理”中設(shè)置“允許以程序執(zhí)行”。
上面的“EXEC_PATH”后面的字符串就是你要運(yùn)行的程序路徑,我是從“游俠網(wǎng)”下載了一個(gè)綠色版本的《憤怒的小鳥》,其實(shí)看到文件夾名中的“ali213”應(yīng)該就猜到了。這是綠色軟件,如果要運(yùn)行的不是綠色軟件而是安裝程序,過程也一樣,只要把安裝程序設(shè)置為要運(yùn)行的程序就可以了。安裝完成后,可以再修改一下運(yùn)行腳本,把“EXEC_PATH”后面的字符串改為安裝完成的程序路徑。
安裝程序運(yùn)行時(shí)如果在Windows的桌面或開始菜單創(chuàng)建了快捷方式,一般情況下Wine就會(huì)自動(dòng)幫你在UOS的桌面和開始菜單中創(chuàng)建對(duì)應(yīng)的Linux格式的快捷方式。如果Wine沒幫你創(chuàng)建,那么也可以自己創(chuàng)建,也就是編寫一個(gè)擴(kuò)展名為“.desktop”的文件放在桌面上,或者“/usr/share/applications”中(開始菜單中的程序快捷方式)。只是向“/usr/share/applications”這個(gè)文件夾寫文件需要root權(quán)限,如果沒有打開UOS的開發(fā)者模式,那么把“.desktop”文件放在“/home/用戶名
/.local/share/applications”中也可以。
“.desktop”文件的格式我就不詳細(xì)說明了,在網(wǎng)上有很多資料。
至此,就可以嘗試在龍芯3A5000的電腦上用二進(jìn)制翻譯功能運(yùn)行任何的32位Windows程序了??赡艹晒Γ部赡苓\(yùn)行出錯(cuò)。反正我已經(jīng)成功安裝、運(yùn)行了很多小軟件和游戲,比如7z、帝國時(shí)代2、仙劍奇?zhèn)b傳、憤怒的小鳥、CS……等等。