專利名稱:動態(tài)二進(jìn)制翻譯中代碼Cache管理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域中的動態(tài)二進(jìn)制翻譯技術(shù),特別涉及一種動態(tài)二進(jìn)制翻譯中代碼Cache管理方法。
背景技術(shù):
動態(tài)二進(jìn)制翻譯技術(shù)是解決遺留代碼和提高軟件平臺適應(yīng)性的一種有效手段。它在不需要可執(zhí)行程序源代碼的情況下,動態(tài)地將源體系結(jié)構(gòu)上的二進(jìn)制程序經(jīng)過轉(zhuǎn)換,運(yùn)行于其他目標(biāo)體系結(jié)構(gòu)上。動態(tài)二進(jìn)制翻譯基本上是這樣工作的:以基本塊為單位翻譯源體系結(jié)構(gòu)二進(jìn)制代碼,通過翻譯生成相應(yīng)的目標(biāo)體系結(jié)構(gòu)支持的代碼塊,并緩存在代碼Cache中,這樣當(dāng)程序再次運(yùn)行到這個基本塊時,就直接從代碼Cache中得到相應(yīng)的目標(biāo)體系結(jié)構(gòu)代碼并執(zhí)行,從而提高程序執(zhí)行速度。利用代碼Cache加速翻譯效率的同時,需要對翻譯出來的代碼塊進(jìn)行有效的管理,需要既節(jié)省本地內(nèi)存空間,又不至于引起代碼Cache由于空間不足導(dǎo)致頻繁的替換操作以致性能下降。常見的代碼Cache管理策略包括: (I)全清空策略 在全清空策略下,當(dāng)代碼Cache空間不足時,代碼Cache中所有的代碼塊都被清除,該策略最大的優(yōu)點(diǎn)就是算法簡單,實(shí)現(xiàn)起來容易,管理起來也較為方便,所以被很多二進(jìn)制翻譯系統(tǒng)所采用,但是該策略沒有考慮到程序執(zhí)行特性,對時間空間的局部性考慮不夠,可能會導(dǎo)致很多較熱的代碼塊被替換出去,許多塊被重新導(dǎo)入導(dǎo)出,增加了不必要的開銷。
(2) 不替換原則 一次性開辟足夠大的空間使得所有代碼塊都由始至終保存在代碼Cache中,每個代碼塊翻譯只有在第一次會發(fā)生未命中,代碼塊在被翻譯后,被翻譯的代碼塊會被保存至代碼Cache供下次調(diào)用,該策略通過犧牲大量空間的方式來換取高速的優(yōu)勢,對于資源受限的系統(tǒng)來說,該策略不可取。
(3) LRU (Least-Recently-Used)策略 LRU策略在發(fā)生代碼Cache滿的情況下,選擇將使用次數(shù)最少的代碼塊替換出去。當(dāng)被替換的代碼塊大小小于新翻譯的代碼塊時,需要將被替換代碼塊后序的代碼塊進(jìn)行替換,以獲得足夠大的連續(xù)空間。該策略的優(yōu)點(diǎn)在于考慮了程序的執(zhí)行特性和程序的時間局限性。缺點(diǎn)在于:1)需要額外的有序鏈表來管理代碼塊,實(shí)現(xiàn)起來復(fù)雜,且增加了運(yùn)行時開銷;2)為產(chǎn)生足夠大的空間來存儲新產(chǎn)生的代碼塊,使得不符合LRU原則的代碼塊被替換;3)會產(chǎn)生Cache內(nèi)存碎片。
(4) LFU (Least-Frequently-Used)策略 LFU策略與LRU策略實(shí)現(xiàn)類似,也存在LRU的優(yōu)點(diǎn)和缺點(diǎn),只是LFU替換原則在于每次選擇使用最不頻繁的代碼塊進(jìn)行替換。
(5) FIFO (First-1n-First-Out)策略 利用環(huán)形緩存實(shí)現(xiàn)Cache管理,將指針指向最早進(jìn)入Cache的代碼塊,當(dāng)代碼Cache空間不足時,將指針指向的代碼塊換出,并將指針后移。該策略實(shí)施簡單,同時也考慮了程序的局部性特性,因?yàn)樽钤邕M(jìn)入的代碼塊可能后面不會再被執(zhí)行到,且不會產(chǎn)生碎片問題,因此使用廣泛。但由于FIFO策略對程序執(zhí)行特性理解不夠透徹,還是存在將熱代碼被換出的情況。
除了上述5種代碼Cache管理策略外還存在一些,如最大塊優(yōu)先替換、最適合大小塊優(yōu)先替換等策略。由于它們只考慮空間的利用效率而沒有或很少考慮程序的時間空間局部性和程序的執(zhí)行特性,因而它們一般不被動態(tài)二進(jìn)制翻譯和優(yōu)化系統(tǒng)采用。
代碼Cache管理策略在動態(tài)二進(jìn)制翻譯中對提高翻譯效率具有重要作用,它需要綜合考慮管理開銷、代碼局部性、代碼碎片等問題,然而現(xiàn)有的代碼Cache管理策略依然存在著各種不足,因此,亟需提出一種更有效的代碼Cache管理策略。發(fā)明內(nèi)容
本發(fā)明針對現(xiàn)有的代碼Cache管理策略中存在的代碼塊重復(fù)換出頻繁,重復(fù)翻譯率高、翻譯效率較低等缺點(diǎn),提供了一種可以避免重復(fù)執(zhí)行代碼塊的換出,減少重復(fù)翻譯的新型動態(tài)二進(jìn)制翻譯中代碼Cache管理方法。
為實(shí)現(xiàn)上述目的,本發(fā)明可采取下述技術(shù)方案: 動態(tài)二進(jìn)制翻譯中代碼Cache管理方法,所述代碼Cache包括非跳轉(zhuǎn)目標(biāo)Cache和跳轉(zhuǎn)目標(biāo)Cache,所述代碼Cache采用FIFO策略,包括以下具體步驟: 1)確定帶翻譯基本塊的類型,所述類型包括跳轉(zhuǎn)目標(biāo)基本塊、非跳轉(zhuǎn)目標(biāo)基本塊,所述跳轉(zhuǎn)目標(biāo)基本塊存儲在跳轉(zhuǎn)目標(biāo)Cache中,所述非跳轉(zhuǎn)目標(biāo)基本塊存儲在非跳轉(zhuǎn)目標(biāo)Cache中,其中,所述跳轉(zhuǎn)目標(biāo)基本塊為由跳轉(zhuǎn)指令跳轉(zhuǎn)執(zhí)行的基本塊,所述非跳轉(zhuǎn)目標(biāo)基本塊為由非跳轉(zhuǎn)指令順序執(zhí)行的基本塊; 2)所述基本塊為非跳轉(zhuǎn)目標(biāo)基本塊時,執(zhí)行非跳轉(zhuǎn)目標(biāo)基本塊處理流程: 2-1)根據(jù)所述基本塊的地址在所述非跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟2-4 ; 2-2)根據(jù)所述基本塊的地址在所述跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟2-4 ; 2-3)翻譯所述基本塊,并將翻譯后所得代碼塊緩存至所述非跳轉(zhuǎn)目標(biāo)Cache ; 2-4)執(zhí)行所述基本塊; 3)所述基本塊為跳轉(zhuǎn)目標(biāo)基本塊時,執(zhí)行跳轉(zhuǎn)目標(biāo)基本塊處理流程: 3-1)根據(jù)所述基本塊的地址在所述跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟3-5 ; 3-2)根據(jù)所述基本塊的地址在所述非跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟3-4 ; 3-3)翻譯所述基本塊,并將翻譯后所得代碼塊緩存至所述跳轉(zhuǎn)目標(biāo)Cache,跳轉(zhuǎn)執(zhí)行步驟 3-5 ; 3-4)將所述基本塊從所述非跳轉(zhuǎn)目標(biāo)Cache中轉(zhuǎn)移至所述跳轉(zhuǎn)目標(biāo)Cache ; 3-5)執(zhí)行所述基本塊; 4)循環(huán)執(zhí)行所述步驟I至3直至所有基本塊執(zhí)行完畢。
作為優(yōu)選,所述步驟I還包括:1-1)初始化第一個基本塊為非跳轉(zhuǎn)目標(biāo)基本塊; 1-2)翻譯所述基本塊直至所述基本塊的結(jié)束指令,根據(jù)所述結(jié)束指令的類型標(biāo)志標(biāo)記下一個基本塊的類型; 1-3)執(zhí)行所述步驟1-2翻譯后所得代碼塊。
作為優(yōu)選,用全局變量標(biāo)識flag對所述基本塊的類型進(jìn)行標(biāo)識。
作為優(yōu)選,使用哈希表查找所述代碼Cache中的基本塊,用PC+f lag計(jì)算所述非跳轉(zhuǎn)目標(biāo)基本塊的哈希值,用PC+ flag Γ表示取反操作)計(jì)算所述跳轉(zhuǎn)目標(biāo)基本塊的值,其中,PC表示所述基本塊的地址。
本發(fā)明由于采用了以上技術(shù)方案,具有顯著的技術(shù)效果: 本發(fā)明包括有區(qū)分的、用FIFO策略進(jìn)行管理的代碼Cache,通過設(shè)置全局變量表示flag標(biāo)識基本塊類型,同時采用統(tǒng)一的哈希表對所有的代碼Cache進(jìn)行管理,在考慮了程序的局部性的同時,將管理代碼Cache的系統(tǒng)額外開銷降到最低,以較低的管理開銷避免了將非頻繁執(zhí)行的代碼塊 進(jìn)入代碼Cache導(dǎo)致的系統(tǒng)頻繁地對基本塊進(jìn)行的重復(fù)翻譯,從而提高了動態(tài)二進(jìn)制翻譯的性能。
圖1為實(shí)施例1所述QEMU動態(tài)二進(jìn)制翻譯流程示意圖。
圖2為本發(fā)明所述動態(tài)二進(jìn)制翻譯中代碼Cache管理方法的流程示意圖。
圖3為本發(fā)明所述非跳轉(zhuǎn)目標(biāo)基本塊處理流程示意圖。
圖4為本發(fā)明所述跳轉(zhuǎn)目標(biāo)基本塊處理流程示意圖。
具體實(shí)施方式
下面結(jié)合實(shí)施例對本發(fā)明作進(jìn)一步的詳細(xì)描述。
實(shí)施例1 本實(shí)施例采用的動態(tài)二進(jìn)制翻譯系統(tǒng)為開源的QEMU系統(tǒng),但本方法也可以推廣到其他二進(jìn)制翻譯系統(tǒng)中。QEMU系統(tǒng)將源目標(biāo)體系結(jié)構(gòu)(如ARM,X86,MIPS)的可執(zhí)行文件翻譯到中間代碼,然后再翻譯到目標(biāo)體系結(jié)構(gòu)ISA (Instruction Set Architecture)(如X86,PowerPC, ARM, Spare,Alpha, MIPS)上執(zhí)行。翻譯單位為基本塊,基本塊是一段以跳轉(zhuǎn)指令或改變處理器狀態(tài)指令結(jié)束的指令序列。QEMU采用TCG作為中間代碼,每條源體系結(jié)構(gòu)指令會在如端被翻譯為一條或者多條TCG指令,后端會將這些TCG指令翻譯為目標(biāo)體系結(jié)構(gòu)代碼。TCG具有簡單、清晰的語法結(jié)構(gòu)。
QEMU的動態(tài)二進(jìn)制翻譯流程如圖1所示。QEMU首先加載源體系結(jié)構(gòu)二進(jìn)制文件,并找到程序的入口地址,開始翻譯。每次翻譯前,QEMU會首先根據(jù)當(dāng)前程序計(jì)數(shù)器中保存的地址查找代碼Cache,若找到,則表示該基本塊已經(jīng)翻譯過,則取出相應(yīng)代碼塊執(zhí)行,沒找至IJ,則執(zhí)行翻譯過程。翻譯前端針對當(dāng)前指令,首先譯碼判斷指令功能,然后將其翻譯為對應(yīng)的TCG指令,緩存在TCG Cache中,然后繼續(xù)翻譯下一條指令,直至遇到基本塊結(jié)束指令,則結(jié)束當(dāng)前基本塊翻譯。后端將當(dāng)前基本塊對應(yīng)的TCG指令翻譯為目標(biāo)體系結(jié)構(gòu)代碼,并緩存在代碼Cache中,同時執(zhí)行目標(biāo)代碼。QEMU代碼Cache管理采用全清空策略,Cache查找采用哈希表的方式。
本發(fā)明的主要改進(jìn)之處如下所述: 1、將代碼Cache劃分為非跳轉(zhuǎn)目標(biāo)Cache和跳轉(zhuǎn)目標(biāo)Cache,以分別緩存非跳轉(zhuǎn)目標(biāo)基本塊和跳轉(zhuǎn)目標(biāo)基本塊。兩個Cache各自所占的比例可調(diào),視具體應(yīng)用而定。
2、代碼Cache的管理采用FIFO策略,分別用指針指向最先進(jìn)入代碼Cache的代碼塊。當(dāng)Cache滿時,直接將指針移至下一個代碼塊,表示將最先進(jìn)入Cache的代碼塊換出。
3、設(shè)置全局變量標(biāo)識flag當(dāng)前基本塊類型,并在上一個基本塊翻譯結(jié)束時對該變量賦值。賦值在代碼塊執(zhí)行過程中完成。Flag有兩種取指,分別為JUMP_TARGET和Ν0Ν_JUMP_TARGET。JUMP_TARGET對應(yīng)跳轉(zhuǎn)目標(biāo)基本塊,NON_JUMP_TARGET對應(yīng)非跳轉(zhuǎn)目標(biāo)基本塊。Flag初始化為NON_JUMP_TARGET,表示第一個基本塊為非跳轉(zhuǎn)目標(biāo)類型。下面的表I列舉了指令類型與flag值的對應(yīng)關(guān)系,翻譯最后一條指令時,根據(jù)指令類型,將賦值指令也翻譯為目標(biāo)體系代碼作為代碼塊的一部分。
表1基本塊結(jié)束指令類型與flag取值的對應(yīng)關(guān)系
權(quán)利要求
1.一種動態(tài)二進(jìn)制翻譯中代碼Cache管理方法,其特征在于,所述代碼Cache包括非跳轉(zhuǎn)目標(biāo)Cache和跳轉(zhuǎn)目標(biāo)Cache,所述代碼Cache采用FIFO策略,包括以下具體步驟: I)確定帶翻譯基本塊的類型,所述類型包括跳轉(zhuǎn)目標(biāo)基本塊、非跳轉(zhuǎn)目標(biāo)基本塊,所述跳轉(zhuǎn)目標(biāo)基本塊存儲在跳轉(zhuǎn)目標(biāo)Cache中,所述非跳轉(zhuǎn)目標(biāo)基本塊存儲在非跳轉(zhuǎn)目標(biāo)Cache中,其中,所述跳轉(zhuǎn)目標(biāo)基本塊為由跳轉(zhuǎn)指令跳轉(zhuǎn)執(zhí)行的基本塊,所述非跳轉(zhuǎn)目標(biāo)基本塊為由非跳轉(zhuǎn)指令順序執(zhí)行的基本塊; 2 )所述基本塊為非跳轉(zhuǎn)目標(biāo)基本塊時,執(zhí)行非跳轉(zhuǎn)目標(biāo)基本塊處理流程: 2-1)根據(jù)所述基本塊的地址在所述非跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟2-4 ; 2-2)根據(jù)所述基本塊的地址在所述跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟2-4 ; 2-3)翻譯所述基本塊,并將翻譯后所得代碼塊緩存至所述非跳轉(zhuǎn)目標(biāo)Cache ; 2-4)執(zhí)行所述基本塊; 3)所述基本塊為跳轉(zhuǎn)目標(biāo)基本塊時,執(zhí)行跳轉(zhuǎn)目標(biāo)基本塊處理流程: 3-1)根據(jù)所述基本塊的地址在所述跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟3-5 ; 3-2)根據(jù)所述基本塊的地址在所述非跳轉(zhuǎn)目標(biāo)Cache中查找所述基本塊,如果找到所述基本塊則跳轉(zhuǎn)執(zhí)行步驟3-4 ; 3-3)翻譯所述基本塊,并將翻譯后所得代碼塊緩存至所述跳轉(zhuǎn)目標(biāo)Cache,跳轉(zhuǎn)執(zhí)行步驟 3-5 ; 3-4)將所述基本塊從所述非跳轉(zhuǎn)目標(biāo)Cache中轉(zhuǎn)移至所述跳轉(zhuǎn)目標(biāo)Cache ; 3-5)執(zhí)行所述基本塊; 4)循環(huán)執(zhí)行所述步驟I至3直至所有基本塊執(zhí)行完畢。
2.根據(jù)權(quán)利要求1所述的動態(tài)二進(jìn)制翻譯中代碼Cache管理方法,其特征在于,所述步驟I還包括: 1-1)初始化第一個基本塊為非跳轉(zhuǎn)目標(biāo)基本塊; 1-2)翻譯所述基本塊直至所述基本塊的結(jié)束指令,根據(jù)所述結(jié)束指令的類型標(biāo)志標(biāo)記下一個基本塊的類型; 1-3)執(zhí)行所述步驟1-2翻譯后所得代碼塊。
3.根據(jù)權(quán)利要求1所述的動態(tài)二進(jìn)制翻譯中代碼Cache管理方法,其特征在于,用全局變量標(biāo)識flag對所述基本塊的類型進(jìn)行標(biāo)識。
4.根據(jù)權(quán)利 要求2所述的動態(tài)二進(jìn)制翻譯中代碼Cache管理方法,其特征在于,使用哈希表查找所述代碼Cache中的基本塊,用PC+f lag計(jì)算所述非跳轉(zhuǎn)目標(biāo)基本塊的哈希值,用PC+^flag計(jì)算所述跳轉(zhuǎn)目標(biāo)基本塊的值,其中,PC表示所述基本塊的地址。
全文摘要
本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域中的動態(tài)二進(jìn)制翻譯技術(shù),公開了一種動態(tài)二進(jìn)制翻譯中代碼Cache管理方法,所述代碼Cache包括非跳轉(zhuǎn)目標(biāo)Cache和跳轉(zhuǎn)目標(biāo)Cache,所述代碼Cache采用FIFO策略,包括以下具體步驟確定帶翻譯基本塊的類型,所述基本塊為非跳轉(zhuǎn)目標(biāo)基本塊時,執(zhí)行非跳轉(zhuǎn)目標(biāo)基本塊處理流程,所述基本塊為跳轉(zhuǎn)目標(biāo)基本塊時,執(zhí)行跳轉(zhuǎn)目標(biāo)基本塊處理流程。本發(fā)明的優(yōu)點(diǎn)在于,可以高效地緩存已經(jīng)翻譯過的代碼,減少重復(fù)翻譯。
文檔編號G06F12/08GK103150196SQ20131004864
公開日2013年6月12日 申請日期2013年2月7日 優(yōu)先權(quán)日2013年2月7日
發(fā)明者李瑩, 羅艷, 尹建偉, 吳健, 鄧水光, 吳朝暉 申請人:浙江大學(xué)