蘇 煜,張 濤,靳國杰,榮 輝,王金雙,趙 敏
(1.解放軍理工大學(xué)指揮信息系統(tǒng)學(xué)院,江蘇南京210007)(2.龍芯中科技術(shù)有限公司,北京100098)
核心軟硬件的自主化對于國家信息安全至關(guān)重要.目前,國產(chǎn)處理器主要有龍芯、飛騰等;操作系統(tǒng)主要代表是中標(biāo)麒麟;數(shù)據(jù)庫主要有人大金倉、神通和達(dá)夢等.龍芯處理器采用MIPS指令集,運行類Unix操作系統(tǒng),由于該平臺上應(yīng)用軟件還相對匱乏,且Windows程序無法直接在該平臺上運行,這對傳統(tǒng)應(yīng)用的移植以及該平臺的推廣與應(yīng)用造成一定的影響.
傳統(tǒng)的軟件移植的主要類型通常是二進(jìn)制移植(移植可執(zhí)行文件)和源代碼移植(移植源語言表達(dá)式)[1].源代碼移植是通過對軟件源代碼進(jìn)行分析,找出其相關(guān)于目標(biāo)環(huán)境的代碼,并進(jìn)行修改,使其符合環(huán)境的運行要求,但有些時候源代碼無法獲得.二進(jìn)制移植是指可執(zhí)行文件通過向目標(biāo)環(huán)境移植,達(dá)到在目標(biāo)環(huán)境正常運行的移植方法.虛擬化技術(shù)是常用的二進(jìn)制移植方法,但目前龍芯處理器的性能還難以克服當(dāng)前虛擬化技術(shù)帶來的性能影響.
因此,文中提出了在龍芯處理器上交叉編譯Wine軟件,使其提供Windows應(yīng)用軟件運行環(huán)境的輕量級解決方案,并通過Wine與Bochs模擬器相結(jié)合實現(xiàn)了X86指令集向龍芯MIPS指令集的解釋執(zhí)行,從而實現(xiàn)了Windows程序向龍芯平臺的零修改遷移.
指令集仿真是解決不同指令集之間軟件二進(jìn)制移植的主要方法.當(dāng)前,對指令集的仿真主要分為兩種方式:一種是指令解釋執(zhí)行,一種是二進(jìn)制翻譯[2].解釋執(zhí)行通過對源指令進(jìn)行取指、譯碼和仿真,實現(xiàn)源指令集體系結(jié)構(gòu)ISA(instruction set architecture)向目標(biāo)ISA的映射.Bochs便是一個開源的指令集解釋器,它可以通過對不同設(shè)備進(jìn)行模擬,實現(xiàn)應(yīng)用對虛擬化的不同要求,而不需要對整個系統(tǒng)進(jìn)行仿真.二進(jìn)制翻譯是把源指令塊翻譯成執(zhí)行同樣功能的目標(biāo)指令,因為是指令塊之間的對應(yīng),相對于解釋執(zhí)行,效率會更高.QEMU(quick EMUlator)是目前較為先進(jìn)的支持多元多目標(biāo)平臺的動態(tài)二進(jìn)制翻譯系統(tǒng)[3].為了實現(xiàn)Windows應(yīng)用程序在跨操作系統(tǒng),跨指令集的平臺下運行,不僅需要對用戶指令進(jìn)行翻譯,同時還需要仿真Windows的系統(tǒng)調(diào)用.單純的使用指令集仿真無形當(dāng)中加重了虛擬化的負(fù)擔(dān),影響了使用效率.因此,將Wine編譯到MIPS環(huán)境,由Wine來提供Windows應(yīng)用程序所需的部分API,同時通過Bochs實現(xiàn)在MIPS環(huán)境下用戶指令和部分Windows原生動態(tài)庫的解釋執(zhí)行,構(gòu)建Bochs+Wine方式提高運行效率.未來可考慮實現(xiàn)QEMU+Wine的方式來進(jìn)一步優(yōu)化系統(tǒng),提高效率.
采用分層思想的計算機(jī)體系結(jié)構(gòu)存在ISA和ABI(application binary interface)[4]兩個重要接口.ISA由用戶ISA和系統(tǒng)ISA組成,ABI主要由系統(tǒng)調(diào)用接口和用戶ISA組成[5].X86與MIPS分別有不同的ISA且相互不兼容.同時為了提高軟件在不同ISA的運行效率,面臨著系統(tǒng)調(diào)用跨平臺執(zhí)行的性能優(yōu)化問題.
為了迎合自主化的需要,該虛擬結(jié)構(gòu)運行在搭載Linux操作系統(tǒng)的龍芯3A處理器上.龍芯3A是國家自主研制的基于MIPS指令集的處理器.在該平臺上運行X86指令的Windows應(yīng)用程序既跨體系結(jié)構(gòu)又跨操作系統(tǒng)平臺.本系統(tǒng)采用開源軟件Wine和Bochs來完成此任務(wù),整體設(shè)計方案如圖1.
圖1 跨平臺中間件的整體設(shè)計方案Fig.1 Overall design of cross platform middleware
該系統(tǒng)通過虛擬化技術(shù)構(gòu)造一個進(jìn)程虛擬機(jī),該虛擬機(jī)通過Wine提供并實現(xiàn)應(yīng)用程序運行所需的動態(tài)庫.結(jié)合X86模擬器對應(yīng)用程序調(diào)用的Windows原生動態(tài)庫以及Wine的初始化指令進(jìn)行翻譯執(zhí)行,通過X86模擬器實現(xiàn)Wine在不同ISA平臺下對Windows系統(tǒng)庫的兼容.
虛擬化是構(gòu)建一個將虛擬的客戶系統(tǒng)映射到真實的主機(jī)系統(tǒng)上的同態(tài).通過虛擬化技術(shù),可以實現(xiàn)依賴于客戶系統(tǒng)的軟件在主機(jī)系統(tǒng)上良好運行.虛擬化過程包含兩個部分:①把虛擬資源或狀態(tài)映射成底層機(jī)器中的真實資源;②使用真實機(jī)器上的指令和/或系統(tǒng)調(diào)用來執(zhí)行虛擬機(jī)的指令和/或系統(tǒng)調(diào)用規(guī)定的活動[6].虛擬機(jī)便是通過虛擬化技術(shù),構(gòu)建一個介于主機(jī)和客戶系統(tǒng)的中間件實現(xiàn)仿真平臺的設(shè)計架構(gòu).通過虛擬機(jī)ABI或ISA的仿真,實現(xiàn)可執(zhí)行文件的跨平臺移植.
Wine通過Window API仿真實現(xiàn)Windows軟件在類UNIX系統(tǒng)中運行[7].與一般的模擬器不同,它并不提供虛擬cpu以及I/O設(shè)備的仿真,而是通過Winelib把Windows API(應(yīng)用程序接口)用標(biāo)準(zhǔn)的Unix和X接口重新實現(xiàn)(圖2).Windows應(yīng)用程序的運行主要依賴于 NTDLL,KERNEL32,GDI32和USER32 4個動態(tài)庫.Wine已經(jīng)基本實現(xiàn)該DLL動態(tài)庫與UNIX API的對應(yīng).Wine與Windows NT架構(gòu)對應(yīng)關(guān)系如圖 3[8].
圖2 Wine實現(xiàn)相同指令集下的虛擬機(jī)架構(gòu)Fig.2 Virtual machine architecture of Wine implementation
圖3 Wine架構(gòu)以及與Windows NT架構(gòu)的對應(yīng)關(guān)系Fig.3 Corresponding relation between Wine architecture and Windows NT architecture
Bochs是開源的X86仿真平臺.它能夠支持多種不同指令集實現(xiàn)跨指令集的X86仿真.Bochs通過在不同的操作系統(tǒng)與指令集和目標(biāo)應(yīng)用之間構(gòu)建一個虛擬的仿真層(圖4),將目標(biāo)軟件執(zhí)行的代碼指令解釋為主機(jī)可識別指令.Bochs可以模擬Intel X86 CPU、通用I/O設(shè)備和客戶BIOS,還能夠模擬運行大部分的操作系統(tǒng),如Linux,DOS,Windows 95/98,Windows NT/2000/XP 等[9].Bochs 能夠被編譯和使用為多種模式,通常使用Bochs來提供完整的X86 PC模擬器,包括X86處理器,硬件設(shè)備和內(nèi)存.
圖4 利用Bochs實現(xiàn)在MIPS架構(gòu)下的Windows應(yīng)用Fig.4 Application of Windows in MIPS framework using Bochs
由上文可以得出,Windows應(yīng)用程序在運行中,可能會調(diào)用Wine內(nèi)置動態(tài)庫,或者Windows原生動態(tài)庫.在本系統(tǒng)中,由于應(yīng)用程序和Windows原生動態(tài)庫是X86指令集的二進(jìn)制制品,他們都要通過Bochs來模擬執(zhí)行.
系統(tǒng)在運行Windows應(yīng)用程序時,整個進(jìn)程地址空間中存在著如下幾種形態(tài)的線性區(qū):①Windows應(yīng)用程序,PE格式,X86指令;②Windows原生動態(tài)庫,PE格式,X86指令;③Wine內(nèi)置動態(tài)庫,ELF格式,MIPS指令;④Bochs模塊,ELF格式,MIPS指令.相應(yīng)的,系統(tǒng)在運行時,有兩種執(zhí)行形態(tài):①Wine內(nèi)置動態(tài)庫和Bochs模塊,在龍芯CPU上直接執(zhí)行;②Windows應(yīng)用程序和Windows原生動態(tài)庫,通過Bochs模擬執(zhí)行.
系統(tǒng)在運行時,需要在線性區(qū)之間進(jìn)行交互,由一個線性區(qū)到另一個線性區(qū)的切換往往通過函數(shù)調(diào)用.根據(jù)線性區(qū)類型和函數(shù)調(diào)用方式,文中把交互分為如下4種類型,并針對每種類型,進(jìn)行相應(yīng)的接口設(shè)計.
1)從X86指令線性區(qū)調(diào)用到X86指令線性區(qū).X86指令的線性區(qū)都是在Bochs上執(zhí)行,這種類型的調(diào)用方式在X86指令內(nèi)部已經(jīng)完成,并不需要多余的操作.
2)從MIPS指令線性區(qū)調(diào)用到MIPS指令線性區(qū).MIPS指令的線性區(qū)是在龍芯CPU上直接執(zhí)行,這種類型的調(diào)用方式也不需要二進(jìn)制指令外的多余的操作.
3)從X86指令線性區(qū)調(diào)用到MIPS指令線性區(qū).X86指令的線性區(qū)是在Bochs上執(zhí)行的,在本系統(tǒng)中,這種類型的調(diào)用存在于兩個地方:Bochs對指令JMP和CALL的模擬,系統(tǒng)需要在這兩處地方進(jìn)行相應(yīng)的判斷,如果判斷為到MIPS指令線性區(qū)的調(diào)用,則跳轉(zhuǎn)到MIPS指令執(zhí)行.
4)從MIPS指令線性區(qū)調(diào)用到X86指令線性區(qū).回調(diào)就是這種類型的一個典型.當(dāng)回調(diào)發(fā)生時,一部分回調(diào)會跳轉(zhuǎn)到Wine內(nèi)置動態(tài)庫,另一部分會跳轉(zhuǎn)到X86指令部分.除了回調(diào),Wine的內(nèi)置動態(tài)庫中也會有向X86指令部分的調(diào)用.
系統(tǒng)設(shè)計了相應(yīng)的調(diào)用方式,如圖5所示.
圖5 Wine和Bochs交互設(shè)計框圖Fig.5 Interaction design of Wine and Bochs
2.5.1 X86指令線性區(qū)調(diào)用MIPS指令函數(shù)
系統(tǒng)開始運行時,會統(tǒng)計所有MIPS動態(tài)庫中API的名字、地址、參數(shù)個數(shù)等,并把它們記錄在數(shù)據(jù)表中.Bochs在對指令JMP和CALL模擬時,首先獲得要跳轉(zhuǎn)到的指令的地址,該地址存儲在EIP(extended instruction pointer)寄存器中,系統(tǒng)判斷該EIP是指向X86指令空間,還是MIPS指令空間.Bochs在初始化時,遍歷了該進(jìn)程空間中所有的MIPS動態(tài)庫,查表獲取每個MIPS動態(tài)庫的基地址和大小.系統(tǒng)通過將EIP的值和該數(shù)據(jù)表中地址空間范圍比較,來確定該EIP是否指向MIPS指令空間.如果該EIP屬于MIPS指令空間,則進(jìn)行相應(yīng)的處理,跳轉(zhuǎn)到MIPS函數(shù)執(zhí)行;否則繼續(xù)按照Bochs的方式執(zhí)行.
2.5.2 MIPS指令線性區(qū)調(diào)用X86指令函數(shù)
這種類型的調(diào)用主要分為兩種情況:①回調(diào)函數(shù);②PE格式的動態(tài)庫在加載完成后,要執(zhí)行它的入口函數(shù),執(zhí)行入口函數(shù)需要進(jìn)入X86指令空間.
在Bochs中,本文設(shè)計了開啟Bochs模擬執(zhí)行的接口.每個接口都是一個X86指令空間的函數(shù)調(diào)用,根據(jù)調(diào)用的參數(shù)個數(shù)設(shè)計不同的接口類型.接口內(nèi)部的實現(xiàn)中,首先要找到 Bochs的虛擬CPU,然后進(jìn)行相應(yīng)的現(xiàn)場保護(hù),之后進(jìn)行函數(shù)調(diào)用,調(diào)用完成后返回.2.6 多線程的實現(xiàn)
Wine中的程序通過createThread創(chuàng)建新的線程,由Wineserver進(jìn)行線程調(diào)度,并發(fā)起線程的執(zhí)行.新創(chuàng)建的線程從一個入口開始執(zhí)行,線程可能會執(zhí)行到X86指令,需要Bochs來模擬執(zhí)行.
由于每個線程都要有一個獨立的模擬執(zhí)行部件,而且在執(zhí)行的時機(jī)上是物理并發(fā)的,因此需要創(chuàng)建多個Bochs模擬CPU,每個模擬CPU用于執(zhí)行一個線程中的X86指令.
本文測試評估時基于龍芯3A硬件平臺實現(xiàn)了一個原型系統(tǒng).實驗系統(tǒng)的運行環(huán)境為龍芯3A 8核心1Ghz處理器,DDR800 2G內(nèi)存的服務(wù)器,中標(biāo)麒麟高級服務(wù)器版V6.0操作系統(tǒng).系統(tǒng)評估實驗設(shè)置了系統(tǒng)功能和系統(tǒng)性能兩種類型的測試,其中:
1)系統(tǒng)功能測試:通過在原型系統(tǒng)中運行Delphi,VC++開發(fā)的簡單單線程程序和多線程程序,以及復(fù)雜的MIS系統(tǒng)程序來評估系統(tǒng)功能的完善性.
2)系統(tǒng)性能測試:以Windows下運行記事本程序的響應(yīng)時間作為基準(zhǔn),通過本原型系統(tǒng)運行Windows下編譯的記事本程序和 Linux下通過Wine交叉編譯生成的記事本程序的響應(yīng)時間來評估系統(tǒng)性能.
采用虛擬執(zhí)行環(huán)境運行一個delphi程序,該程序繪制基本的delphi控件,并多線程的運行(圖6a)),采用該虛擬執(zhí)行環(huán)境運行貪吃蛇,如圖6b).采用該虛擬執(zhí)行環(huán)境運行一個數(shù)據(jù)庫客戶端,該客戶端采用ODBC的方式訪問遠(yuǎn)程數(shù)據(jù)庫服務(wù)器(如圖6c)).該數(shù)據(jù)庫客戶端可以正常讀寫服務(wù)器里的數(shù)據(jù).
圖6 功能測試Fig.6 Function test
獲得 Windows記事本可執(zhí)行文件 notepad.exe,在Linux終端上使用命令Wine notepad.exe運行notepad.exe程序(圖7).測試該應(yīng)用在運行速度、響應(yīng)時間、穩(wěn)定性等性能是否能夠達(dá)到一般用戶的使用要求.測試中與Windows平臺進(jìn)行比較,測試實例如表1,測試結(jié)果如表2.
表1 測試實例Table 1 Test case
表2 測試結(jié)果Table 2 Test results
經(jīng)系統(tǒng)功能測試,該虛擬環(huán)境支持Delphi,C,C++等多種語言開發(fā)的程序,以及支持網(wǎng)絡(luò)、數(shù)據(jù)庫等多種功能.經(jīng)系統(tǒng)性能測試,系統(tǒng)運行notepad.exe基本滿足使用要求,但需要進(jìn)一步改進(jìn).同時,用oprofile軟件分析影響虛擬環(huán)境性能的函數(shù),為以后的優(yōu)化提供了參考.
文中設(shè)計的零修改軟件移植中間件可以很好地完成Windows程序跨平臺移植,基本實現(xiàn)了簡單程序(notepad.exe)在龍芯平臺上的運行.通過優(yōu)化結(jié)構(gòu),目標(biāo)實現(xiàn)Office軟件在龍芯平臺上的正常運行.這將使國家機(jī)關(guān)在自主化平臺上的辦公得以實現(xiàn).同時,可以基于該系統(tǒng)架構(gòu)進(jìn)行信息流的分析與追蹤,提高系統(tǒng)安全保障.
References)
[1] 陳丹丹.軟件移植實踐[D].杭州:浙江大學(xué),2007.
[2] Cifuentes C,Malhotra V.Binary translation:static,dynamic,retargetable[C]∥Proceedings of International Conference on Software Maintenance.Monterey CA USA:IEEE -CS Press.1996:340 -349.
[3] 陳喬,蔣烈輝,董衛(wèi)宇,等.基于動態(tài)二進(jìn)制翻譯技術(shù)的仿真器研究[J].計算機(jī)工程,2011,37(20):277-279.Chen Qiao,Jiang Liehui,Dong Weiyu,et al.Simulator research based on dynamic binary translation technology[J]].Computer Engineering,2011,37(20):277 -279.(in Chinese)
[4] 黃聰會,陳靖,羅樵,等.面向二進(jìn)制移植的虛擬化技術(shù)[J].計算機(jī)應(yīng)用研究,2012,29(11):4185 -4187.Huang Conghui,Chen Jing,Luo Qiao,et al.Virtualization technology for binary migration[J].Application Research of Computer,2012,29(11):4185 - 4187.(in Chinese)
[5] Smith E,Nair R.The architecture of virtual machines[J].Computer,2005,38(5):32 -38.
[6] Smith J E,Nair R.虛擬機(jī):系統(tǒng)與進(jìn)程的通用平臺[M].北京:機(jī)械工業(yè)出版社,2009:4-7.
[7] Wine User’s Guide.Chapter 1 Introduction.[DB/OL].http:∥www.winehq.org/docsen/wineusr-guide.html#introduction.
[8] Wine Developer’s Guide.Chapter Ⅱ.Wine architect[DB/OL].http:∥www.winehq.orgsite/docs/winedevguide/×2884.
[9] Bochs User Manual.Chapter 1 Introduction to Bochs[DB/OL].http:∥bochs.sourceforge.net.