两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

函數(shù)調(diào)用和返回的處理方法、二進(jìn)制翻譯方法和系統(tǒng)的制作方法

文檔序號(hào):6608506閱讀:236來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):函數(shù)調(diào)用和返回的處理方法、二進(jìn)制翻譯方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及二進(jìn)制翻譯,特別是涉及函數(shù)調(diào)用和返回的處理方法、二進(jìn) 制翻譯方法和系統(tǒng)。
背景技術(shù)
二進(jìn)制翻譯是將一種(源)機(jī)器上的可執(zhí)行程序翻譯成另一種(目標(biāo)) 機(jī)器上的可執(zhí)行程序的過(guò)程,二進(jìn)制翻譯系統(tǒng)使得已有的大量應(yīng)用程序可以 直接為新的平臺(tái)所利用。如圖l所示,源機(jī)器ll的可執(zhí)行程序lll (以下簡(jiǎn)稱(chēng)
為源程序)通過(guò)目標(biāo)機(jī)器12上的二進(jìn)制翻譯系統(tǒng)121,被轉(zhuǎn)換成目標(biāo)機(jī)器的可 執(zhí)行程序122 (以下簡(jiǎn)稱(chēng)為目標(biāo)程序)。
函數(shù)調(diào)用和返回在程序中十分多見(jiàn),雖然不同的高級(jí)語(yǔ)言調(diào)用函數(shù)的形 式不同,但本質(zhì)是類(lèi)似的,都遵循后進(jìn)先出(LIFO)的原則,即最后被調(diào)用 的函凄t最先返回。因此可以^吏用棧來(lái)實(shí)現(xiàn),例如, 函數(shù)調(diào)用的一般形式為
callP ;調(diào)用以P為起始地址的子函數(shù)
R:....... ; call后面的指令是從地址R開(kāi)始的
二進(jìn)制翻譯系統(tǒng)將函數(shù)調(diào)用翻譯為
pushR ;將返回地址R保存(push)到棧中
jmpP, ;通過(guò)二進(jìn)制翻譯后,子函數(shù)的起始地址為P,
函數(shù)返回的一般形式為
ret
二進(jìn)制翻譯系統(tǒng)將函數(shù)返回翻譯為save scratch registers %eax,%ebx,%flags ;保存以下程序用到的寄存器值 pop%eax ;從棧中彈出(pop)—個(gè)元素,即源程序的返回地址R
%eax:=ILtoOLAddress(%eax) ;將源程序的返回地址R映射到目標(biāo)程
;序的返回地址R, store (Return Target), %eax ;保存目標(biāo)程序的返回地址R, restore scratch registers %eax, %ebx, %flags ;'恢復(fù)已j呆存的寄存器虧直
jmp (Return—Target) ;跳到目標(biāo)程序的返回地址R,去執(zhí)行
上述二進(jìn)制翻譯系統(tǒng)在翻譯返回指令時(shí)比較慢,因?yàn)椴粌H要將一條返回 指令翻譯成幾條目標(biāo)指令,而且還要完成一些將源程序的地址映射到目標(biāo)程
序的地址的工作。這樣,源程序返回只需要一個(gè)時(shí)鐘周期,而目標(biāo)程序返回 則需要很多時(shí)鐘周期。子函數(shù)調(diào)用和返回在程序中十分多見(jiàn),因此通過(guò)二進(jìn) 制翻譯之后目標(biāo)程序會(huì)明顯變慢。
專(zhuān)利號(hào)為US6711672的美國(guó)專(zhuān)利公開(kāi)了 一種二進(jìn)制翻譯系統(tǒng)的函數(shù)調(diào)用 和返回的處理方法,在該專(zhuān)利中,源程序的指令稱(chēng)為輸入語(yǔ)言(IL)指令, 目標(biāo)程序的指令稱(chēng)為輸出語(yǔ)言(OL)指令,對(duì)于每個(gè)IL子函數(shù)調(diào)用,正確的 IL返回地址R被存放到棧中,相應(yīng)的OL返回地址R,存放到返回目標(biāo)緩存(RTC, return target cache)中,根據(jù)R來(lái)計(jì)算RTC的索引;執(zhí)行到OL函數(shù)返回時(shí),從 棧頂彈出一個(gè)值,根據(jù)這個(gè)值來(lái)計(jì)算索引,根據(jù)這個(gè)索引從RTC中獲得一個(gè)目 標(biāo)地址,如果目標(biāo)地址正確,則從該地址開(kāi)始執(zhí)行,否則轉(zhuǎn)到備份返回地址 恢復(fù)模塊來(lái)重新構(gòu)建OL返回地址。RTC其實(shí)就是一個(gè)哈希表,根據(jù)R來(lái)計(jì)算 RTC的索引就是一個(gè)哈希函數(shù),能夠?qū)L返回地址映射到RTC中。
因此,函數(shù)調(diào)用
callP ;調(diào)用以P為起始地址的子函數(shù)
R:....... ; call后面的指令是從地址R開(kāi)始的被二進(jìn)制翻譯系統(tǒng)翻譯為
push R
store (RTC), R, jmpP, R': cmp %eax, R jne Miss/Failure
將IL返回地址R保存到棧中 將OL返回地址R,保存到RTC中 跳到子函數(shù)的起始地址P,去執(zhí)行 判斷是否返回到正確的地址(命中) 如果不是正確的地址,則跳到備份返回地址恢復(fù)模塊
restore scatch registers %eax, %ebx, %flags
函數(shù)返回ret被二進(jìn)制翻譯系統(tǒng)翻譯為
save scratch register %eax, %ebx, %flags
pop%eax ;從棧中彈出一個(gè)元素,即源程序的返回地址R
mov%ebx,%eax;將返回地址R復(fù)制到。/。ebx
and %ebx, 63 ;根據(jù)R計(jì)算RTC的索引,%ebx = R & 63 (哈希函數(shù))
jmp (RTC_Base + %ebx);根據(jù)索引從RTC中獲得目標(biāo)程序的返回地
;址,跳到該地址去執(zhí)行 在上述程序中使用"邏輯與"作為哈希函數(shù),當(dāng)從棧中彈出的值等于正 確的IL返回地址時(shí)稱(chēng)為命中,不相等則稱(chēng)為不命中。哈希表是一種高效快速 的數(shù)據(jù)結(jié)構(gòu),上述方法雖然改善了傳統(tǒng)映射方法慢的問(wèn)題,但是,使用哈希 表不可避免地會(huì)存在哈希沖突的麻煩,在這種情況下只能跳到備份返回地址 恢復(fù)模塊去處理,如果哈希沖突多的話(huà),命中率降低,二進(jìn)制翻譯的性能降 低,程序的運(yùn)行效率也就隨之降低。

發(fā)明內(nèi)容
本發(fā)明解決的問(wèn)題是,提供一種函數(shù)調(diào)用和返回的處理方法、二進(jìn)制翻 譯方法和系統(tǒng),以消除因哈希沖突造成的性能損失,進(jìn)而提高程序的運(yùn)行效率。
為解決上述問(wèn)題,本發(fā)明提供一種函數(shù)調(diào)用和返回的處理方法,包括 將源程序的函數(shù)調(diào)用的返回地址作為假指令保存在目標(biāo)程序的函數(shù)調(diào)用 指令之后;
在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,將所述假指令的地址保存到棧中; 在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,將棧頂保存的地址取出,在所述從棧頂取
出的地址的值等于所述源程序的函數(shù)調(diào)用的返回地址時(shí),跳轉(zhuǎn)到所述假指令后。
為解決上述問(wèn)題,本發(fā)明還提供一種二進(jìn)制翻譯方法,包括 將源程序的函數(shù)調(diào)用指令翻譯成對(duì)應(yīng)的目標(biāo)程序的函數(shù)調(diào)用指令; 將源程序的函數(shù)調(diào)用的返回地址作為假指令插入在所述目標(biāo)程序的函數(shù) 調(diào)用指令之后,并在所述假指令后,插入跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心的指
令;
在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,插入將所述假指令的地址保存到棧中的指
令;
在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,插入將棧頂保存的地址取出的指令、判斷 所述從棧頂取出的地址的值是否等于所述源程序的函數(shù)調(diào)用的返回地址的指 令、和跳轉(zhuǎn)到所述假指令后的指令。
為解決上述問(wèn)題,本發(fā)明還提供一種二進(jìn)制翻譯系統(tǒng),包括
函數(shù)調(diào)用指令翻譯模塊,用于將源程序的函數(shù)調(diào)用指令翻譯成對(duì)應(yīng)的目 標(biāo)程序的函數(shù)調(diào)用指令;
函數(shù)調(diào)用指令插入沖莫塊,用于將源程序的函數(shù)調(diào)用的返回地址作為布i指 令插入在所述目標(biāo)程序的函數(shù)調(diào)用指令之后,在所述假指令后插入跳轉(zhuǎn)到直 接跳轉(zhuǎn)指令控制中心的指令;
函數(shù)調(diào)用開(kāi)始翻譯才莫塊,用于在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,插入將所述假指令的地址保存到棧中的指令;
函數(shù)調(diào)用結(jié)束翻譯^f莫塊,用于在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,插入將棧頂 保存的地址取出的指令、判斷所述從棧頂取出的地址的值是否等于所述源程 序的函數(shù)調(diào)用的返回地址的指令、和跳轉(zhuǎn)到所述假指令后的指令。
與現(xiàn)有技術(shù)相比,上述技術(shù)方案不需要將源程序的返回地址映射到目標(biāo)
程序的返回地址、或者使用哈希表保存目標(biāo)程序的返回地址;而是在函數(shù)調(diào) 用指令后插入假指令以保存返回地址,在函數(shù)調(diào)用開(kāi)始是將假指令的地址保 存到棧中,在函數(shù)返回時(shí)通過(guò)從棧頂取出的地址得到返回地址。因此,上述 技術(shù)方案避免使用返回目標(biāo)緩存或棧的方式保存返回地址,也就是說(shuō),不需 要引入新的數(shù)據(jù)結(jié)構(gòu)來(lái)保存返回地址,其算法更為簡(jiǎn)單,因而更容易實(shí)施,
行效率。
另外,上述技術(shù)方案在函數(shù)調(diào)用的正確返回時(shí)不需要作上下文切換(即 間接跳轉(zhuǎn)指令控制中心與目標(biāo)程序的切換),函數(shù)調(diào)用完成后,可以快速返回, 因此也節(jié)省了返回型間接分支的開(kāi)銷(xiāo)(處理時(shí)間),提高了二進(jìn)制翻譯效率。


圖1是包括二進(jìn)制翻譯系統(tǒng)的目標(biāo)機(jī)器與源機(jī)器的連接示意圖; 圖2是本發(fā)明實(shí)施例的函數(shù)調(diào)用和返回的二進(jìn)制翻譯和執(zhí)行流程圖。
具體實(shí)施例方式
本發(fā)明實(shí)施例是在函數(shù)調(diào)用開(kāi)始將假指令的地址保存到棧中,在函數(shù)返 回時(shí)通過(guò)從棧頂取出的地址得到返回地址(即假指令的地址的值)。下面即結(jié) 合附圖和實(shí)施例對(duì)本發(fā)明的具體實(shí)施方式
做詳細(xì)的說(shuō)明。
本發(fā)明實(shí)施例的二進(jìn)制翻譯方法,用于將源程序的函數(shù)調(diào)用和返回程序 翻譯成目標(biāo)程序的函數(shù)調(diào)用和返回程序,所述二進(jìn)制翻譯方法包括
9將源程序的函數(shù)調(diào)用指令翻譯成對(duì)應(yīng)的目標(biāo)程序的函數(shù)調(diào)用指令; 將源程序的函數(shù)調(diào)用的返回地址作為假指令插入在所述目標(biāo)程序的函數(shù) 調(diào)用指令之后,并在所述假指令后,插入跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心
(Direct—dipatcher)的指令;
在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,插入將所述假指令的地址保存到棧中的指
令;
在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,插入將棧頂保存的地址取出的指令、判斷 所述從棧頂取出的地址的值是否等于所述源程序的函數(shù)調(diào)用的返回地址的指 令、和跳轉(zhuǎn)到所述假指令后的指令。
所述插入判斷所述從棧頂取出的地址的值是否等于所述源程序的函數(shù)調(diào)
用的返回地址的指令包括插入將所述從棧頂取出的地址的值載入的指令, 插入將所述從棧頂取出的地址的值與所述源程序的函數(shù)調(diào)用的返回地址進(jìn)行 比較的指令,和插入若所述從棧頂取出的地址的值與所述源程序的函數(shù)調(diào)用 的返回地址不相等時(shí)跳轉(zhuǎn)到間接跳轉(zhuǎn)指令控制中心(Indirect—dispatcher)的指令。
下面結(jié)合圖2具體說(shuō)明所述二進(jìn)制翻譯方法。
將源程序的函數(shù)調(diào)用指令call P翻譯成對(duì)應(yīng)的目標(biāo)程序的函數(shù)調(diào)用指令 jmpP,,其中,P為源程序中被調(diào)用的子函數(shù)的起始地址,P,為目標(biāo)程序中被 調(diào)用的子函數(shù)的起始地址,源程序中call后面的指令C是從地址R開(kāi)始的。
在上述目標(biāo)程序的函數(shù)調(diào)用指令jmp P,后,插入假指令R和跳轉(zhuǎn)到直接 跳轉(zhuǎn)指令控制中心的指令
ra:R ; ra是假指令R的地址
ra+4: jmp Direct—dipatcher ;跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心
假指令R實(shí)際上是不執(zhí)行的指令,其只是將源程序的函數(shù)調(diào)用的返回地址R
作為指令代碼保存在地址為ra的內(nèi)存中,也可以說(shuō),地址ra的值為R。上述假指令R和跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心的指令是插在指令C,前,源程序中
的指令C被翻譯成目標(biāo)程序的指令C,, R,是指令C,的地址,即目標(biāo)程序的函 數(shù)調(diào)用的返回地址。第一次執(zhí)行到j(luò)mp Direct—dipatcher指令時(shí)指令C還沒(méi)有 被翻譯成指令C,,因此會(huì)跳到直接跳轉(zhuǎn)指令控制中心,在指令C被翻譯成指 令C,后,就獲得了對(duì)應(yīng)于地址R (源程序的函數(shù)調(diào)用的返回地址)的地址R, (目標(biāo)程序的函數(shù)調(diào)用的返回地址),直接跳轉(zhuǎn)指令控制中心根據(jù)翻譯后的地 址R,,將跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心的指令jmp Direct—dipatcher修改為跳 轉(zhuǎn)到目標(biāo)程序的函數(shù)調(diào)用的返回地址的指令jmp R,,這樣在以后執(zhí)行到地址 為(ra+4)的指令時(shí)就能直接跳到地址R,,不需要在跳到直接跳轉(zhuǎn)指令控制 中心了。
在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始(地址為P,),插入將所述假指令的地址保存 到棧中的指令pushra。
在目標(biāo)程序的函數(shù)調(diào)用結(jié)束(地址為B,),插入將棧頂保存的地址取出的 指令,判斷所述從棧頂取出的地址的值是否等于所述源程序的函數(shù)調(diào)用的返 回地址的指令,和跳轉(zhuǎn)到所述假指令后的指令
取出棧頂保存的地址 載入從棧頂取出的地址的值 比較從棧頂取出的地址的值與源程序的函數(shù)調(diào) 用的返回i也址
若不相等,跳轉(zhuǎn)到間接跳轉(zhuǎn)指令控制中心 若相等,正確返回 對(duì)于正確返回的情況,Y即為假指令R的地址ra。
對(duì)應(yīng)于上述二進(jìn)制翻譯方法,本發(fā)明還提供一種二進(jìn)制翻譯系統(tǒng),如圖2 所示, 一般來(lái)說(shuō),二進(jìn)制翻譯系統(tǒng)2包括直接跳轉(zhuǎn)指令控制中心21和間接 跳轉(zhuǎn)指令控制中心22。本發(fā)明的二進(jìn)制翻譯系統(tǒng)2還包括函數(shù)調(diào)用指令翻
B,popY
loadX, O(Y) cmp X5 R
beq Indirect—dispatcher jmp (ra+4)譯模塊23、函數(shù)調(diào)用指令插入模塊24、函數(shù)調(diào)用開(kāi)始翻譯模塊25、函數(shù)調(diào)用 結(jié)束翻譯模塊26。
直接跳轉(zhuǎn)指令控制中心21 、間接跳轉(zhuǎn)指令控制中心22,進(jìn)行二進(jìn)制翻譯 系統(tǒng)和目標(biāo)程序的指令執(zhí)行現(xiàn)場(chǎng)之間的切換、切換前后的保留恢復(fù)工作。具 體來(lái)說(shuō),源程序的指令通常是以基本塊為單位翻譯為目標(biāo)程序的指令,然后 執(zhí)行該基本塊的目標(biāo)程序的指令,基本塊遇到跳轉(zhuǎn)指令結(jié)束,因此一個(gè)基本 塊的目標(biāo)程序的指令執(zhí)行完畢后,控制權(quán)必須重新交給二進(jìn)制翻譯系統(tǒng)以搜 尋并翻譯下一個(gè)源程序的基本塊如果基本塊結(jié)尾是直接跳轉(zhuǎn)指令則通過(guò)直 接跳轉(zhuǎn)指令控制中心21返回到二進(jìn)制翻譯系統(tǒng),如果基本塊結(jié)尾是間接跳轉(zhuǎn) 指令則通過(guò)間接跳轉(zhuǎn)指令控制中心22返回到二進(jìn)制翻譯系統(tǒng)。直接跳轉(zhuǎn)指令 是指未執(zhí)行就可以確定其跳轉(zhuǎn)目標(biāo)的指令,間接跳轉(zhuǎn)指令是指只有執(zhí)行到該 指令時(shí)才能確定其跳轉(zhuǎn)目標(biāo)的指令。
函數(shù)調(diào)用指令翻譯模塊23,用于將源程序的函數(shù)調(diào)用指令翻譯成對(duì)應(yīng)的 目標(biāo)程序的函數(shù)調(diào)用指令。
函數(shù)調(diào)用指令插入模塊24,用于將源程序的函數(shù)調(diào)用的返回地址作為假 指令插入在所述目標(biāo)程序的函數(shù)調(diào)用指令之后,在所述假指令后插入跳轉(zhuǎn)到 直接跳轉(zhuǎn)指令控制中心21的指令jmp Direct—dipatcher。這里,直接跳轉(zhuǎn)指令 控制中心21是在源程序的直接跳轉(zhuǎn)目標(biāo)(源程序的函數(shù)調(diào)用的返回地址)R 已經(jīng)翻譯為目標(biāo)程序的直接跳轉(zhuǎn)目標(biāo)(目標(biāo)程序的函數(shù)調(diào)用的返回地址)R, 后,將跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心23的指令(jmp Direct—dipatcher)修改 為跳轉(zhuǎn)到目標(biāo)程序的函數(shù)調(diào)用的返回地址的指令(jmpR,),這樣可以消除以 后執(zhí)行到這里時(shí)反復(fù)切換執(zhí)行現(xiàn)場(chǎng)的開(kāi)銷(xiāo)(處理時(shí)間)。
函數(shù)調(diào)用開(kāi)始翻譯模塊25,用于在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,插入將所 述假指令的地址保存到棧中的指令。
函數(shù)調(diào)用結(jié)束翻i爭(zhēng)模塊26,用于在目標(biāo)程序的函凄t調(diào)用結(jié)束,插入將棧頂保存的地址取出的指令、判斷所述從棧頂取出的地址的值是否等于所述源 程序的函數(shù)調(diào)用的返回地址的指令、和跳轉(zhuǎn)到所述假指令后的指令。
上述函數(shù)調(diào)用結(jié)束翻譯模塊26包括取出地址指令插入^^莫塊、載入地址 值指令插入模塊、比較指令插入模塊、間接跳轉(zhuǎn)指令插入模塊和直接跳轉(zhuǎn)指 令插入模塊(未在圖中顯示)。
取出地址指令插入模塊,用于插入將棧頂保存的地址取出的指令。 載入地址值指令插入模塊,用于插入將所述從棧頂取出的地址的值載入 的指令。
比較指令插入模塊,用于插入將所述從棧頂取出的地址的值與所述源程 序的函數(shù)調(diào)用的返回地址進(jìn)行比較的指令。
間接跳轉(zhuǎn)指令插入模塊,用于插入比較結(jié)果為不相等時(shí)跳轉(zhuǎn)到間接跳轉(zhuǎn) 指令控制中心的指令。
直接跳轉(zhuǎn)指令插入模塊,用于插入跳轉(zhuǎn)到所述假指令后的指令。
對(duì)應(yīng)上述的二進(jìn)制翻譯方法和系統(tǒng),本發(fā)明還提供一種函數(shù)調(diào)用和返回 的處理方法,所述函數(shù)調(diào)用和返回的處理方法是二進(jìn)制翻譯中的函數(shù)調(diào)用和 返回的處理方法,所述方法包括
將源程序的函數(shù)調(diào)用的返回地址作為假指令保存在目標(biāo)程序的函數(shù)調(diào)用 指令之后;
在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,將所述假指令的地址保存到棧中; 在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,將棧頂保存的地址取出,在所述從棧頂取
出的地址的值等于所述源程序的函數(shù)調(diào)用的返回地址時(shí),跳轉(zhuǎn)到所述假指令后。
上述方法還包括在第一次跳轉(zhuǎn)到所述假指令后,跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控 制中心,在以后各次跳轉(zhuǎn)到所述假指令后,跳轉(zhuǎn)到目標(biāo)程序的函數(shù)調(diào)用的返 回地址。上述從棧頂取出的地址的值等于所述源程序的函數(shù)調(diào)用的返回地址時(shí),
跳轉(zhuǎn)到所述假指令后包括將所述從棧頂取出的地址的值載入,將所述從棧 頂取出的地址的值與所述源程序的函數(shù)調(diào)用的返回地址進(jìn)行比較,若比較結(jié) 果為不相等則跳轉(zhuǎn)到間接跳轉(zhuǎn)指令控制中心;若比較結(jié)果為相等則跳轉(zhuǎn)到所 述假指令后。
下面再結(jié)合圖2說(shuō)明函數(shù)調(diào)用和返回的執(zhí)行流程。
由于二進(jìn)制翻譯系統(tǒng)將函數(shù)調(diào)用的返回地址R作為假指令保存在函數(shù)調(diào) 用指令之后,因此在地址為ra的內(nèi)存中保存的是源程序的函數(shù)調(diào)用的返回地址 R,即地址m的^直為R。
函數(shù)調(diào)用開(kāi)始,先跳到被調(diào)用的函數(shù)的起始地址P,,將地址ra保存(push) 到棧中,然后執(zhí)行被調(diào)用的函數(shù)的指令A(yù),及其后面的指令。
在執(zhí)行完被調(diào)用的函數(shù)后,先將棧頂保存的地址取出,將從棧頂取出的 地址的值與源程序的函數(shù)調(diào)用的返回地址R進(jìn)行比較,即判斷是否得到正確的 源程序的函數(shù)調(diào)用的返回地址R:
在程序正常執(zhí)行的情況下,從棧頂取出的地址實(shí)際上就是m,地址ra的值 就是源程序的函數(shù)調(diào)用的返回地址R,因此,跳轉(zhuǎn)到地址(ra+4)。因?yàn)槎M(jìn) 制翻譯是以基本塊(以跳轉(zhuǎn)指令結(jié)束)為單位將源程序的指令翻譯為目標(biāo)程 序的指令的,然后執(zhí)行該基本塊的目標(biāo)程序的指令,在第一次執(zhí)行地址(ra+4) 的指令時(shí),源程序的函數(shù)調(diào)用的返回地址R的指令C還沒(méi)有被翻譯成目標(biāo)程序 的指令C,,這樣指令C,的地址是未知的,因此,在第一次跳到(ra+4)后執(zhí)行 的是指令jmp Direct—dipatcher,跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心;此時(shí)二進(jìn)制翻 譯系統(tǒng)搜尋并翻譯下一個(gè)源程序的基本塊,在這里就是指令C所在的基本塊, 在二進(jìn)制翻譯系統(tǒng)將指令C翻譯成目標(biāo)程序的指令C,后,就可以得到指令C, 的地址(即目標(biāo)程序的函數(shù)調(diào)用的返回地址)R,;然后直接跳轉(zhuǎn)指令控制中 心23就將地址(ra+4)的指令修改為指令jmp R,,因此,在以后跳到(ra+4 )
14后執(zhí)行的是指令jmpR,,就不需要再通過(guò)直接跳轉(zhuǎn)指令控制中心23,可以直接 跳轉(zhuǎn)到正確的目標(biāo)程序的函數(shù)調(diào)用的返回地址R,,繼續(xù)執(zhí)行后面的指令。
在程序錯(cuò)誤執(zhí)行的情況下,從棧頂取出的地址的值不是源程序的函數(shù)調(diào) 用的返回地址R,因此,跳轉(zhuǎn)到間接跳轉(zhuǎn)指令控制中心24,由間接跳轉(zhuǎn)指令控 制中心24幫助跳轉(zhuǎn)到正確的目標(biāo)程序的函數(shù)調(diào)用的返回地址。
綜上所述,上述技術(shù)方案在函數(shù)調(diào)用指令后插入假指令以保存返回地址; 在函數(shù)調(diào)用開(kāi)始是將假指令的地址保存到棧中,而不是將返回地址保存到棧 中;在函數(shù)返回時(shí)通過(guò)從棧頂取出的地址得到返回地址(即假指令的地址的 值)。相比現(xiàn)有技術(shù)將源程序的返回地址映射到目標(biāo)程序的返回地址、或者使 用哈希表保存目標(biāo)程序的返回地址來(lái)說(shuō),上述技術(shù)方案避免使用返回目標(biāo)緩 存或棧的方式保存返回地址,也就是說(shuō),不需要引入新的數(shù)據(jù)結(jié)構(gòu)來(lái)保存返 回地址,其算法更為簡(jiǎn)單,因此更容易實(shí)施,并且也解決了現(xiàn)有技術(shù)中因哈 希沖突造成命中率低的問(wèn)題,進(jìn)而提高程序的運(yùn)行效率。
另外,上述技術(shù)方案在函數(shù)調(diào)用的正確返回時(shí)不需要作上下文切換(即 間接跳轉(zhuǎn)指令控制中心與目標(biāo)程序的切換),函數(shù)調(diào)用完成后,可以快速返回, 因此也節(jié)省了返回型間接分支的開(kāi)銷(xiāo)(處理時(shí)間),提高了二進(jìn)制翻譯效率。
上述技術(shù)方案可以應(yīng)用于各種二進(jìn)制翻譯系統(tǒng)中,包括跨平臺(tái)的二進(jìn)制 翻譯系統(tǒng)或者不跨平臺(tái)的二進(jìn)制翻譯系統(tǒng),以及非限制性的二進(jìn)制翻譯系統(tǒng)。
本發(fā)明雖然以較佳實(shí)施例公開(kāi)如上,但其并不是用來(lái)限定本發(fā)明,任何 本領(lǐng)域技術(shù)人員在不脫離本發(fā)明的精神和范圍內(nèi),都可以做出可能的變動(dòng)和 修改,因此本發(fā)明的保護(hù)范圍應(yīng)當(dāng)以本發(fā)明權(quán)利要求所界定的范圍為準(zhǔn)。
權(quán)利要求
1. 一種函數(shù)調(diào)用和返回的處理方法,其特征在于,包括將源程序的函數(shù)調(diào)用的返回地址作為假指令保存在目標(biāo)程序的函數(shù)調(diào)用指令之后;在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,將所述假指令的地址保存到棧中;在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,將棧頂保存的地址取出,在所述從棧頂取出的地址的值等于所述源程序的函數(shù)調(diào)用的返回地址時(shí),跳轉(zhuǎn)到所述假指令后。
2. 根據(jù)權(quán)利要求1所述的函數(shù)調(diào)用和返回的處理方法,其特征在于,還包 括在第一次跳轉(zhuǎn)到所述假指令后,跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心,在以后各 次跳轉(zhuǎn)到所述假指令后,跳轉(zhuǎn)到目標(biāo)程序的函數(shù)調(diào)用的返回地址。
3. 根據(jù)權(quán)利要求1所述的函數(shù)調(diào)用和返回的處理方法,其特征在于,在所 述從棧頂取出的地址的值等于所述源程序的函數(shù)調(diào)用的返回地址時(shí),跳轉(zhuǎn)到 所述假指令后包括將所述從棧頂取出的地址的值載入;比較;若比較結(jié)果為不相等則跳轉(zhuǎn)到間接跳轉(zhuǎn)指令控制中心;若比較結(jié)果為相等則跳轉(zhuǎn)到所述假指令后。
4.一種二進(jìn)制翻譯方法,其特征在于,包括將源程序的函數(shù)調(diào)用指令翻譯成對(duì)應(yīng)的目標(biāo)程序的函數(shù)調(diào)用指令;將源程序的函數(shù)調(diào)用的返回地址作為假指令插入在所述目標(biāo)程序的函數(shù) 調(diào)用指令之后,并在所述假指令后,插入跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心的指令;在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,插入將所述假指令的地址保存到棧中的指令;在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,插入將棧頂保存的地址取出的指令、判斷 所述從棧頂取出的地址的值是否等于所述源程序的函數(shù)調(diào)用的返回地址的指 令、和跳轉(zhuǎn)到所述假指令后的指令。
5. 根據(jù)權(quán)利要求4所述的二進(jìn)制翻譯方法,其特征在于,還包括將所述 跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心的指令修改為跳轉(zhuǎn)到目標(biāo)程序的函數(shù)調(diào)用的返 回地址的指令。
6. 根據(jù)權(quán)利要求4所述的二進(jìn)制翻譯方法,其特征在于,所述插入判斷所 述從棧頂取出的地址的值是否等于所述源程序的函數(shù)調(diào)用的返回地址的指令 包括插入將所述從棧頂取出的地址的值載入的指令;插入將所述從棧頂取出的地址的值與所述源程序的函數(shù)調(diào)用的返回地址 進(jìn)行比較的指令;插入在所述從棧頂取出的地址的值與所述源程序的函數(shù)調(diào)用的返回地址 不相等時(shí)跳轉(zhuǎn)到間接跳轉(zhuǎn)指令控制中心的指令。
7. —種二進(jìn)制翻譯系統(tǒng),其特征在于,還包括函數(shù)調(diào)用指令翻譯模塊,用于將源程序的函數(shù)調(diào)用指令翻譯成對(duì)應(yīng)的目 標(biāo)程序的函數(shù)調(diào)用指令;函數(shù)調(diào)用指令插入模塊,用于將源程序的函數(shù)調(diào)用的返回地址作為假指 令插入在所述目標(biāo)程序的函數(shù)調(diào)用指令之后,在所述假指令后插入跳轉(zhuǎn)到直 接跳轉(zhuǎn)指令控制中心的指令;函數(shù)調(diào)用開(kāi)始翻譯^^莫塊,用于在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,插入將所述 假指令的地址保存到棧中的指令;函數(shù)調(diào)用結(jié)束翻譯模塊,用于在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,插入將棧頂 保存的地址取出的指令、判斷所述從棧頂取出的地址的值是否等于所述源程 序的函數(shù)調(diào)用的返回地址的指令、和跳轉(zhuǎn)到所述^f艮指令后的指令。
8. 根據(jù)權(quán)利要求7所述的二進(jìn)制翻譯系統(tǒng),其特征在于,所述直接跳轉(zhuǎn)指令控制中心將跳轉(zhuǎn)到直接跳轉(zhuǎn)指令控制中心的指令修改為跳轉(zhuǎn)到目標(biāo)程序的 函數(shù)調(diào)用的返回地址的指令。
9. 根據(jù)權(quán)利要求7所述的二進(jìn)制翻譯系統(tǒng),其特征在于,所述函數(shù)調(diào)用結(jié) 束翻譯模塊包括取出地址指令插入模塊,用于插入將棧頂保存的地址取出的指令; 載入地址值指令插入模塊,用于插入將所述從棧頂取出的地址的值載入 的指令;比較指令插入模塊,用于插入將所述從棧頂取出的地址的值與所述源程 序的函數(shù)調(diào)用的返回地址進(jìn)行比較的指令;間接跳轉(zhuǎn)指令插入模塊,用于插入比較結(jié)果為不相等時(shí)跳轉(zhuǎn)到間接跳轉(zhuǎn) 指令控制中心的指令;直接跳轉(zhuǎn)指令插入模塊,用于插入跳轉(zhuǎn)到所述假指令后的指令。
全文摘要
本發(fā)明公開(kāi)了一種函數(shù)調(diào)用和返回的處理方法、二進(jìn)制翻譯方法和系統(tǒng),所述函數(shù)調(diào)用和返回的處理方法包括將源程序的函數(shù)調(diào)用的返回地址作為假指令保存在目標(biāo)程序的函數(shù)調(diào)用指令之后;在目標(biāo)程序的函數(shù)調(diào)用開(kāi)始,將所述假指令的地址保存到棧中;在目標(biāo)程序的函數(shù)調(diào)用結(jié)束,將棧頂保存的地址取出,在所述從棧頂取出的地址的值是否等于所述源程序的函數(shù)調(diào)用的返回地址時(shí),跳轉(zhuǎn)到所述假指令后。本發(fā)明可以在函數(shù)調(diào)用后快速返回,并且可以避免因哈希沖突造成效率低的問(wèn)題,因此能夠減少返回型間接分支的開(kāi)銷(xiāo),提高二進(jìn)制翻譯的性能。
文檔編號(hào)G06F9/45GK101452395SQ200710094328
公開(kāi)日2009年6月10日 申請(qǐng)日期2007年11月28日 優(yōu)先權(quán)日2007年11月28日
發(fā)明者鵬 卿, 唐大國(guó), 俊 孫, 文延華, 漆鋒濱, 王麗一 申請(qǐng)人:無(wú)錫江南計(jì)算技術(shù)研究所
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
西平县| 台东市| 浮山县| 林口县| 贺州市| 青州市| 湟源县| 福泉市| 图木舒克市| 平凉市| 遵义县| 乐亭县| 即墨市| 扬中市| 绍兴县| 即墨市| 清远市| 安仁县| 嘉义市| 芜湖市| 泗水县| 崇义县| 禹城市| 西华县| 沙湾县| 英德市| 遂平县| 阿瓦提县| 古蔺县| 江永县| 绥棱县| 遂溪县| 襄城县| 克拉玛依市| 准格尔旗| 自治县| 基隆市| 白银市| 南和县| 屏南县| 灌南县|