專利名稱:中間語言的延遲跳轉(zhuǎn)指令二進制翻譯實現(xiàn)的方法
技術領域:
本發(fā)明涉及的是一種電信技術領域的方法,特別是一種中間語言的延遲跳轉(zhuǎn)指 令二進制翻譯實現(xiàn)的方法。
背景技術:
虛擬執(zhí)行技術中的動態(tài)二進制翻譯是應用最為廣泛的方法,是為遺留代碼提供 移植可能性和提高軟件的平臺適應性的一種有效手段,它在不需要可執(zhí)行程序的源 代碼的情況下,可以動態(tài)地將源機器平臺上的二進制程序經(jīng)過轉(zhuǎn)換,運行于其他目 標機器平臺上。
要使源平臺的程序能夠正確地在目標平臺上執(zhí)行,就必須通過動態(tài)二進制翻譯 在目標平臺上對源平臺進行完全而正確的模擬。這其中主要包括對源平臺指令集的 解釋和系統(tǒng)調(diào)用的模擬,然而每個體系結構都有自身的一些特性,比如Intel的x86 處理器只有8個通用寄存器,有些RISC體系結構的寄存器數(shù)目稍多一些,SPARC處 理器上還實現(xiàn)了寄存器窗口的技術,使得它實際上擁有上百個通用寄存器。諸如此 類的特征都會體現(xiàn)在體系結構的指令集中,在利用中間指令翻譯源平臺代碼實現(xiàn)多 源多目標的動態(tài)二進制翻譯系統(tǒng)中,既要保證源平臺指令語義能被正確翻譯,又要 不違反中間指令精簡的原則,有時候是很難實現(xiàn)的,即便實現(xiàn)了,也可能造成很大 的開銷。
在流水線體系結構中,當前一條指令還在解碼階段時,流水線就已經(jīng)去存儲器 中取后一條指令了,以此來提高CPU執(zhí)行指令的吞吐量。但當碰到跳轉(zhuǎn)指令時,執(zhí) 行跳轉(zhuǎn)的時候后面已經(jīng)上流水線的指令很可能是無用的,這樣無疑會導致性能的下 降。于是現(xiàn)在大部分的體系結構中都采用了延遲跳轉(zhuǎn)技術,在跳轉(zhuǎn)指令后放置一條 或幾條需要執(zhí)行的指令,它們所在的位置稱作延遲槽,這樣即使跳轉(zhuǎn)了,已經(jīng)上流 水線的指令也不會被浪費。 一些常見的RISC體系結構都應用了這樣的技術,比如 MIPS、 PA-RISC、 SPARC都有容納一條指令的延遲槽,同時還有少量的體系結構,如SHARC DSP和MIPS-X實現(xiàn)了含有兩條指令的延遲槽。
SPARC體系結構在此原則上還實現(xiàn)了一個更加復雜的延遲跳轉(zhuǎn)技術,它在條件 跳轉(zhuǎn)指令中引入了一個控制位armul bit,當執(zhí)行跳轉(zhuǎn)時,延遲槽指令會被執(zhí)行; 當不跳轉(zhuǎn)時,會檢査annul bit,如果它為1,則不執(zhí)行延遲槽中指令,否則仍然執(zhí) 行。這樣設計的目的是讓SPARC平臺的程序可以更加靈活,比如有些條件跳轉(zhuǎn)在跳 轉(zhuǎn)成功時需要幾條延遲槽指令,但不跳轉(zhuǎn)時卻不需要任何多余的指令,這樣如果使 用簡單的延遲槽方法,不夠靈活或者造成空間上的浪費。SPARC平臺在條件跳轉(zhuǎn)指 令中引入這樣一個控制位,就能最大程度地節(jié)省空間,同時還保證了執(zhí)行效率。
但在動態(tài)二進制翻譯的環(huán)境中,如何在目標平臺上模擬出源平臺延遲跳轉(zhuǎn)指令 的特性就成了一個重要的課題。因為目標平臺往往不具備相同的延遲槽指令處理機 制,目前在二進制翻譯領域可以使用如下方法完成對延遲跳轉(zhuǎn)指令的模擬
1、 最簡單的方法,將源平臺的延遲跳轉(zhuǎn)指令轉(zhuǎn)換為目標平臺的非延遲跳轉(zhuǎn)指 令,如果指令集中帶有anrml bit的話,再根據(jù)其值將延遲槽里的指令放到跳轉(zhuǎn)的 一個或兩個方向上。但當延遲槽指令也是一條延遲跳轉(zhuǎn)指令、CALL指令或其他控制 轉(zhuǎn)移指令的話,就無法正確執(zhí)行到第一個跳轉(zhuǎn)的目標指令了 。
2、 利用RTL (Register Transfer Lists),先將源平臺指令翻譯為RTL而不是 直接翻譯為目標平臺代碼,然后對這些RTL進行轉(zhuǎn)換和優(yōu)化,最終再將它翻譯為目 標平臺的代碼。RTL對描述源指令集和目標指令集以及它們之間的互相翻譯提供了 一個統(tǒng)一的框架。
RTL是對程序運行期間機器平臺變化效果的一種列表描述,每一個效果即表示 了一個值被傳遞到一個指定的存儲位置(比如一個store指令),這個傳遞當且僅當 RTL中的判斷表達式為真時才發(fā)生。
比如對于指令I的RTL格式如下
bh -〉 nPC := targeti | annul = a! | Ic
其中
bI:表示I是否跳轉(zhuǎn),它是一個表達式而不是一個常量或者I的一部分。對于
非跳轉(zhuǎn)指令,b:為false。對于CALL指令和非條件跳轉(zhuǎn)指令,h為true。
target"當b,為true時,target為能在運行時計算出跳轉(zhuǎn)目的地址的表達式。當b,為false時,targe^是任意的,即不用在此特地指定。
aI:告知是否要忽略指令I下一條指令的表達式,對于大部分指令來說&為 false,對于條件跳轉(zhuǎn)指令,以BNE指令為例,當a位(annul bit)為1且不發(fā)生 跳轉(zhuǎn)時忽略它后面那條指令,所以a!為a"Z。
I"完成指令I計算的RTL。
于是一條源平臺的延遲跳轉(zhuǎn)指令就可翻譯為一條RTL,其中描述了執(zhí)行這條語 句后PC和nPC的值,這樣就能順利地再翻譯到目標機器代碼并且不改變源指令的執(zhí) 行順序。
3、第三種方法是用中間指令的方法實現(xiàn)動態(tài)二進制翻譯,但是當碰到延遲跳 轉(zhuǎn)指令時,由于源平臺的標志位需要在翻譯后代碼在目標平臺上執(zhí)行時才能確定, 所以在將源平臺指令翻譯到中間指令的過程中是無法確定是不是忽略延遲槽中的指 令的。這個地方就在動態(tài)二進制翻譯器的性能上做出了一些讓步,在翻譯到延遲跳 轉(zhuǎn)指令時跳回翻譯器本身,由翻譯器本身的函數(shù)來確定跳轉(zhuǎn)后的目的地址,和是否 要執(zhí)行位于延遲槽中的指令。
從上述三種對延遲跳轉(zhuǎn)指令的二進制翻譯方法可以看到,每種方法都有其固有 的優(yōu)缺點。第一種方法比較簡單直接,由于沒有其他開銷,性能也比較客觀。但是 它的應用場景也非常局限,比如對于現(xiàn)在比較普遍的多源多目標動態(tài)二進制翻譯器 來說,就不能夠從容應付了。第二種方法采用了一個通用的框架RTL進行翻譯,應 用面比第一種更廣,解決了當遇到延遲槽中也是一條延遲跳轉(zhuǎn)指令這種情況的問題。 但是當應用到具有TCache的動態(tài)二進制翻譯器中的時候,延遲槽中的指令地址就有 可能成為跳轉(zhuǎn)目的基本塊的首地址,如果這條延遲槽指令也是其他跳轉(zhuǎn)指令的目的 指令的話,基本塊的重用就會出錯,或者可以不把這些基本塊放入TCache中,但是 增加系統(tǒng)復雜性的同時還會降低系統(tǒng)性能。第三種方法實現(xiàn)起來比較容易,并且沒 有使用已有的通用框架,自由度也更大,對于annul bit是0或1的兩種情況分開 處理,可以避免上述的基本塊重用沖突問題。但是這種方法會明顯降低動態(tài)二進制 翻譯系統(tǒng)的性能。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對現(xiàn)有技術的不足,提供一種中間語言的延遲跳轉(zhuǎn)指令二
6進制翻譯實現(xiàn)的方法,本發(fā)明保證了翻譯后程序執(zhí)行的正確性,又要保證執(zhí)行的性 能,同時還滿足了動態(tài)二進制翻譯系統(tǒng)多源多目標所要求的重定向特性。
本發(fā)明是通過以下技術方案實現(xiàn)的
本發(fā)明利用獨立于源機器語言和目標機器語言的中間語言來正確地表達源平 臺延遲跳轉(zhuǎn)指令的語義,然后提交給后端翻譯為目標機器語言執(zhí)行,當二進制翻譯 器遇到延遲跳轉(zhuǎn)指令時,如SPARC平臺的根據(jù)整數(shù)條件位(Integer Condition Codes)來判斷跳轉(zhuǎn)的目的地址的Bice (Branch on Integer Condition Codes)系 列指令時,翻譯中間指令的步驟如下
步驟一,保存跳轉(zhuǎn)的目的地址為addr,值為用當前PC值加上指令中對應位表
示的跳轉(zhuǎn)偏移值。具體操作以下兩步-
① 添加獲取整數(shù)條件位的對應中間指令;
② 如果指令中包含annul bit,則取出指令中的annul bit并判斷。 步驟二,當annulbit為0時,先翻譯延遲槽中的指令為對應的中間指令,再
翻譯當前的這條Branch指令。
步驟三,當annul bit為l,即不跳轉(zhuǎn)則忽略延遲槽中的指令時,先以相反的 條件翻譯Branch指令,目的地址為延遲槽后的第一條指令;
然后翻譯延遲槽中的指令為中間指令;
最后再在中間指令基本塊中添加一條直接跳轉(zhuǎn)指令,目的地址為先前保存的 addr。
步驟四,將中間指令基本塊提交給二進制翻譯器后端翻譯為后端指令執(zhí)行。 二進制翻譯器的中間語言有與機器依賴性低、可重定向、細粒度等特點,通常
還包含配套的虛擬寄存器存儲中間值,使得中間指令可以正確反映源機器指令的各
種語義,包括各種帶延遲槽的跳轉(zhuǎn)語句。
同時,考慮到實現(xiàn)的方便程度與執(zhí)行時的性能,所述的翻譯延遲槽中的指令為
中間指令,是指并沒有完全按照源機器指令的既定語義進行翻譯,而是巧妙地運 用了亂序翻譯和反向跳轉(zhuǎn)的方法。
所述的亂序翻譯是指,并非按照源機器平臺的指令執(zhí)行順序翻譯,在要執(zhí)行延
遲槽指令的時候,索性先翻譯延遲槽中的指令,再翻譯對應的BRANCH指令。所述的反向跳轉(zhuǎn),是當碰到annul bit為1的時候,先向中間指令基本塊中添 加一條跳轉(zhuǎn)的條件與源指令跳轉(zhuǎn)條件相反的BRANCH中間指令。這樣到了后端執(zhí)行的 時候,如果源指令是不跳轉(zhuǎn)的,那后端翻譯執(zhí)行到這條BRANCH中間指令時就會發(fā)生 跳轉(zhuǎn),然后從延遲槽后一條指令處開始翻譯執(zhí)行,這樣就滿足了當annul bit為1 且不跳轉(zhuǎn)時忽略延遲槽指令的條件。如果源指令是跳轉(zhuǎn)的,那就會順序執(zhí)行已經(jīng)翻 譯為中間指令的延遲槽指令,然后再進行跳轉(zhuǎn)。
考慮有TCache的二進制翻譯場景,因為每個中間語言基本塊都是按源程序映 像中的指令順序構造的,所以在發(fā)生重用時也不會出錯。
本發(fā)明的優(yōu)點在于通過在二進制翻譯中通過中間指令,同時在翻譯的過程插入 一些額外的中間指令,如讀取整數(shù)條件位、反向條件跳轉(zhuǎn)指令等,從而很容易且準 確地翻譯源機器平臺的帶延遲槽的跳轉(zhuǎn)指令。最主要的優(yōu)勢在于它執(zhí)行準確,效率 高,在二進制翻譯領域具有通用性。
具體實施例方式
以下對本發(fā)明的實施例作詳細說明本實施例在以本發(fā)明技術方案為前提下進
行實施,給出了詳細的實施方式和過程,但本發(fā)明的保護范圍不限于下述的實施例。 以下基于Crossbit的SPARC前端作為本項實施例,Crossbit是一個多源多目
標的動態(tài)二進制翻譯系統(tǒng),前端將源機器指令翻譯為自行設計的中間指令,后端將
中間指令翻譯為目標機器指令并執(zhí)行,現(xiàn)有的Crossbit支持的源機器平臺有x86、
MIPS和SPARC,目標機器平臺有x86和SPARC。本實施例在二進制翻譯領域具備通用性。
在Crossbit中實現(xiàn)對帶延遲槽的跳轉(zhuǎn)指令翻譯方法包括以下步驟
1. 在Crossbit執(zhí)行引擎中先將源平臺可執(zhí)行文件映像加載到Crossbit內(nèi)存 空間中,并讀取代碼段入口地址(entry)。
2. 從入口地址處開始逐條讀取源指令并翻譯為對應的一條到多條中間指令, 加入到新構建的中間指令基本塊中,遇到直接跳轉(zhuǎn)(JMP)或系統(tǒng)調(diào)用,則結束當前 基本塊的構造,并將它發(fā)送到后端執(zhí)行。
3. 對每條源機器指令翻譯具體步驟如下
(1) 從映像加載到的內(nèi)存空間中讀取要翻譯的下一條指令。(2) 根據(jù)指令的op部分通過查表找到該指令解碼函數(shù)的入口地址。
(3) 調(diào)用該解碼函數(shù)進行翻譯。
下面以SPARC的其中一條Bicc指令——BE為例,描述本發(fā)明方法在Crossbit 上的實現(xiàn)過程,并驗證在各種情況下的正確性。
BE指令判斷整數(shù)條件位Z是否為l來決定跳轉(zhuǎn)與否,如果Z等于1,則跳轉(zhuǎn), 否則不跳轉(zhuǎn)。并且當annul bit為1且Z不等于1時,忽略Delay slot。 以下根據(jù)源代碼進一步描述說明
〃 BE的解碼函數(shù) void deBE(void承arg) {
〃保存跳轉(zhuǎn)目的地址到addr
unsigned addr = PC + 4水sign—ext22 (plnst->disp22)
if(plnst-〉a==0){
〃如果annul bit為0,即任何情況都不忽略延遲槽指令
〃在基本塊中添加中間指令GET,讀取整數(shù)標志位Z到虛擬寄存器
DELAYREG1
sbb-〉add(GET(Zi, DELAYREG1));
〃先翻譯延遲槽指令 〃讀取延遲槽指令
originInst==Kint*) (PC+4); 〃 SPARC是大字端(big-endian) , Crossbit運行在小字端 (little-endian)機器上,如x86,則需要將讀取的源指令做翻轉(zhuǎn)
flip(&originlnst, sizeof(int));
plnst=(SPARCOpsFmt*)&originInst; 〃通過查表調(diào)用相應的解碼函數(shù)
deTahle [pInst->op]. f (arg) 5
9〃向基本塊添加對應BE的BRANCH中間指令 sbb-〉add (BRANCH (NE, DELAYREG1, 0, 0, addr));
〃設置PC值,指向下一條源指令 PC = PC + 4; }else {
〃如果annul bit等于l,即當不跳轉(zhuǎn)時忽略延遲槽指令
〃添加中間指令,讀取整數(shù)標志位Z的值到虛擬寄存器Zi
sbb-〉add(GET(Zi, Zi)); 〃添加與BE判斷條件相反的BRANCH中間指令,即反跳,如果Z等于0 則跳到PC+8處,在SPARC體系結構中是延遲槽后的第一條指令
sbb->add(BRANCH(EQ, Zi, 0, 0, PC+8));
PC = PC + 4;
〃執(zhí)行到此處說明Z等于1,需先執(zhí)行延遲槽指令并跳轉(zhuǎn) 〃先翻譯延遲槽指令
originlnst二氺(int氺)(PC) ,
flip(&originlnst, sizeof(int));
plnst=(SPARCOpsFmt*)&originlnst;
deTable[plnst-〉op]. f(axg);
〃添加讀取立即數(shù)的中間指令LI,將addr賦給虛擬寄存器TEMPREGl
sbb->add(LI(addr, TEMPREG1)); 〃添加直接跳轉(zhuǎn)中間指令JMP,跳轉(zhuǎn)到addr處 〃同時結束當前中間指令基本塊的構造,提交給后端執(zhí)行
sbb->add(JMP(TEMPREG1, 0));由以上源代碼可知,BE指令可以完全通過Crossbit的一系列中間指令來表示, 不需要跳回翻譯器本身,由翻譯器來模擬語義,由此能大幅提升性能。另外對于延 遲槽指令也是一條帶延遲槽的跳轉(zhuǎn)指令時,以SPARC平臺為例,如果源程序中有以 下三條連續(xù)的指令
BE 0x10078
BE 0xldc0c
ADD ol, 4, ol
第一條BE的延遲槽中有另一條BE, ADD為第二條BE的延遲槽指令。用以上方 法進行二進制翻譯后的中間代碼序列為
ADD 〃對應ADD ol, 4, ol
BRANCH EQ, 0xldc0c〃對應BE OxldcOc
BRANCH EQ, 0x10078〃對應BE 0x10078
并且由于BRANCH中間指令并不結束當前基本塊的構造,當?shù)谝粭lBRANCH在后 端執(zhí)行完后,還是會執(zhí)行到它下一條BRANCH中間指令,所以對于延遲槽中是一條延 遲跳轉(zhuǎn)指令的情況,本發(fā)明方法也能正確處理。
1權利要求
1、一種中間語言的延遲跳轉(zhuǎn)指令二進制翻譯實現(xiàn)的方法,其特征在于,利用獨立于源機器語言和目標機器語言的中間語言來正確地表達源平臺延遲跳轉(zhuǎn)指令的語義,然后提交給后端翻譯為目標機器語言執(zhí)行,當二進制翻譯器遇到延遲跳轉(zhuǎn)指令時,翻譯中間指令的步驟如下步驟一,保存跳轉(zhuǎn)的目的地址為addr,值為用當前PC值加上指令中對應位表示的跳轉(zhuǎn)偏移值;步驟二,當annul bit為0時,先翻譯延遲槽中的指令為對應的中間指令,再翻譯當前的這條Branch指令;步驟三,當annul bit為1,即不跳轉(zhuǎn)則忽略延遲槽中的指令時,先以相反的條件翻譯Branch指令,目的地址為延遲槽后的第一條指令;然后翻譯延遲槽中的指令為中間指令;最后再在中間指令基本塊中添加一條直接跳轉(zhuǎn)指令,目的地址為先前保存的addr;步驟四,將中間指令基本塊提交給二進制翻譯器后端翻譯為后端指令執(zhí)行。
2、 根據(jù)權利要求1所述的中間語言的延遲跳轉(zhuǎn)指令二進制翻譯實現(xiàn)的方法,其特征是,所述的二進制翻譯器的中間語言包含配套的虛擬寄存器存儲中間值。
3、 根據(jù)權利要求1所述的中間語言的延遲跳轉(zhuǎn)指令二進制翻譯實現(xiàn)的方法,其特征是,所述的翻譯延遲槽中的指令為中間指令,是指運用亂序翻譯和反向跳轉(zhuǎn)的方法。
4、 根據(jù)權利要求3所述的中間語言的延遲跳轉(zhuǎn)指令二進制翻譯實現(xiàn)的方法,其特征是,所述的亂序翻譯,是指,并非按照源機器平臺的指令執(zhí)行順序翻譯,在要執(zhí)行延遲槽指令的時候,索性先翻譯延遲槽中的指令,再翻譯對應的BRANCH指令。
5、 根據(jù)權利要求3所述的中間語言的延遲跳轉(zhuǎn)指令二進制翻譯實現(xiàn)的方法,其特征是,所述的反向跳轉(zhuǎn),是當碰到annul bit為1的時候,先向中間指令基本塊中添加一條跳轉(zhuǎn)的條件與源指令跳轉(zhuǎn)條件相反的BRANCH中間指令這樣到了后端執(zhí)行的時候,如果源指令是不跳轉(zhuǎn)的,那后端翻譯執(zhí)行到這條BRANCH中間指令時就會發(fā)生跳轉(zhuǎn),然后從延遲槽后一條指令處開始翻譯執(zhí)行,滿足了當annul bit為1且不跳轉(zhuǎn)時忽略延遲槽指令的條件;如果源指令是跳轉(zhuǎn)的,那就會順序執(zhí)行己經(jīng)翻譯為中間指令的延遲槽指令,然后再進行跳轉(zhuǎn)。
全文摘要
本發(fā)明涉及的是一種電信技術領域的中間語言的延遲跳轉(zhuǎn)指令二進制翻譯實現(xiàn)的方法。當二進制翻譯器遇到延遲跳轉(zhuǎn)指令時,保存跳轉(zhuǎn)的目的地址為addr,值為用當前PC值加上指令中對應位表示的跳轉(zhuǎn)偏移值;當annul bit為0時,先翻譯延遲槽中的指令為對應的中間指令,再翻譯當前的這條Branch指令;當annul bit為1,即不跳轉(zhuǎn)則忽略延遲槽中的指令時,先以相反的條件翻譯Branch指令,目的地址為延遲槽后的第一條指令;然后翻譯延遲槽中的指令為中間指令;最后再在中間指令基本塊中添加一條直接跳轉(zhuǎn)指令,目的地址為先前保存的addr;將中間指令基本塊提交給二進制翻譯器后端翻譯為后端指令執(zhí)行。本發(fā)明執(zhí)行準確,效率高,在二進制翻譯領域具有通用性。
文檔編號G06F9/45GK101604255SQ200910055218
公開日2009年12月16日 申請日期2009年7月23日 優(yōu)先權日2009年7月23日
發(fā)明者孫廷韜, 左保京, 梁阿磊, 章一超, 管海兵 申請人:上海交通大學