專利名稱::二進制翻譯中的字節(jié)序調(diào)整方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及的是一種計算機
技術(shù)領(lǐng)域:
的方法,具體是一種二進制翻譯中的字節(jié)序調(diào)整方法。
背景技術(shù):
:動態(tài)二進制翻譯技術(shù)是進程級虛擬機領(lǐng)域中重要的組成部分,它將對應(yīng)源機器平臺的二進制代碼動態(tài)翻譯為可在目標機器平臺上運行的二進制代碼,是解決遺留代碼和提高軟件平臺適應(yīng)性的一種有效手段,為軟件移植和改善系統(tǒng)性能提供了途徑。字節(jié)序是計算機體系結(jié)構(gòu)的一個基本屬性,是計算機處理數(shù)據(jù)時對內(nèi)存中多字節(jié)數(shù)據(jù)的高位和低位進行判定的方法。字節(jié)序有兩種大端字節(jié)序(BigEndian)和小端字節(jié)序(LittleEndian)。Big-Endian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。而Little-Endian則正好相反,低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。典型的大端平臺包括PowerPC和SPARC,而小端平臺的應(yīng)用則更廣泛些,包括X86,MIPS以及ARM等。動態(tài)二進制翻譯中的源機器平臺和目標機器平臺的字節(jié)序往往是不同的,這時對同一條指令,它們的"理解"就變成相反的了。要使源機器平臺的程序能夠正確地在目標機器平臺上執(zhí)行,就需要在翻譯的過程中對字節(jié)序進行調(diào)整。目前在動態(tài)二進制翻譯領(lǐng)域中解決字節(jié)序調(diào)整的方法并不多,主要的思想就是通過修改訪存指令(Load和Store指令)的結(jié)果,使其符合目標機器平臺的字節(jié)序。其中最典型的一種方法就是ByteSw即ping(字節(jié)翻轉(zhuǎn))將每次讀取或?qū)懭雰?nèi)存的數(shù)據(jù)都做一次字節(jié)翻轉(zhuǎn)(bytesw即),即翻轉(zhuǎn)數(shù)據(jù)內(nèi)部的字節(jié)順序。有些處理器提供了一些特性,以簡化ByteSw即ping的過程。比如,Intel公司的80486及其向上的處理器提供了bsw即這條指令來處理"跨字節(jié)序"(Cross-endian)的問題。還有少數(shù)處理器,如IBM公司的PowerPC處理器提供了lwbrx,lhbrx,swbrx,shbrx等特殊的load-store(加載-存儲)指令,這些指令用相反的字節(jié)序來訪問內(nèi)存,從而避免了上述的ByteSw即ping過程。例如lwbrxRT,RA,RB這條指令就是從地址(RA|0)+(RB)處裝載一個字的數(shù)據(jù)到寄存器RT,字的0:7位裝載到RT的24:31位,字的8:15位裝載到RT的16:23位,字的16:23位裝載到RT的8:15位,字的24:31位裝載到RT的0:7位。經(jīng)過對現(xiàn)有文獻的檢索發(fā)現(xiàn),美國專利號為5867690,公開時間1999年2月2日,名禾爾ApparatusForConvertingDataBetweenDifferentEndianFormatsAndSystemAndMethodEmployingSame,該技術(shù)提供了一種在不同字節(jié)序系統(tǒng)之間轉(zhuǎn)換數(shù)據(jù)的方法及其裝置,其在處理器和存儲設(shè)備之間實現(xiàn)了一個ByteSw即pingDevice(字節(jié)翻轉(zhuǎn)設(shè)備),使得處理器能夠處理存儲設(shè)備中字節(jié)序與其不同的數(shù)據(jù)。但是,盡管是硬件的實現(xiàn),上述技術(shù)還是需要搬移數(shù)據(jù)的內(nèi)部字節(jié)順序,而邏輯單元也較為繁瑣,所以這個搬移的開銷是非常大的。對于那些沒有硬件體系結(jié)構(gòu)支持的處理器來說,ByteSwapping的開銷則更為巨大,對系統(tǒng)性能有較大的制約。
發(fā)明內(nèi)容本發(fā)明的目的在于克服現(xiàn)有技術(shù)的上述不足,提供了一種二進制翻譯中的字節(jié)序調(diào)整方法。本發(fā)明基于中間指令來調(diào)整字節(jié)序,既能使源機器平臺的程序能夠正確地在目標機器平臺上執(zhí)行,又能提高跨平臺翻譯的性能。本發(fā)明是通過以下技術(shù)方案實現(xiàn)的,包括以下步驟第一步,動態(tài)二進制翻譯系統(tǒng)的執(zhí)行引擎加載源程序可執(zhí)行映像,將各個程序段的內(nèi)容進行字節(jié)序調(diào)整,同時調(diào)整加載進來的參數(shù)個數(shù)、參數(shù)內(nèi)容和環(huán)境變量。所述的動態(tài)二進制翻譯系統(tǒng)包括前端解碼器(Front-End)、中端優(yōu)化器(Middle-End)、后端編碼器(Back-End)和中間指令集,其中前端解碼器與中間指令集相連傳輸源程序,中間指令集和中端優(yōu)化器相連傳輸中間代碼信息,中端優(yōu)化器與后端編碼器相連傳輸優(yōu)化后的中間代碼信息,后端編碼器輸出編碼后的代碼信息。所述的動態(tài)二進制翻譯系統(tǒng)是昆士蘭大學的UQDBT系統(tǒng),或者是弗吉尼亞大學的strata系統(tǒng),或者是上海交通大學的CrossBit系統(tǒng)。第二步,修改表示內(nèi)存訪問的中間指令的有效地址,使修改后的有效地址的表達符合源程序內(nèi)存訪問指令的語義,以在內(nèi)存中加載或存儲正確的數(shù)據(jù)。所述的修改后的有效地址等于,內(nèi)存中數(shù)據(jù)的最高地址與數(shù)據(jù)的最低地址的和,減去訪存指令操作的字節(jié)數(shù)與源程序要訪問的有效地址的和。所述的修改后的有效地址適用于地址以字為單位進行分配的體系結(jié)構(gòu),并且存儲器訪問都是對齊的,即半字從雙字節(jié)的邊界加載和存儲,字從四字節(jié)的邊界加載和存儲,根據(jù)表示內(nèi)存訪問的中間指令的參數(shù)求出該訪存指令訪問的有效地址,然后更新有效地址以完成中間指令的修改,具體過程為1)如果訪問的是字節(jié)數(shù)據(jù),將有效地址和4做求模運算得i,如果i為0,則將該有效地址加3;如果i為l,則將該有效地址加1;如果i為2,則將該有效地址減1;如果i為3,則將該有效地址減3;2)如果訪問的是半字數(shù)據(jù),將有效地址和4做求模運算得i,如果i為0,則將該有效地址加2;如果i為2,則將該有效地址減2;3)如果訪問的是字數(shù)據(jù),無需做地址轉(zhuǎn)換。第三步,前端解碼器將源程序指令翻譯為中間指令,然后將生成的中間指令加入到構(gòu)建的中間指令基本塊中,直到發(fā)生直接跳轉(zhuǎn)或系統(tǒng)調(diào)用,則結(jié)束當前基本塊的構(gòu)造,并將該基本塊發(fā)送到后端執(zhí)行。與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是通過修改訪存指令的有效地址,無需搬移數(shù)據(jù)內(nèi)部字節(jié)順序,完成不同字節(jié)序平臺之間的程序翻譯,并且獲得很好的性能提升。具體實施例方式以下對本發(fā)明的方法進一步描述本實施例在以本發(fā)明技術(shù)方案為前提下進行實施,給出了詳細的實施方式和具體的操作過程,但本發(fā)明的保護范圍不限于下述的實施例。實施例本實施例用于對LD指令進行字節(jié)序調(diào)整,包括步驟如下第一步,動態(tài)二進制翻譯系統(tǒng)的執(zhí)行引擎加載源程序可執(zhí)行映像,將各個程序段的內(nèi)容進行字節(jié)序調(diào)整,同時調(diào)整加載進來的參數(shù)個數(shù)、參數(shù)內(nèi)容和環(huán)境變量。所述的動態(tài)二進制翻譯系統(tǒng)是昆士蘭大學的UQDBT系統(tǒng),或者是弗吉尼亞大學的strata系統(tǒng),或者是上海交通大學的CrossBit系統(tǒng),其中UQDBT系統(tǒng)參見發(fā)表于《ProceedingsoftheACMSIGPLANWorkshoponDynamicandAdaptiveCompilationandOptimization(美國計算機協(xié)會SIGPALN組織關(guān)于動態(tài)和自適應(yīng)編譯與優(yōu)化的附屬會議)》上的"Machine-Ad即tableDynamicBinaryTranslation(可自適應(yīng)機器的云力態(tài)二進制翻譯)"文獻,或者是UQDBT系統(tǒng)項目的主頁http:〃麗w.itee.叫edu.au廠cristina/叫bt.html;strata系統(tǒng)參見發(fā)表于2001年《IEEEWorkshoponBinaryTranslation(美國電氣和電子工程師協(xié)會關(guān)于二進制翻譯的附屬會議)》上的"Strata:ASoftwareDynamicTranslationInfrastructure(strata:—個軟件動態(tài)翻譯的框架)"文獻,或者是strata系統(tǒng)項目的主頁http:〃www.cs.pitt.edu/coco/strata;CrossBit系統(tǒng)參見2007年發(fā)表于《計算機工程》上的"動態(tài)二進制翻譯基礎(chǔ)平臺CrossBit的設(shè)計與實現(xiàn)"文獻,或者是CrossBit系統(tǒng)的項目主頁202.120.40.100。本實施例采用的二進制翻譯系統(tǒng)是上海交通大學的CrossBit系統(tǒng),該系統(tǒng)以MIPS(MIPS公司開發(fā)的精簡指令集微處理器)為前端體系結(jié)構(gòu)、PowerPC為后端體系結(jié)構(gòu)來完成二進制翻譯中的字節(jié)序的調(diào)整,CrossBit系統(tǒng)采用VINST作為中間指令集,VINST是一種低層次的類RISC指令集,具有無窮多個32位虛擬寄存器、Load-Store風格體系結(jié)構(gòu)、唯一的偏址尋址模式,VINST的內(nèi)存訪問指令包括LD指令和ST指令。CrossBit的執(zhí)行引擎將MIPS體系結(jié)構(gòu)的可執(zhí)行文件映像加載到CrossBit內(nèi)存空間中,并讀取代碼段入口地址,加載過程中需對源程序的各段進行字節(jié)序翻轉(zhuǎn)。源機器平臺和目標機器平臺的字節(jié)順序不同,源程序映像(以ELF文件為例)的.text段(代碼段)和.bss段(存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域)在加載的時候都需要進行字節(jié)序的翻轉(zhuǎn)。設(shè)置堆棧時,壓入的參數(shù)(參數(shù)個數(shù)和參數(shù)內(nèi)容)和環(huán)境變量也要做字節(jié)序翻轉(zhuǎn)處理。第二步,修改表示內(nèi)存訪問的中間指令的有效地址,使修改后的有效地址的表達符合源程序內(nèi)存訪問指令的語義,以在內(nèi)存中加載或存儲正確的數(shù)據(jù)。所述的修改后的有效地址等于,內(nèi)存中數(shù)據(jù)的最高地址與數(shù)據(jù)的最低地址的和,減去訪存指令操作的字節(jié)數(shù)與源程序要訪問的有效地址的和。LD指令有4個參數(shù)源寄存器reg、偏移量disp、數(shù)據(jù)的大小size和目標寄存器dst,訪存的有效地址ea即為ea=[reg]+disp。1)如果size=1,即加載字節(jié)數(shù)據(jù),對ea和4做求模運算得到i(i=ea%4),如果i=0,則修改后的有效地址ea'=ea+3;如果i=1,則修改后的有效地址ea'=ea+1;如果i=2,則修改后的有效地址ea'=ea-1;如果i=3,則修改后的有效地址ea'=2)如果size=2,即加載半字數(shù)據(jù),對ea和4做求模運算得到i(i=ea%4),如果i=0,則修改后的有效地址ea'=ea+2;如果i=2,則修改后的有效地址ea'=ea_2;3)如果size=4,即加載字數(shù)據(jù),無需做地址轉(zhuǎn)換。第三步,入口地址傳遞到前端解碼器的解碼函數(shù)中進行指令解釋,將源程序指令翻譯為一條到若干條VINST中間指令,然后將生成的中間指令封裝到構(gòu)建的中間指令基本5塊(VBlock)中,直到發(fā)生直接跳轉(zhuǎn)或系統(tǒng)調(diào)用,則結(jié)束當前基本塊的構(gòu)造,將該基本塊發(fā)送到后端,調(diào)用后端編碼器,編碼函數(shù)以中間指令塊VBlock為輸入,將生成的后端目標代碼(PowerPC指令)插入到目標代碼塊TBlock中,TBlock代表了一個可運行的目標代碼塊。TBlock包含有唯一的入口(Entry)和若干個出口(Exit),CrossBit從TBlock入口開始進入目標代碼的執(zhí)行,隨后從出口返回。本實施例的優(yōu)點利用MIPS和PowerPC體系結(jié)構(gòu)存儲器格式的特點,通過修改表示內(nèi)存訪問的中間指令的有效地址,正確地表達了源程序的內(nèi)存訪問指令的語義,從而無需搬移數(shù)據(jù)本身的內(nèi)部字節(jié)順序,完成不同字節(jié)序平臺之間的程序翻譯,并且獲得很好的性能提升。權(quán)利要求一種二進制翻譯中的字節(jié)序調(diào)整方法,其特征在于,包括以下步驟第一步,動態(tài)二進制翻譯系統(tǒng)的執(zhí)行引擎加載源程序可執(zhí)行映像,將各個程序段的內(nèi)容進行字節(jié)序調(diào)整,同時調(diào)整加載進來的參數(shù)個數(shù)、參數(shù)內(nèi)容和環(huán)境變量;第二步,修改表示內(nèi)存訪問的中間指令的有效地址,使修改后的有效地址的表達符合源程序內(nèi)存訪問指令的語義,以在內(nèi)存中加載或存儲正確的數(shù)據(jù);第三步,前端解碼器將源程序指令翻譯為中間指令,然后將生成的中間指令加入到構(gòu)建的中間指令基本塊中,直到發(fā)生直接跳轉(zhuǎn)或系統(tǒng)調(diào)用,則結(jié)束當前基本塊的構(gòu)造,并將該基本塊發(fā)送到后端執(zhí)行。2.根據(jù)權(quán)利要求1所述的二進制翻譯中的字節(jié)序調(diào)整方法,其特征是,所述的動態(tài)二進制翻譯系統(tǒng)包括前端解碼器、中端優(yōu)化器、后端編碼器和中間指令集,其中前端解碼器與中間指令集相連傳輸源程序,中間指令集和中端優(yōu)化器相連傳輸中間代碼信息,中端優(yōu)化器與后端編碼器相連傳輸優(yōu)化后的中間代碼信息,后端編碼器輸出編碼后的代碼信息。3.根據(jù)權(quán)利要求2所述的二進制翻譯中的字節(jié)序調(diào)整方法,其特征是,所述的動態(tài)二進制翻譯系統(tǒng)是昆士蘭大學的UQDBT系統(tǒng),或者是弗吉尼亞大學的strata系統(tǒng),或者是上海交通大學的CrossBit系統(tǒng)。4.根據(jù)權(quán)利要求1所述的二進制翻譯中的字節(jié)序調(diào)整方法,其特征是,所述的修改后的有效地址等于,內(nèi)存中數(shù)據(jù)的最高地址與數(shù)據(jù)的最低地址的和,減去訪存指令操作的字節(jié)數(shù)與源程序要訪問的有效地址的和。5.根據(jù)權(quán)利要求4所述的二進制翻譯中的字節(jié)序調(diào)整方法,其特征是,所述的修改后的有效地址適用于地址以字為單位進行分配的體系結(jié)構(gòu),并且存儲器訪問都是對齊的,即半字從雙字節(jié)的邊界加載和存儲,字從四字節(jié)的邊界加載和存儲,根據(jù)表示內(nèi)存訪問的中間指令的參數(shù)求出該訪存指令訪問的有效地址,然后更新有效地址以完成中間指令修改,具體過程為1)如果訪問的是字節(jié)數(shù)據(jù),將有效地址和4做求模運算得i,如果i為0,則將該有效地址加3;如果i為l,則將該有效地址加1;如果i為2,則將該有效地址減1;如果i為3,則將該有效地址減3;2)如果訪問的是半字數(shù)據(jù),將有效地址和4做求模運算得i,如果i為0,則將該有效地址加2;如果i為2,則將該有效地址減2;3)如果訪問的是字數(shù)據(jù),無需做地址轉(zhuǎn)換。全文摘要本發(fā)明公開了一種計算機
技術(shù)領(lǐng)域:
的二進制翻譯中的字節(jié)序調(diào)整方法,包括以下步驟動態(tài)二進制翻譯系統(tǒng)的執(zhí)行引擎加載源程序可執(zhí)行映像,將各個程序段的內(nèi)容進行字節(jié)序調(diào)整,同時調(diào)整加載進來的參數(shù)個數(shù)、參數(shù)內(nèi)容和環(huán)境變量;修改表示內(nèi)存訪問的中間指令的有效地址,使修改后的有效地址的表達符合源程序內(nèi)存訪問指令的語義,以在內(nèi)存中加載或存儲正確的數(shù)據(jù);前端解碼器將源程序指令翻譯為中間指令,然后將生成的中間指令加入到構(gòu)建的中間指令基本塊中,直到發(fā)生直接跳轉(zhuǎn)或系統(tǒng)調(diào)用,則結(jié)束當前基本塊的構(gòu)造,并將該基本塊發(fā)送到后端執(zhí)行。本發(fā)明采用修改內(nèi)存地址的方法避免了內(nèi)存數(shù)據(jù)字節(jié)順序的搬移,高效準確,在二進制翻譯領(lǐng)域具有通用性。文檔編號G06F9/30GK101763242SQ201010300018公開日2010年6月30日申請日期2010年1月4日優(yōu)先權(quán)日2010年1月4日發(fā)明者劉博,朱彤,楊輝兵,梁阿磊,管海兵申請人:上海交通大學