專利名稱:用于在程序代碼轉(zhuǎn)換過程中準(zhǔn)確地處理異常的方法和設(shè)備的制作方法
用于在程序代碼轉(zhuǎn)換過程中 準(zhǔn)確地處理異常的方法和設(shè)備本發(fā)明一般涉及計(jì)算機(jī)和計(jì)算機(jī)軟件的領(lǐng)域,具體來說,涉及用 于例如轉(zhuǎn)換程序代碼的代碼轉(zhuǎn)換器,仿真器和加速器中的程序代碼轉(zhuǎn) 換方法和^殳備。在嵌入式和非嵌入式CPU中,有占主導(dǎo)地位的指令集體系結(jié)構(gòu) (ISA),對于這些指令集體系結(jié)構(gòu),存在大量的為了性能而可以被"加 速"的軟件,或"轉(zhuǎn)換"為無數(shù)的可能提供更好的開銷/性能優(yōu)點(diǎn)的處理 器,假設(shè)它們可以透明地訪問有關(guān)的軟件。也會找到主導(dǎo)的CPU體 系結(jié)構(gòu),它們在時(shí)間上鎖定于ISA,并且在性能或市場銷售方面不能 有所發(fā)展。這樣的CPU將受益于面向軟件的處理器共同體系結(jié)構(gòu)。PCT申請WO00/22521說明了有助于這樣的加速、轉(zhuǎn)換和共同 體系結(jié)構(gòu)功能的程序代碼轉(zhuǎn)換方法和設(shè)備。與主體程序在主體處理器上的本機(jī)執(zhí)行相比,執(zhí)行程序代碼轉(zhuǎn)換 會在轉(zhuǎn)換過程中帶來開銷。相對于異常的處理,會產(chǎn)生特定困難。異常是指改變程序中的正常的控制流的狀況。異常表明,在系統(tǒng) 內(nèi)的某處發(fā)生了需要處理器注意并且通常需要在處理過程可以繼續(xù) 之前加以處理的狀況。異常可以細(xì)分為各種不同類型,如中斷、錯(cuò)誤、 陷阱或中止。術(shù)語在不同體系結(jié)構(gòu)之間有所不同,特定的異常類型或 類別可以是特定體系結(jié)構(gòu)所特有的??梢杂捎布蜍浖?"引發(fā),,)異常。硬件異常包括諸如重置、 中斷之類的信號,或來自存儲器管理單元的信號。作為示例,異???以由算術(shù)邏輯單元或浮點(diǎn)單元為諸如"除以零"之類的數(shù)值錯(cuò)誤,為溢出或下溢,或?yàn)橹T如有特權(quán)的、預(yù)留的,陷阱或未定義指令之類的指 令解碼錯(cuò)誤來生成異常。軟件異常在各種軟件程序之間也有所不同,并可以應(yīng)用于修改了
程序的正常行為的任何類型的錯(cuò)誤檢查。作為說明性示例,如果一個(gè) 寄存器的值大于第二個(gè)寄存器的值,主體代碼中的指令導(dǎo)致異常被報(bào) 告。異常處理器是當(dāng)在執(zhí)行程序的過程中發(fā)生異常時(shí)調(diào)用的特殊代 碼。如果主體程序不為給定異常提供處理器,則將調(diào)用默認(rèn)系統(tǒng)異常 處理器,通常導(dǎo)致正在運(yùn)行的程序中止,并返回錯(cuò)誤指示。異常信號是用于在許多操作系統(tǒng)上引發(fā)異常的常見的機(jī)制。被許多操作系統(tǒng)(特別是類似于Unix的系統(tǒng))遵循的POSIX標(biāo)準(zhǔn),說 明了此機(jī)制應(yīng)該如何運(yùn)轉(zhuǎn)以便異常信號在許多系統(tǒng)之間都類似。觸發(fā) 異常的最常見的事件是當(dāng)由程序?qū)崿F(xiàn)的進(jìn)程試圖(i)訪問取消映射 的存儲器區(qū)域或(ii)操縱它沒有正確的權(quán)限的存儲器區(qū)域。觸發(fā)異常信號的其他常見的事件是(m)接收到從另一個(gè)進(jìn)程發(fā)送的信號,(w)由一個(gè)進(jìn)程執(zhí)行該進(jìn)程沒有特權(quán)來執(zhí)行的指令,或(v)硬件中的I/O事件。本發(fā)明主要討論對異常的準(zhǔn)確的處理,常常還簡稱為"準(zhǔn)確的異 常"。在主體代碼指令之間的邊界上報(bào)告準(zhǔn)確的異常。當(dāng)報(bào)告了準(zhǔn)確 的異常時(shí),所有以前的主體指令的效果都是完整的,異常指向主體代 碼的沒有執(zhí)行的第一指令,該主體指令或任何后續(xù)指令的效杲還沒有產(chǎn)生。在二進(jìn)制轉(zhuǎn)換的上下文中,顯然,當(dāng)在目標(biāo)處理器上執(zhí)行目標(biāo)指 令并導(dǎo)致異常被報(bào)告時(shí),目標(biāo)指令一般將不會滿足將準(zhǔn)確的異常報(bào)告 給以主體代碼編寫的異常處理器的條件。指令通常按照與指令在對應(yīng) 的主體代碼塊中的順序不同的順序來在目標(biāo)處理器上執(zhí)行,首先由于 編寫主體代碼所針對的主體處理器的指令集和目標(biāo)代碼在其上面運(yùn) 行的目標(biāo)處理器之間的區(qū)別,其次由于通常在程序代碼轉(zhuǎn)換過程中發(fā) 生的優(yōu)化。一個(gè)已知方法是使用"恢復(fù)點(diǎn)",它們將虛擬主體機(jī)器返回到在進(jìn) 入到正在被轉(zhuǎn)換或執(zhí)行的一部分代碼時(shí)應(yīng)用的狀況,即,通過將虛擬 主體機(jī)器返回到進(jìn)入到正在被轉(zhuǎn)換或執(zhí)行的當(dāng)前主體代碼指令塊時(shí)
占優(yōu)勢的狀況。US 5832205 (Kelly等)公開了一種仿真器,該仿真器使用一組 "工作"寄存器,然后,使用柵極存儲緩沖器,將該組"工作"寄存器復(fù) 制到主體代碼的每一部分的末尾處的一組"正式"虛擬主體寄存器。如 果發(fā)生異常,這將只影響工作寄存器,可以從進(jìn)入點(diǎn)處的"正式,,寄存 器中將虛擬主體機(jī)器的狀況恢復(fù)到主體代碼的那一部分。然而,^使用 "工作,,和"正式"寄存器將會使目標(biāo)處理器中的模擬進(jìn)程的開銷顯著增大。作為另一個(gè)示例,已發(fā)表的PCT申請WO-A-00/65440說明了 在A和B寄存器組之間交替,以提供程序代碼轉(zhuǎn)換過程中的歷史 恢復(fù)點(diǎn)。已公開的PCT申請WO-A-2005/006106 7>開了另一種方法 通過為主體程序中的多種類型的指令中的每一種指令記錄不同級別 的細(xì)節(jié),應(yīng)用精確性可變的異常處理。即,要記錄的信息的量和類型 隨著主體指令的特征不同而不同。適當(dāng)?shù)兀袛嗝恳粋€(gè)主體指令是四種類型中的一種,并記錄對應(yīng)的級別的細(xì)節(jié)。第一級別完全不記錄狀 態(tài)。第二級別使用最后一個(gè)已知的堆棧幀來提供不精確的(不準(zhǔn)確的) 狀態(tài)信息。第三級別在臨時(shí)抽象寄存器中記錄轉(zhuǎn)換過程中的準(zhǔn)確的主 體程序計(jì)數(shù)器,然后檢索該計(jì)數(shù)器以便對異常進(jìn)行處理。第四級別生 成并安插額外的目標(biāo)代碼,以糾正引發(fā)了異常的目標(biāo)指令(特別是觸 發(fā)了異常的陷阱型指令)緊前面的準(zhǔn)確的狀態(tài)(即,記錄主體程序計(jì) 數(shù)器,并糾正任何懶惰或掛起的主體寄存器值)。所附權(quán)利要求的前 序部分基于此文檔。這些以前的方法依賴于記錄信息,利用該記錄信息,通過回滾到 預(yù)先定義的恢復(fù)點(diǎn)或通過糾正該點(diǎn)前面的主體狀態(tài),可使發(fā)生異常時(shí) 的主體處理器狀態(tài)得到準(zhǔn)確確定。然而,在現(xiàn)有技術(shù)中,獲取用于進(jìn)制:并產(chǎn)生相當(dāng)大的開銷和/或S要特定的硬件支持。 本發(fā)明的目的是改善進(jìn)行程序代碼轉(zhuǎn)換時(shí)的性能。 本發(fā)明的一個(gè)優(yōu)選的目的是縮小在進(jìn)行程序代碼轉(zhuǎn)換過程中,特 別是在進(jìn)行動態(tài)二進(jìn)制轉(zhuǎn)換過程中與對異常進(jìn)行處理關(guān)聯(lián)的開銷。本發(fā)明的實(shí)施例的另一個(gè)優(yōu)選目的是縮小與提供用于對異常進(jìn) 行準(zhǔn)確的處理的準(zhǔn)確的主體狀態(tài)關(guān)聯(lián)的開銷。根據(jù)本發(fā)明,提供了如所附權(quán)利要求中所闡述的設(shè)備和方法。根 據(jù)相關(guān)的權(quán)利要求,以及隨后的描述,本發(fā)明的優(yōu)選特征將變得顯而 易見。下面是根據(jù)本發(fā)明的實(shí)施例可實(shí)現(xiàn)的各種方面和優(yōu)點(diǎn)的摘要。它 是作為引言提供的,以幫助本領(lǐng)域技術(shù)人員比較快速地吸收詳細(xì)的設(shè) 計(jì)討論,該討論不以任何方式限制所附的權(quán)利要求的范圍。具體來說,發(fā)明人開發(fā)了旨在加速程序代碼轉(zhuǎn)換的方法,特別與 提供主體程序代碼到目標(biāo)代碼的動態(tài)二進(jìn)制轉(zhuǎn)換的運(yùn)行時(shí)轉(zhuǎn)換器一 起使用。在本發(fā)明的一個(gè)方面,提供了在從主體代碼到目標(biāo)代碼的程序代 碼轉(zhuǎn)換的情況下準(zhǔn)確地處理異常的方法。該方法包括從容易發(fā)生錯(cuò)誤 的主體代碼指令生成包括一個(gè)或多個(gè)對等目標(biāo)指令的目標(biāo)代碼。每一 個(gè)對等目標(biāo)代碼指令都與恢復(fù)信息關(guān)聯(lián)。在執(zhí)行目標(biāo)代碼指令的過程 中發(fā)生異常(例如,錯(cuò)誤)之后,檢索恢復(fù)信息,并將其用于糾正準(zhǔn) 確的主體狀態(tài)。優(yōu)選情況下,恢復(fù)信息考慮了在目標(biāo)代碼生成過程中執(zhí)行的優(yōu) 化。適當(dāng)?shù)兀褂没謴?fù)信息來執(zhí)行恢復(fù)例程,這些例程在容易發(fā)生錯(cuò) 誤的主體代碼指令附近糾正代表主體處理器的準(zhǔn)確的主體狀態(tài)。優(yōu)選情況下,該方法包括緊隨在生成的目標(biāo)代碼之后立即存儲一 個(gè)或多個(gè)恢復(fù)信息項(xiàng)。檢索恢復(fù)信息的過程包括對目標(biāo)代碼進(jìn)行掃描 以定位隨后的恢復(fù)信息,以及檢索與相應(yīng)的發(fā)生錯(cuò)誤的對等目標(biāo)指令 關(guān)聯(lián)的恢復(fù)信息項(xiàng)。優(yōu)選情況下,目標(biāo)代碼和恢復(fù)信息在代碼塊之間是交織的。 在特定優(yōu)選實(shí)施例中,使用目標(biāo)程序計(jì)數(shù)器來索引恢復(fù)信息。 在本發(fā)明的第二個(gè)方面,提供了準(zhǔn)確地處理從主體代碼到目標(biāo)代
碼的程序代碼轉(zhuǎn)換過程中所存在的異常的方法,包括生成目標(biāo)代碼的 步驟,該目標(biāo)代碼包括對應(yīng)于主體代碼中的潛在地發(fā)生錯(cuò)誤的主體指 令的至少一個(gè)對等目標(biāo)指令,并存儲與所述至少一個(gè)對等目標(biāo)指令關(guān) 聯(lián)的恢復(fù)信息。在接收到中斷信號時(shí),繼續(xù)執(zhí)行目標(biāo)代碼指令,直到 遇到一個(gè)對等目標(biāo)指令。在到達(dá)對等目標(biāo)指令時(shí),檢索關(guān)聯(lián)的恢復(fù)信 息,并將其用于恢復(fù)準(zhǔn)確的主體狀態(tài)。在優(yōu)選實(shí)施例中,準(zhǔn)確的異常處理方法從發(fā)生異常的點(diǎn)向前滾 動,直到使用存儲的恢復(fù)信息可恢復(fù)準(zhǔn)確的主體狀態(tài)。適當(dāng)?shù)?,繼續(xù) 逐個(gè)地執(zhí)行目標(biāo)代碼指令,優(yōu)選情況下,通過調(diào)用目標(biāo)代碼解釋器或 調(diào)用步進(jìn)式目標(biāo)處理器模式。本發(fā)明還擴(kuò)展到用于執(zhí)行這里所定義的任何一個(gè)方法的轉(zhuǎn)換器 設(shè)備。此外,本發(fā)明還擴(kuò)展到在其上記錄了可由計(jì)算機(jī)實(shí)現(xiàn)的指令以 執(zhí)行這里所定義的任何一個(gè)方法的計(jì)算機(jī)可讀取的存儲介質(zhì)。本說明書收入的并構(gòu)成本說明書的一部分的
了目前優(yōu)選的實(shí)現(xiàn)方式,并描述如下圖1是說明應(yīng)用了本發(fā)明的實(shí)施例的設(shè)備的方框圖;圖2是說明在程序代碼轉(zhuǎn)換過程中執(zhí)行控制的首選方法的示意流程圖;圖3是顯示了在程序代碼轉(zhuǎn)換之后主體指令和目標(biāo)指令之間的 關(guān)系的示意圖;圖4顯示了根據(jù)本發(fā)明的優(yōu)選實(shí)施例的在程序代碼轉(zhuǎn)換過程中 目標(biāo)機(jī)器中的示例程序代碼結(jié)構(gòu);圖5是根據(jù)本發(fā)明的優(yōu)選實(shí)施例的創(chuàng)建準(zhǔn)確的異常的目標(biāo)代碼 的方法的示意概述;圖6是顯示了存儲恢復(fù)信息和生成的目標(biāo)代碼的首選機(jī)制的示意圖;圖7是獲取恢復(fù)信息的首選方法的示意圖;圖8是本發(fā)明的優(yōu)選實(shí)施例中使用的恢復(fù)信息的示意表示方式;
圖9是本發(fā)明的另一個(gè)優(yōu)選實(shí)施例中使用的恢復(fù)信息的示意表示方式;圖10顯示了說明中斷的處理的示例目標(biāo)代碼序列;以及 圖11是顯示了在目標(biāo)計(jì)算平臺內(nèi)處理中斷的首選實(shí)施方式的 示意視圖。下面的描述使本領(lǐng)域技術(shù)人員能做出并使用本發(fā)明,并闡明了發(fā) 明人設(shè)想的實(shí)現(xiàn)他們的發(fā)明的最佳模式。然而,各種修改對本領(lǐng)域技 術(shù)人員是顯而易見的,因?yàn)檫@里專門定義了本發(fā)明的一般原理,以提 供改善的程序代碼轉(zhuǎn)換方法和設(shè)備。在下面的術(shù)語中,主體程序可以在包括主體處理器的主體計(jì)算平 臺上運(yùn)行。包括目標(biāo)處理器的目標(biāo)計(jì)算平臺用于通過執(zhí)行動態(tài)程序代 碼轉(zhuǎn)換的轉(zhuǎn)換器來運(yùn)行主體程序。轉(zhuǎn)換器執(zhí)行從主體代碼到目標(biāo)代碼 的代碼轉(zhuǎn)換,以便目標(biāo)代碼可在目標(biāo)計(jì)算平臺上執(zhí)行。圖1說明了示例目標(biāo)計(jì)算平臺,包括具有多個(gè)目標(biāo)寄存器15 的目標(biāo)處理器13,存儲多個(gè)軟件組件17、 19、 20、 21,以及27的 存儲器18。軟件組件包括操作系統(tǒng)20、主體代碼17、轉(zhuǎn)換器代碼 19,以及經(jīng)過轉(zhuǎn)換的目標(biāo)代碼21。在一個(gè)實(shí)施例中,轉(zhuǎn)換器代碼19是將主體指令集體系結(jié)構(gòu) (ISA)的主體代碼轉(zhuǎn)換為另一個(gè)ISA的經(jīng)過轉(zhuǎn)換的目標(biāo)代碼的仿真 器,有或者沒有優(yōu)化。在另一個(gè)實(shí)施例中,轉(zhuǎn)換器19充當(dāng)加速器, 用于通過進(jìn)行程序代碼優(yōu)化,將主體代碼轉(zhuǎn)換為目標(biāo)代碼,各自都是 同一 ISA。轉(zhuǎn)換器19,即,實(shí)現(xiàn)了轉(zhuǎn)換器的源代碼的已編譯的版本,和經(jīng) 過轉(zhuǎn)換的代碼21,即,由轉(zhuǎn)換器19產(chǎn)生的主體代碼17的轉(zhuǎn)換, 與在目標(biāo)處理器13 (通常是微處理器或其他合適的計(jì)算機(jī))上運(yùn)行 的操作系統(tǒng)20 —起運(yùn)行。應(yīng)該理解,圖1中所顯示的結(jié)構(gòu)只是示范性的,例如,根據(jù)本 發(fā)明的軟件、方法和進(jìn)程可以以駐留在操作系統(tǒng)內(nèi)或操作系統(tǒng)下面的 代碼來實(shí)現(xiàn)。如本領(lǐng)域技術(shù)人員所知道的,主體代碼17、轉(zhuǎn)換器代
碼19、操作系統(tǒng)20,以及存儲器18的存儲機(jī)制可以是各式各樣的 類型中的任何一種類型。在根據(jù)圖1的設(shè)備中,優(yōu)選情況下,在目標(biāo)代碼21正在運(yùn)行 的過程中,在運(yùn)行時(shí)動態(tài)地執(zhí)行程序代碼轉(zhuǎn)換。轉(zhuǎn)換器19與經(jīng)過轉(zhuǎn) 換的程序21內(nèi)聯(lián)地運(yùn)行。優(yōu)選情況下,轉(zhuǎn)換器19被用作為目標(biāo)體 系結(jié)構(gòu)編譯的應(yīng)用程序。主體程序17被轉(zhuǎn)換器19在運(yùn)行時(shí)轉(zhuǎn)換, 以在目標(biāo)體系結(jié)構(gòu)14上執(zhí)行。通過轉(zhuǎn)換器19運(yùn)行主體程序17涉及以交織方式執(zhí)行的兩種 不同類型的代碼轉(zhuǎn)換器代碼19;以及目標(biāo)代碼21。轉(zhuǎn)換器代碼19 是基于轉(zhuǎn)換器19的高級源代碼實(shí)施方式,在運(yùn)行時(shí)之前,諸如通過 編譯器生成的。相比之下,由轉(zhuǎn)換器代碼19在整個(gè)運(yùn)行時(shí)過程中基 于正在被轉(zhuǎn)換的程序的存儲的主體代碼17生成的。主體程序17可以在主體處理器(未顯示)上運(yùn)行。在一個(gè)實(shí)施 例中,轉(zhuǎn)換器19充當(dāng)仿真器。即,當(dāng)實(shí)際作為目標(biāo)代碼21在目標(biāo) 處理器13上執(zhí)行主體程序17時(shí),轉(zhuǎn)換器19模擬主體處理器。在 優(yōu)選實(shí)施例中,提供過至少一個(gè)全局寄存器存儲器27 (也簡稱為主 體寄存器組27或抽象寄存器組27)。在多處理器環(huán)境中,根據(jù)主 體處理器的體系結(jié)構(gòu),可選地,提供了一個(gè)以上的抽象寄存器組27。 由轉(zhuǎn)換器19和目標(biāo)代碼21的組件提供主體處理器狀態(tài)的表示形 式。即,轉(zhuǎn)換器19將主體處理器狀態(tài)存儲在諸如變量和/或?qū)ο笾?的各種顯式的編程語言設(shè)備中。用于編譯轉(zhuǎn)換器19的編譯器判斷在 目標(biāo)代碼中是如何實(shí)現(xiàn)狀態(tài)和操作的。比較起來,目標(biāo)代碼21在目 標(biāo)寄存器15中和存儲器位置18 (它們由目標(biāo)代碼21的目標(biāo)指令 操縱)處隱式地提供主體處理器狀態(tài)。例如,全局寄存器存儲器27的 低水平的表示形式只不過是已分配的存儲器的一個(gè)區(qū)域。然而,在轉(zhuǎn) 換器19的源代碼中,全局寄存器存儲器27是在較高的級別可以被 訪問和操縱的數(shù)據(jù)陣列或?qū)ο?。圖2是說明在程序代碼轉(zhuǎn)換過程中執(zhí)行控制的首選方法的示意 流程圖。
如圖2所示,控制首先從轉(zhuǎn)換器控制循環(huán)190開始。在步驟 201中,控制循環(huán)190調(diào)用轉(zhuǎn)換器代碼19的代碼生成功能192, 該功能將主體代碼塊17轉(zhuǎn)換為對應(yīng)的經(jīng)過轉(zhuǎn)換的代碼塊21。然后, 在步驟202中,在目標(biāo)處理器13上執(zhí)行該經(jīng)過轉(zhuǎn)換的代碼塊21 。 方便地,每一個(gè)經(jīng)過轉(zhuǎn)換的代碼塊21的末尾都包含將控制返回到控 制循環(huán)201的指令。換句話說,轉(zhuǎn)換和執(zhí)行主體代碼的步驟是交替 的,以便轉(zhuǎn)換主體程序17的部分,然后再執(zhí)行。這里,對于本領(lǐng)域技術(shù)人員來說,術(shù)語"基本塊"是熟悉的。基本 塊是正好具有一個(gè)入口點(diǎn)和正好一個(gè)出口點(diǎn)的代碼的一部分,它將塊 代碼限制到單個(gè)控制路徑。由于這個(gè)緣故,基本塊是控制流的有用的 基本單位。適當(dāng)?shù)兀D(zhuǎn)換器19將主體代碼17劃分為多個(gè)基本塊, 每一個(gè)基本塊都是單個(gè)入口點(diǎn)中的第 一指令和單個(gè)出口點(diǎn)中的最后 一個(gè)指令之間的連續(xù)的指令集(如跳轉(zhuǎn)調(diào)用或轉(zhuǎn)移指令)。轉(zhuǎn)換器可 以只選擇這些基本塊中的一個(gè)(塊模式)或選擇一組基本塊(組合塊 模式)。組合塊適當(dāng)?shù)匕▋蓚€(gè)或更多將一起被當(dāng)作單個(gè)單元對待的 基本塊。此外,轉(zhuǎn)換器還可以構(gòu)成代表主體代碼的相同基本塊但是在 不同入口條件下的"相同塊"。在優(yōu)選實(shí)施例中,基于主體指令序列,生成中間表示形式(IR) 的樹,作為從原始主體程序17生成目標(biāo)代碼21的過程的一部分。 IR樹是計(jì)算出的表達(dá)式和由主體程序執(zhí)行的操作的抽象表示形式。 稍后,基于IR樹來生成目標(biāo)代碼21。 IR節(jié)點(diǎn)的集合實(shí)際是有向非 循環(huán)圖(DAG),但是用通俗語簡稱為"樹"。如本領(lǐng)域技術(shù)人員所理解的,在一個(gè)實(shí)施例中,使用諸如C++ 之類的面向?qū)ο蟮木幊陶Z言來實(shí)現(xiàn)轉(zhuǎn)換器19。例如,IR節(jié)點(diǎn)作為 C++對象來實(shí)現(xiàn),而對其他節(jié)點(diǎn)的引用作為對對應(yīng)于那些其他節(jié)點(diǎn)的 C++對象的C++引用來實(shí)現(xiàn)。因此,IR樹作為IR節(jié)點(diǎn)對象的集 合來實(shí)現(xiàn),包含對彼此的各種引用。此外,在所討論的實(shí)施例中,IR生成過程使用了一組抽象寄存 器定義,這些定義對應(yīng)于主體程序17在其上運(yùn)行的主體體系結(jié)構(gòu)的
特定特征。例如,對于主體體系結(jié)構(gòu)上的每一個(gè)物理寄存器,都有唯 一的抽象寄存器定義。如此,轉(zhuǎn)換器中的抽象寄存器定義可以作為包含對IR節(jié)點(diǎn)對象(即,IR樹)的引用的C++對象來實(shí)現(xiàn)。被抽 象寄存器定義集引用的所有IR樹的聚合被稱為工作IR森林("森 林,,,因?yàn)樗鄠€(gè)抽象寄存器根,每一個(gè)根都引用IR樹)。這 些IR樹及其他進(jìn)程適當(dāng)?shù)貥?gòu)成了轉(zhuǎn)換器代碼生成功能192的一部 分。異常處理圖3是顯示在本發(fā)明的優(yōu)選實(shí)施例的程序代碼轉(zhuǎn)換之后主體程 序中的指令和目標(biāo)程序中的指令之間的關(guān)系的示意圖。在此示例中,主體指令Sl-S3產(chǎn)生功能等效的目標(biāo)指令 Tl-T3。主體指令Sl諸如通過死代碼消除優(yōu)化被消除,在生成的目 標(biāo)代碼中沒有對等物。主體指令S2產(chǎn)生一個(gè)等效的目標(biāo)指令T3。 相比之下,主體指令S3產(chǎn)生兩個(gè)目標(biāo)指令T1&T2。在目標(biāo)和主體 代碼指令之間可以有一對無、 一對一、 一對多或多對一的關(guān)系。也是如圖3所示,另一個(gè)常用的優(yōu)化是執(zhí)行代碼重安排,從而, 目標(biāo)代碼中的指令序列不相當(dāng)于主體代碼中的原始序列。這里,第二 主體指令S2 —直被重安排為第三目標(biāo)指令T3。圖3還顯示了主體異常處理器170。通常,主體環(huán)境將提供一 個(gè)或多個(gè)特定主體錯(cuò)誤處理器170a(即,特定類型的異常所特有的) 和/或一個(gè)或多個(gè)默認(rèn)異常處理器170b (在沒有注冊特定異常處理器 的情況下使用)。在此示例中,主體指令Sl、 S2或S3中的任何一個(gè)指令潛在 地產(chǎn)生異常,該異常需要由主體異常處理器170來處理。經(jīng)過轉(zhuǎn)換的主體異常處理器270在目標(biāo)代碼中提供在目標(biāo)處理 器上執(zhí)行的異常處理器,該異常處理器模擬主體異常處理器170。在 實(shí)踐中,提供了一個(gè)或多個(gè)經(jīng)過轉(zhuǎn)換的主體特定的異常處理器270a 或默認(rèn)異常處理器270b。 一旦處理完了異常,異常處理器270通常 將控制返回到目標(biāo)代碼21。經(jīng)過轉(zhuǎn)換的主體異常處理器270希望接收準(zhǔn)確的主體狀態(tài),以 便準(zhǔn)確地處理異常。如上所述,重新創(chuàng)建準(zhǔn)確的主體狀態(tài)既困難,又 開銷大。首先,有與計(jì)算和收集主體狀態(tài)關(guān)聯(lián)的實(shí)際開銷。例如,諸 如惰性求值之類的轉(zhuǎn)換器優(yōu)化可以通過存儲計(jì)算主體寄存器值所需 的基礎(chǔ)數(shù)據(jù)來延遲計(jì)算這些值。響應(yīng)異常而重新創(chuàng)建主體狀態(tài)需要立 即糾正(即,計(jì)算)這些值。即使以前已經(jīng)計(jì)算了主體寄存器,也必 須從存儲器中,如從主體寄存器組27中,檢索它們。其次,有與在主體程序中的任意點(diǎn)計(jì)算準(zhǔn)確的主體狀態(tài)的功能關(guān) 聯(lián)的機(jī)會成本。動態(tài)二進(jìn)制轉(zhuǎn)換器中的許多關(guān)鍵優(yōu)化,如代碼重安排, 涉及相對于二進(jìn)制兼容性的嚴(yán)格的模式的偏離。二進(jìn)制兼容性是指, 轉(zhuǎn)換器可以重新創(chuàng)建主體體系結(jié)構(gòu)的準(zhǔn)確的狀態(tài)。嚴(yán)格的模式是可以 在經(jīng)過轉(zhuǎn)換的程序中的任何一點(diǎn)(即,在任何主體指令)重新創(chuàng)建主 體狀態(tài)的模式。為了保留在執(zhí)行中的任何一點(diǎn)重新創(chuàng)建主體狀態(tài)所需 的信息,轉(zhuǎn)換器通常必須在顯著的優(yōu)化之前進(jìn)行。當(dāng)這些優(yōu)化正在使 用中時(shí),轉(zhuǎn)換器無法準(zhǔn)確地重新創(chuàng)建主體上下文。如此,準(zhǔn)確的異常 處理的實(shí)際開銷不只是生成準(zhǔn)確的主體狀態(tài)的工作。對代碼轉(zhuǎn)換過程 有一些限制,以便能夠完全地生成主體狀態(tài)。錯(cuò)誤通過首先集中說明通常被稱為錯(cuò)誤的特定類別的異常來說明本 發(fā)明是有幫助的。錯(cuò)誤通常用于錯(cuò)誤處理。在異常情況下,許多操作可能不能產(chǎn)生 正確結(jié)果。例如,整數(shù)加法指令可能產(chǎn)生太大而無法被表示的結(jié)果(假 定結(jié)果的大小匹配輸入的大小)。處理器體系結(jié)構(gòu)設(shè)計(jì)者決定如何標(biāo) 記這樣的錯(cuò)誤(如果有的話)。三個(gè)典型設(shè)計(jì)選項(xiàng)是悄悄地忽略溢 出,通過修改內(nèi)部處理器狀態(tài)(例如,狀態(tài)標(biāo)志)來標(biāo)記錯(cuò)誤,但是 繼續(xù)執(zhí)行下面的指令,或引發(fā)溢出異常。特定的體系結(jié)構(gòu)可以通過提 供特定指令的發(fā)生錯(cuò)誤的和非發(fā)生錯(cuò)誤的版本來提供這些選項(xiàng)的混 合模式。作為其他示例,某些常見的錯(cuò)誤類別是算術(shù)異常、各種形式的
存儲器錯(cuò)誤(無效地址、保護(hù)違規(guī),以及校準(zhǔn)檢查),以及畸形或非 法(在當(dāng)前特權(quán)級別)指令錯(cuò)誤。錯(cuò)誤通常是同步的強(qiáng)制的異常,因?yàn)樗鼈冇捎谠诓僮鲾?shù)數(shù)據(jù),以 及處理器狀態(tài)(包括存儲器分配等等)的上下文中執(zhí)行給定指令而發(fā) 生的。錯(cuò)誤在指令內(nèi)發(fā)生,也就是說,不能完成發(fā)生錯(cuò)誤的指令。通 常,主體處理器將使寄存器狀態(tài)回到發(fā)生錯(cuò)誤的指令開始時(shí)的寄存器 狀態(tài),允許錯(cuò)誤處理器嘗試解決錯(cuò)誤,以便使執(zhí)行得以恢復(fù)。在某些 情況下,可能無法解析這樣的狀態(tài),這又可能會使錯(cuò)誤是最后的??苫謴?fù)的錯(cuò)誤的一個(gè)示例(通常在OS或子OS級別)是頁面錯(cuò)誤-當(dāng)存儲器嘗試訪問虛擬存儲器中的不存在的頁面時(shí),引發(fā)異 常。如果映射該頁面,則虛擬存儲器系統(tǒng)將分配物理頁面,根據(jù)映射 來準(zhǔn)備它(例如,如果已經(jīng)在該地址映射了一個(gè)文件,則加載數(shù)據(jù)), 然后,相應(yīng)地更新頁面表結(jié)構(gòu)。然后,處理器可以恢復(fù)執(zhí)行同一個(gè)指 令,該指令現(xiàn)在應(yīng)該能夠正確地完成。某些錯(cuò)誤可以與用戶模式應(yīng)用程序屏蔽開來-例如,校準(zhǔn)檢查通常在支持不對準(zhǔn)的訪問的體系結(jié)構(gòu)上作為可屏蔽的錯(cuò)誤可用;在那 些不支持校準(zhǔn)錯(cuò)誤的體系結(jié)構(gòu)上是不可屏蔽的。已知,主體指令集體系結(jié)構(gòu)中的某些指令是容易產(chǎn)生錯(cuò)誤的,而 其他指令不容易產(chǎn)生錯(cuò)誤。即,大多數(shù)指令集包括某些容易發(fā)生錯(cuò)誤 的指令(還被稱為"發(fā)生錯(cuò)誤的指令或潛在地發(fā)生錯(cuò)誤的指令"),以 及某些不發(fā)生錯(cuò)誤的不容易發(fā)生錯(cuò)誤的指令。錯(cuò)誤是有問題的,因?yàn)樗鼈兪峭降?,通常是可恢?fù)的。此外, 容易發(fā)生錯(cuò)誤的指令趨向于在任何現(xiàn)實(shí)的主體程序中相對頻繁地執(zhí) 行。因此,在處理錯(cuò)誤時(shí)的改進(jìn)在程序代碼轉(zhuǎn)換中,特別是在動態(tài)二 進(jìn)制轉(zhuǎn)換中,具有直接的優(yōu)點(diǎn)。錯(cuò)誤處理圖4顯示了根據(jù)本發(fā)明的優(yōu)選實(shí)施例的在程序代碼轉(zhuǎn)換過程中 目標(biāo)機(jī)器中的示例程序代碼結(jié)構(gòu)。在圖4中,示例主體代碼塊17包括主體指令SC1到SC4。
這些指令中的一個(gè)指令(SC3*)是容易發(fā)生錯(cuò)誤的指令174,而其余 部分是不容易發(fā)生錯(cuò)誤的。此外,還顯示了對應(yīng)的目標(biāo)代碼塊21,并具有等效的目標(biāo)代碼 指令TC1到TC6。容易發(fā)生錯(cuò)誤的主體指令174 (SC3)涉及生成 的目標(biāo)代碼21中的一個(gè)或多個(gè)對等目標(biāo)指令214 (在此情況下, TC4*)。如圖4所示,提供了恢復(fù)映射194,它將每一個(gè)對等目標(biāo)指令 214鏈接到相應(yīng)的恢復(fù)信息項(xiàng)195。即,每一個(gè)容易發(fā)生錯(cuò)誤的主體 指令174都具有一個(gè)或多個(gè)對等目標(biāo)代碼指令214,每一個(gè)對等目 標(biāo)代碼指令214都映射到相應(yīng)的目標(biāo)特定的恢復(fù)信息項(xiàng)195。通過恢復(fù)信息195,可以準(zhǔn)確地處理在目標(biāo)代碼21的執(zhí)行過程 中發(fā)生的異常(特別是錯(cuò)誤)。具體來說,恢復(fù)信息195允許執(zhí)行 額外的本機(jī)代碼指令,以便創(chuàng)建準(zhǔn)確的主體狀態(tài),以便在經(jīng)過轉(zhuǎn)換的 主體異常處理器270中準(zhǔn)確地處理異常。在一個(gè)優(yōu)選實(shí)施例中,提供了恢復(fù)處理器215,它使用恢復(fù)信息 195來糾正準(zhǔn)確的主體狀態(tài),以便由異常處理器270處理異常。圖5是根據(jù)本發(fā)明的優(yōu)選實(shí)施例的創(chuàng)建能夠準(zhǔn)確地處理錯(cuò)誤型 異常的目標(biāo)代碼21的方法的示意概述。在步驟501中,對主體代碼17的一部分(基本塊比較合適) 進(jìn)行解碼。在解碼過程中,根據(jù)主體ISA的定義,來標(biāo)識一個(gè)或多 個(gè)容易發(fā)生錯(cuò)誤的指令174。在步驟502中,進(jìn)行程序代碼轉(zhuǎn)換,以將主體代碼17轉(zhuǎn)換為 對應(yīng)的目標(biāo)代碼塊21。可選地,程序代碼轉(zhuǎn)換包括諸如死代碼刪除 和/或代碼重安排之類的優(yōu)化,等等。生成的目標(biāo)代碼塊21包括每一 個(gè)容易發(fā)生錯(cuò)誤的主體指令174的一個(gè)或多個(gè)對等目標(biāo)指令214。在步驟503中,為每一個(gè)對等目標(biāo)指令214提供了恢復(fù)信息 195。適當(dāng)?shù)?,在恢?fù)映射表194中創(chuàng)建將每一個(gè)對等目標(biāo)指令214 鏈接到相應(yīng)的恢復(fù)信息195的條目。在步驟504中,執(zhí)行生成的目標(biāo)代碼塊21中的指令。如果不
發(fā)生異常(錯(cuò)誤),那么,繼續(xù)執(zhí)行,直到代碼塊的末尾,然后,如通過圖2的轉(zhuǎn)換器運(yùn)行循環(huán)來調(diào)用下一個(gè)代碼塊。在步驟505中,當(dāng)相對于一個(gè)對等目標(biāo)指令214發(fā)生異常(錯(cuò) 誤)時(shí),獲取相應(yīng)的恢復(fù)信息195,并用于糾正準(zhǔn)確的主體狀態(tài)。即, 使用恢復(fù)信息195來執(zhí)行一組額外的恢復(fù)代碼指令(在理想情況下, 在恢復(fù)處理器215中執(zhí)行)。適當(dāng)?shù)匾员緳C(jī)代碼編寫恢復(fù)處理器215,它天然地可由目標(biāo)處理 器執(zhí)行(而不是由轉(zhuǎn)換器19動態(tài)地生成的經(jīng)過轉(zhuǎn)換的目標(biāo)代碼)。在步驟506中,由異常處理器270準(zhǔn)確地處理異常。即,步驟 505中的恢復(fù)提供了準(zhǔn)確的主體狀態(tài),以符合由異常處理器270進(jìn) 行準(zhǔn)確的異常處理的條件。通常,成功地處理異常,控制返回到執(zhí)行 程序。通常,控制返回,以完成當(dāng)前代碼塊的執(zhí)行。在其它情況下, 錯(cuò)誤是最后的,程序結(jié)束。存儲恢復(fù)信息圖6顯示了在目標(biāo)計(jì)算平臺上存儲恢復(fù)信息195和生成的目 標(biāo)4義碼21的首選才;u制。上文所討論的恢復(fù)機(jī)制本身會給轉(zhuǎn)換器19帶來某些開銷。首 先,需要存儲器空間來存儲恢復(fù)信息195。此外,還需要空間來存儲 將每一個(gè)對等目標(biāo)代碼指令214鏈接到相應(yīng)的恢復(fù)信息195的恢 復(fù)映射194。當(dāng)發(fā)生異常(錯(cuò)誤)時(shí),希望快速而有效地獲取有關(guān)的 恢復(fù)信息195。圖6顯示了目標(biāo)計(jì)算平臺中的存儲了生成的目標(biāo)代碼塊21a 的存儲器區(qū)域。目標(biāo)代碼塊21包括對應(yīng)于主體指令中的容易發(fā)生錯(cuò) 誤的指令174的一個(gè)或多個(gè)對等目標(biāo)指令214?;謴?fù)信息195存儲在存儲器中,緊隨在相應(yīng)的目標(biāo)代碼塊21a 之后。即,每一個(gè)對等目標(biāo)指令214都具有緊隨在有關(guān)的目標(biāo)代碼 塊21a之后存儲的相應(yīng)的恢復(fù)信息項(xiàng)195。優(yōu)選情況下,提供了標(biāo)記196,以便輕松地區(qū)別目標(biāo)代碼塊21a 的末尾和恢復(fù)信息195的開始。 此外,如圖6所示,另一個(gè)經(jīng)過轉(zhuǎn)換的目標(biāo)代碼塊21b存儲 在存儲器中,接下來是相應(yīng)的恢復(fù)信息195和標(biāo)記196。即,目標(biāo) 代碼21和恢復(fù)信息195在存儲器中相互交織。當(dāng)在特定對等目標(biāo)指令214中發(fā)生異常(錯(cuò)誤)時(shí),執(zhí)行下面 的步驟,以便獲取相應(yīng)的恢復(fù)信息。第一個(gè)步驟是進(jìn)行掃描,直到目標(biāo)代碼塊的末尾。此步驟方便地 包括讀取連續(xù)的指令,直到發(fā)現(xiàn)了標(biāo)記196。其次,對恢復(fù)信息195 的列表進(jìn)行掃描,發(fā)現(xiàn)相應(yīng)的所需要的恢復(fù)信息。在特定優(yōu)選實(shí)施例中,根據(jù)對等目標(biāo)指令214的程序計(jì)數(shù)器來 索引每一個(gè)恢復(fù)信息195。即,對等目標(biāo)代碼指令214的程序計(jì)數(shù) 器值構(gòu)成了恢復(fù)信息195的列表中的索引。當(dāng)發(fā)生異常時(shí),在目標(biāo) 處理器中,目標(biāo)程序計(jì)數(shù)器輕松地可用。首先,對存儲器進(jìn)行掃描, 以查找標(biāo)記196,然后,查找恢復(fù)信息的列表中的目標(biāo)程序計(jì)數(shù)器, 可以有效地定位相應(yīng)的恢復(fù)信息195。圖7顯示了使用圖6的存儲器布局來獲取恢復(fù)信息的首選方法。在實(shí)際的實(shí)施例中,每一個(gè)基本塊通常都包含大約十二個(gè)指令。 因此,掃描到當(dāng)前目標(biāo)代碼塊的末尾相對來說比較快,因?yàn)樯婕暗木?離相對來說比較短。在優(yōu)選實(shí)施例中,每一個(gè)主體塊都只限于比方說 100或200個(gè)指令的最大大小。甚至在相對來說比較長的目標(biāo)塊的 這些稀少的情況下,掃描仍是有效而便宜的機(jī)制。圖8顯示了恢復(fù)信息195的特定優(yōu)選實(shí)施例。在圖8的示例中,恢復(fù)信息195包括目標(biāo)程序計(jì)數(shù)器195a、 主體程序計(jì)數(shù)器195b、 一組恢復(fù)指示符195c和映射模板195d。恢復(fù)信息195可使恢復(fù)處理器215糾正準(zhǔn)確的主體狀態(tài)。具體 來說,準(zhǔn)確的主體狀態(tài)包括主體程序計(jì)數(shù)器值(195b)和主體寄存器 值。優(yōu)選地,恢復(fù)處理器215使用恢復(fù)信息來糾正主體程序計(jì)數(shù)器 (如果已經(jīng)不可用)。在此示例中,恢復(fù)信息195為每一個(gè)目標(biāo)PC 195a都存儲了精確的主體PC 195b。通過讀取存儲的恢復(fù)信息中的 此字段195b來糾正主體PC。映射模板195d標(biāo)識在對等目標(biāo)指令214的附近適用的適當(dāng) 的寄存器映射?;謴?fù)處理器215糾正主體處理器寄存器值。在一個(gè) 實(shí)施例中,寄存器值被糾正到存儲器中的抽象寄存器組27?;蛘?, 存儲器存儲被保留在目標(biāo)寄存器中。這里,恢復(fù)處理器215使用存 儲的映射模板195d來設(shè)置寄存器映射,從而,主體寄存器被映射到 物理目標(biāo)寄存器。如圖8所示,優(yōu)選情況下,存儲的恢復(fù)信息195包括一組恢復(fù) 指示符(優(yōu)化標(biāo)記)195c,它們表示在特定目標(biāo)代碼指令的附近未完 成的優(yōu)化。在此示例中,設(shè)置了四個(gè)恢復(fù)指示符,作為標(biāo)記Fl、 F2、 F3和F4。適當(dāng)?shù)?,恢?fù)處理器215基于恢復(fù)指示符Fl-F4來調(diào)用 一個(gè)或多個(gè)本機(jī)代碼恢復(fù)例程216,以執(zhí)行未完成的優(yōu)化。具體來說,恢復(fù)處理器執(zhí)行在發(fā)生異常時(shí)被推遲的懶惰工作。例 如,許多處理器提供了一組條件代碼標(biāo)記。首選的優(yōu)化是通過存儲基 礎(chǔ)信息(該基礎(chǔ)信息可使條件代碼標(biāo)記的正確的狀態(tài)在必要時(shí)得到糾 正),延遲條件代碼標(biāo)記的糾正?;謴?fù)例程216從存儲的基礎(chǔ)信息 執(zhí)行懶惰的條件代碼標(biāo)記評估。圖9顯示了存儲的恢復(fù)信息的另一個(gè)特定的優(yōu)選實(shí)施例。在理想情況下,恢復(fù)信息195以壓縮的形式存儲。有益地,減 少了恢復(fù)信息的存儲器的占用大小。在某些環(huán)境中,轉(zhuǎn)換器19在計(jì) 算平臺上與許多其他進(jìn)程一起操作,需要縮小由轉(zhuǎn)換器19的開銷消 耗的存儲器的大小。如圖9所示,第一目標(biāo)PC 195a和第一主體PC 195b作為全 值來存儲。隨后的每一個(gè)PC都作為與這些基準(zhǔn)值的偏移來存儲。適 當(dāng)?shù)兀恳粋€(gè)目標(biāo)代碼塊21a、 21b中的第一恢復(fù)信息195以完全 PC值作為基準(zhǔn)值地存儲,每一個(gè)隨后的恢復(fù)信息195都存儲程序計(jì) 數(shù)器值作為與基準(zhǔn)值的偏移?;蛘撸瑸榇a塊定義了基本PC,如代 碼塊中的第一目標(biāo)代碼指令的PC,不管這是否是對等目標(biāo)指令214。 <formula>formula see original document page 24</formula>下面顯示了主體代碼17的示例序列,作為目前描述的技術(shù)的說 明性示例。示例主體代碼17適于PowerPC (PPC)型處理器 Subject code (PPC): 0x0001003c:... 0x00010040: add.r3, r3, 68 0x00010044: Id r3, 0(r3) 0x00010048:...示例PPC主體代碼將恒定值68添加到寄存器"r3,,中,然后, 從此地址加載到r3。用PPC帶點(diǎn)"與"(dotted add)指令來執(zhí)行 加法,該指令設(shè)置PPC條件字段寄存器的字段0中的標(biāo)記。萬一 發(fā)生加載錯(cuò)誤,那么,為了準(zhǔn)確地處理異常,應(yīng)該報(bào)告加載指令 (0x00010044)的程序計(jì)數(shù)器值,r3應(yīng)該包含執(zhí)行加法運(yùn)算之后的值, 條件字段0應(yīng)該更新。在進(jìn)行程序代碼轉(zhuǎn)換之后,產(chǎn)生了下面的示例目標(biāo)代碼21。在 此示例中,目標(biāo)代碼可由x86型處理器執(zhí)行Target code (x86) 0x40083200: mov 12(%ebp), %eax0x40083203: add $68, %eax0x40083206: mov (%eax), %ecx0x40083208: mov %ecx, 12(%ebp)目標(biāo)代碼將主體寄存器r3的值(在與ebp寄存器的偏移12 處找到,這里指向抽象寄存器組27)加載到寄存器eax中。目標(biāo)代 碼現(xiàn)在將68添加到eax,然后從此地址加載到ecx。最后,此結(jié)果 存儲回抽象寄存器組中的主體寄存器r3。在此示例中,恢復(fù)信息195的示范性實(shí)例是0x40083206:subj_addr=0x00010044,flags-crOlazylcmpO, register map=Dazyl(%eax), r3(%eax).目標(biāo)PC (0x40083206)用于索引恢復(fù)信息。在此情況下,目標(biāo) mov指令是潛在地發(fā)生錯(cuò)誤的主體加載指令的對等目標(biāo)指令。記錄了 精確的主體PC (0x00010044)。標(biāo)記用于表明,條件寄存器字段0需 要基于與叫做"lazyl,,的特殊主體寄存器中的零值的比較結(jié)果來加以 糾正。此外,恢復(fù)信息還表明,主體寄存器lazyl和r3的值位于目 標(biāo)寄存器eax中(由加法目標(biāo)指令0x40083203產(chǎn)生的值)。為了 進(jìn)行恢復(fù),來自eax的值將被溢出到適當(dāng)?shù)闹黧w寄存器中,現(xiàn)在可 以通過使用現(xiàn)在溢出到lazyl的值進(jìn)行適當(dāng)?shù)谋容^,來糾正條件字 段,并可以報(bào)告適當(dāng)?shù)腜C。總之,只有在需要的情況下,恢復(fù)信息才使工作得以執(zhí)行。即, 只有在發(fā)生異常時(shí)的異常情況下才執(zhí)行工作。大部分時(shí)間,在正常運(yùn) 行中,不需要準(zhǔn)確的主體狀態(tài),也不要進(jìn)行糾正。這里所討論的恢復(fù) 機(jī)制在生成的目標(biāo)代碼的正常執(zhí)行過程中可使工作#皮推遲,或根本不 執(zhí)行。結(jié)果,目標(biāo)代碼的正常執(zhí)行變得更快、更加有效率。然而,當(dāng) 發(fā)生異常時(shí),恢復(fù)信息195仍可使準(zhǔn)確的主體狀態(tài)得到糾正,以便 使異常得到準(zhǔn)確的處理。恢復(fù)工作在異常發(fā)生之后執(zhí)行,以便糾正準(zhǔn) 確的主體狀態(tài)?!?現(xiàn)在將就中斷的準(zhǔn)確的處理,比較詳細(xì)地對本發(fā)明的進(jìn)一步的優(yōu) 選方面進(jìn)行描述。中斷通常用于提供硬件設(shè)備支持。當(dāng)在處理器的外部硬件設(shè)備中 發(fā)生事件時(shí),發(fā)送一個(gè)信號,將事件通知給處理器。來自I/O設(shè)備 的數(shù)據(jù)的可用性是一個(gè)示例。外部設(shè)備中斷指令通過處理器的當(dāng)前流 動,以便調(diào)用例程來修復(fù)中斷。中斷的使用減輕了系統(tǒng)連續(xù)地輪詢設(shè) 備以查看它們是否需要維護(hù)的必要性。另一個(gè)示例是時(shí)鐘中斷,它們 可使用戶應(yīng)用程序以預(yù)先確定的間隔中斷,控制通常轉(zhuǎn)移到操作系 統(tǒng)。定期的中斷是在多任務(wù)處理系統(tǒng)中實(shí)施處理器資源共享的方便機(jī) 制。
中斷是異步異常,因?yàn)樗鼈儗ν獠吭O(shè)備中的事件作出反應(yīng),而不 是在處理器內(nèi)執(zhí)行特定指令。如此,中斷可以在指令流中的任意一點(diǎn) 發(fā)生。中斷與正在執(zhí)行的當(dāng)前指令流不相關(guān), 一旦異常得到糾正,就 恢復(fù)執(zhí)行。圖10顯示了說明中斷的處理的示例目標(biāo)代碼序列。目標(biāo)代碼塊21a包含指令TC1-TC6。在此示例中,當(dāng)處理器 正在執(zhí)行指令TC2時(shí)發(fā)生了中斷。當(dāng)前指令(TC2)的執(zhí)行完成。 此外,還執(zhí)行零個(gè)或多個(gè)額外指令(TC3),直到遇到與恢復(fù)信息195 關(guān)聯(lián)的對等目標(biāo)指令214 (在此情況下,指令TC4)。即,目標(biāo)代 碼指令的執(zhí)行向前滾動,直到能實(shí)現(xiàn)準(zhǔn)確的主體狀態(tài)的下一個(gè)點(diǎn)。當(dāng)處理器到達(dá)具有關(guān)聯(lián)的恢復(fù)信息195的下一個(gè)對等目標(biāo)指令 214時(shí),恢復(fù)信息被傳輸?shù)交謴?fù)處理器215,以便糾正準(zhǔn)確的主體狀 態(tài)。然后,準(zhǔn)確的主體狀態(tài)被傳輸?shù)竭m當(dāng)?shù)漠惓L幚砥?70,該異常 處理器270是主體中斷處理器比較適當(dāng)。圖11顯示了在目標(biāo)計(jì)算平臺內(nèi)處理中斷的三個(gè)首選實(shí)施方式。在第一個(gè)優(yōu)選實(shí)施例中,當(dāng)發(fā)生中斷型異常時(shí),調(diào)用目標(biāo)代碼解 釋器197。目標(biāo)代碼解釋器197逐個(gè)地執(zhí)行目標(biāo)代碼指令,直到到 達(dá)具有恢復(fù)信息195的對等指令214。在第二個(gè)實(shí)施例中,調(diào)用步進(jìn)處理器模式。即,控制目標(biāo)處理器 13,以進(jìn)入步進(jìn)處理器模式,該模式逐個(gè)地執(zhí)行目標(biāo)代碼指令,直到 到達(dá)對等指令214。在第三個(gè)優(yōu)選實(shí)施例中,調(diào)用檢查標(biāo)準(zhǔn),以逐個(gè)指令地執(zhí)行目標(biāo) 代碼,直到到達(dá)具有恢復(fù)信息195的對等指令214。如果在目標(biāo)代碼塊21a中沒有遇到易發(fā)生錯(cuò)誤的對等目標(biāo)指令 214,則適當(dāng)?shù)剡\(yùn)行到代碼塊的末尾。在優(yōu)選實(shí)施例中,在代碼塊邊 界糾正準(zhǔn)確的主體狀態(tài)。陷阱陷阱通常是用戶明確地并無條件地請求的異常。在主體指令引發(fā) 陷阱型異常的情況下,轉(zhuǎn)換器19為該指令生成目標(biāo)代碼,該代碼直
接執(zhí)行處理陷阱事件所需的行為。某些指令集體系結(jié)構(gòu)定義了需要進(jìn)一步的特殊處理的陷阱,如單個(gè)步進(jìn)陷阱和條件陷阱(例如,IA-32體系結(jié)構(gòu)中的INTO指令)。 優(yōu)選情況下,與如上文所討論的錯(cuò)誤類似地處理?xiàng)l件陷阱(為了不引 發(fā)異常,是常見的情況)。這樣,常見的情況中的工作被最小化。在 異常情況下,通過恢復(fù)處理器,調(diào)用所需的額外的工作。 中止中止通常是不可恢復(fù)的事件,但是,可以具有各種特征。中止通 常用于管理關(guān)鍵的系統(tǒng)故障。在檢測到硬件故障(如內(nèi)部處理器狀態(tài) 的不一致)或嚴(yán)重的軟件故障(如操作系統(tǒng)的臨界區(qū)域內(nèi)的故障)時(shí), 那么,處理器可能嘗試忽略錯(cuò)誤并繼續(xù)執(zhí)行,為安全起見停止或重新 啟動,也可以引發(fā)異常,以將錯(cuò)誤通知給操作系統(tǒng)。與錯(cuò)誤類似,中 止在指令內(nèi)發(fā)生。中止常常是最后的。中止通常不是用戶可屏蔽的。萬一在不希望發(fā)生錯(cuò)誤的指令的執(zhí)行過程中發(fā)生諸如機(jī)器校驗(yàn) 錯(cuò)誤之類的中止,則難以完全再現(xiàn)該中止指令中的準(zhǔn)確的主體狀態(tài)。 一般而言,在動態(tài)二進(jìn)制轉(zhuǎn)換的上下文中準(zhǔn)確地處理中止是非常昂貴 的。從上文的討論可以看出,這里所討論的異常處理機(jī)制具有許多優(yōu) 點(diǎn)。具體來說,只要可能,就從常見的情況中刪除工作,并只在程序 的典型的執(zhí)行過程中不經(jīng)常發(fā)生的異常情況下執(zhí)行。然而,當(dāng)需要時(shí), 取得準(zhǔn)確的主體狀態(tài)。此外,取得準(zhǔn)確的主體狀態(tài)的開銷也^L最小化。盡管已示出和描述了本發(fā)明的幾個(gè)優(yōu)選實(shí)施例,可以設(shè)想,本領(lǐng)的各種修改。 注意了與涉及本申請的本說明書同時(shí)或在本說明書之前提出的并且對外開放可以利用本說明書進(jìn)行公共的檢查的所有文件和文檔,這里引用了所有這樣的文件和文檔的內(nèi)容作為參考。本說明書(包括任何附帶的權(quán)利要求、摘要和附圖)中所說明的所有特征,和/或所說明的任何方法或進(jìn)程的所有步驟,可以以任何組
合方式進(jìn)行組合,但是,這樣的特征和/或步驟中的至少某些是互相排 斥的組合的情況除外。本說明書(包括任何附帶的權(quán)利要求、摘要和附圖)中所說明的 每一個(gè)特征可以替換為用于相同、等效的或類似的用途的備選特征, 除非明確地聲明不行。如此,除非明確地聲明,所說明的每一個(gè)特征 都只是等效的或類似的特征的一般性系列的一個(gè)示例。本發(fā)明不僅局限于前面的實(shí)施例的細(xì)節(jié)。本發(fā)明可以擴(kuò)展到本說 明書(包括任何所附帶的權(quán)利要求、摘要和附圖)中所說明的任何新 穎的特征,或任何新穎的特征的組合,或擴(kuò)展到所說明的任何方法或 進(jìn)程的任何新穎的步驟或任何新穎的步驟的組合。
權(quán)利要求
1.一種用于在從主體代碼(17)到目標(biāo)代碼(21)的程序代碼轉(zhuǎn)換過程中準(zhǔn)確地處理異常的方法,包括下列步驟(a)根據(jù)主體指令集體系結(jié)構(gòu),對可由主體處理器執(zhí)行的所述主體代碼(17)進(jìn)行解碼;(b)從所述主體代碼(17)生成目標(biāo)代碼(21);以及(c)根據(jù)目標(biāo)指令集體系結(jié)構(gòu),在目標(biāo)處理器(13)上執(zhí)行所述目標(biāo)代碼(21);其特征在于步驟(a)包括識別潛在地會在所述主體指令集體系結(jié)構(gòu)中發(fā)生錯(cuò)誤的易發(fā)生錯(cuò)誤的指令(174);步驟(b)包括從所述識別的易發(fā)生錯(cuò)誤的主體指令生成一個(gè)或多個(gè)對等目標(biāo)指令(214),并存儲與所述對等目標(biāo)指令(214)或每一個(gè)所述對等目標(biāo)指令(214)關(guān)聯(lián)的恢復(fù)信息(195);以及所述方法進(jìn)一步包括(d)當(dāng)在執(zhí)行所述對等目標(biāo)指令(214)或其中一個(gè)所述對等目標(biāo)指令(214)時(shí)指出發(fā)生了錯(cuò)誤時(shí),那么,執(zhí)行下列步驟(i)檢索與所述對等目標(biāo)指令(214)關(guān)聯(lián)的所述恢復(fù)信息(195);(ii)使用所述恢復(fù)信息(195),恢復(fù)準(zhǔn)確地代表發(fā)生錯(cuò)誤時(shí)所述主體處理器的準(zhǔn)確的主體狀態(tài);以及(iii)使用所述準(zhǔn)確的主體狀態(tài),準(zhǔn)確地處理所述錯(cuò)誤。
2. 根據(jù)權(quán)利要求1所述的方法,其中,生成所述目標(biāo)代碼(21) 的過程包括執(zhí)行一次或多次優(yōu)化,以及,其中,所述恢復(fù)信息(195)提 供涉及所述一次或多次優(yōu)化的信息。
3. 根據(jù)權(quán)利要求1所述的方法,其中,生成所述目標(biāo)代碼的過 程包括執(zhí)行一次或多次優(yōu)化,在所述一次或多次對等目標(biāo)指令(214) 中留下不準(zhǔn)確的主體狀態(tài),所述恢復(fù)信息(195)使得可以從所述可用的不準(zhǔn)確主體狀態(tài)獲得準(zhǔn)確的主體狀態(tài)。
4. 根據(jù)權(quán)利要求1所述的方法,其中,所述準(zhǔn)確的主體狀態(tài)至 少包括一個(gè)精確的主體程序計(jì)數(shù)器。
5. 根據(jù)權(quán)利要求1所述的方法,其中,所述準(zhǔn)確的主體狀態(tài)至 少包括代表所迷主體處理器的主體寄存器的精確的寄存器值。
6. 根據(jù)權(quán)利要求1所迷的方法,其中,存儲所迷恢復(fù)信息(195) 的過程包括緊隨在所述生成的目標(biāo)代碼(21)之后立即存儲所述恢復(fù) 信息(195)。
7. 根據(jù)權(quán)利要求6所述的方法,其中,檢索恢復(fù)信息(195)的 過程包括下列步驟對所述目標(biāo)代碼(21)進(jìn)行掃描以定位緊隨其后的所述恢復(fù)信 息(195);以及檢索與所述相應(yīng)的對等目標(biāo)指令(214)關(guān)聯(lián)的所述恢復(fù)信息 (195)。
8. 根據(jù)權(quán)利要求1所述的方法,包括 將所述主體代碼(17)劃分為多個(gè)代碼塊; 生成多個(gè)目標(biāo)代碼塊(21);以及存儲在所迷生成的目標(biāo)代碼塊(21)之間交織的恢復(fù)信息 (195)。
9. 根據(jù)權(quán)利要求1所述的方法,包括存儲將所述目標(biāo)代碼(21) 與所述恢復(fù)信息(195)分開的標(biāo)記(196),通過從指出錯(cuò)誤的所述對 等目標(biāo)指令(214)進(jìn)行掃描以定位標(biāo)記(196),然后從標(biāo)記(196)掃 描以定位所述關(guān)聯(lián)的恢復(fù)信息(195),來檢索所述恢復(fù)信息(195)。
10. 根據(jù)權(quán)利要求1所述的方法,包括存儲所述恢復(fù)信息 (195),所述恢復(fù)信息由表示所述關(guān)聯(lián)的對等目標(biāo)指令(214)的目標(biāo)程 序計(jì)數(shù)器索引。
11. 根據(jù)權(quán)利要求1所述的方法,其中,恢復(fù)所述準(zhǔn)確的主體 狀態(tài)的過程包括將所述檢索到的恢復(fù)信息(195)傳遞到恢復(fù)處理器 (215),獲取當(dāng)前可用的主體狀態(tài),以及使用所述恢復(fù)信息(195)修改 所迷當(dāng)前可用的主體狀態(tài),以提供所述準(zhǔn)確的主體狀態(tài)。
12. 根據(jù)權(quán)利要求1所述的方法,包括將所述恢復(fù)信息(195) 傳遞到恢復(fù)處理器(215),以及根據(jù)所述恢復(fù)信息(195),從所述恢復(fù) 處理器(215)調(diào)用一個(gè)或多個(gè)本機(jī)代碼恢復(fù)例程。
13. 根據(jù)權(quán)利要求1所述的方法,其中,所述恢復(fù)信息(195)包 括目標(biāo)程序計(jì)數(shù)器值(195a)和主體程序計(jì)數(shù)器值(195b)。
14. 根據(jù)權(quán)利要求13所述的方法,其中,所述恢復(fù)信息(195) 進(jìn)一步包括一組恢復(fù)指示符(195c),它們表示在對等目標(biāo)代碼指令的 附近未完成的優(yōu)化。
15. 根據(jù)權(quán)利要求13所述的方法,其中,所述恢復(fù)信息(195) 進(jìn)一步包括映射模板(195d),用于標(biāo)識目標(biāo)寄存器與對等目標(biāo)指令 (214)的附近適用的抽象主體寄存器的映射。
16. 根據(jù)權(quán)利要求1所述的方法,其中,所述恢復(fù)信息(195) 以壓縮的形式存儲。
17. 根據(jù)權(quán)利要求13所述的方法,其中,所迷恢復(fù)信息(195) 包括相對于以完整的程序計(jì)數(shù)器值作為基準(zhǔn)值存儲的一個(gè)目標(biāo)代碼 塊(21)的第一恢復(fù)信息項(xiàng)(195),以及一個(gè)或多個(gè)隨后的恢復(fù)信息 項(xiàng)(195),每一個(gè)恢復(fù)信息項(xiàng)都包括程序計(jì)數(shù)器值作為與基準(zhǔn)值的偏 移。
18. 根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括下列步驟 當(dāng)在目標(biāo)代碼(21)的執(zhí)行過程中,在所述目標(biāo)處理器(13)上接收到中斷信號時(shí),繼續(xù)執(zhí)行所述目標(biāo)代碼(21),直到遇到所述對等 目標(biāo)指令(214)或其中一個(gè)所述對等目標(biāo)指令(214);檢索與所述相應(yīng)的對等指令關(guān)聯(lián)的所迷恢復(fù)信息(195),并恢 復(fù)所述準(zhǔn)確的主體狀態(tài);使用所述準(zhǔn)確的主體狀態(tài),準(zhǔn)確地處理所述中斷。
19. 一種用于在從主體代碼(17)到目標(biāo)代碼(21)的程序代碼 轉(zhuǎn)換過程中準(zhǔn)確地處理異常的方法,所述方法包括下列步驟(a)將可由主體處理器執(zhí)行的所述主體代碼(17)轉(zhuǎn)換為可由目 標(biāo)處理器(13)執(zhí)行的目標(biāo)代碼(21);以及(b)在所述目標(biāo)處理器(13)上執(zhí)行所述目標(biāo)代碼(21); 其特征在于,步驟(a)進(jìn)一步包括(al)標(biāo)識所述主體代碼(17)中的易發(fā)生錯(cuò)誤的指令(174); (a2)生成一個(gè)或多個(gè)對等目標(biāo)代碼指令作為易發(fā)生錯(cuò)誤的主體 指令的對等物;(a3)存儲與所述對等目標(biāo)指令(214)或每一個(gè)所述對等目標(biāo)指 令(214)關(guān)聯(lián)的恢復(fù)信息(I95);以及 其中,步驟(b)進(jìn)一步包括(M)當(dāng)相對于所述對等目標(biāo)指令(214)或其中一個(gè)所述對等目 標(biāo)指令(214)發(fā)生異常時(shí),定位與所述發(fā)生錯(cuò)誤的對等目標(biāo)指令 (214)關(guān)聯(lián)的所述恢復(fù)信息(195);(b2)根據(jù)所述定位的恢復(fù)信息(195),執(zhí)行恢復(fù)例程,以糾正代 表所述主體處理器的準(zhǔn)確的主體狀態(tài);以及(b3)調(diào)用異常處理器以相對于經(jīng)過糾正的準(zhǔn)確的主體狀態(tài)處理 所述異常。
20. —種用于在從主體代碼(17)到目標(biāo)代碼(21)的程序代碼 轉(zhuǎn)換過程中準(zhǔn)確地處理異常的方法,其特征在于,包括下列步驟生成目標(biāo)代碼(21),包括對應(yīng)于所述主體代碼(17)中的潛在地 發(fā)生錯(cuò)誤的主體指令的至少一個(gè)對等目標(biāo)指令(214),并存儲與所述 至少一個(gè)對等目標(biāo)指令(214)關(guān)聯(lián)的恢復(fù)信息(195);在接收到中斷時(shí),繼續(xù)執(zhí)行目標(biāo)代碼指令,直到遇到所述至少一 個(gè)對等目標(biāo)指令(214);在到達(dá)所述對等目標(biāo)指令(214)時(shí),使用所述關(guān)聯(lián)的恢復(fù)信息 (195)恢復(fù)準(zhǔn)確的主體狀態(tài);以及使用所述已恢復(fù)的準(zhǔn)確的主體狀態(tài),準(zhǔn)確地處理所述中斷。
21. 根據(jù)權(quán)利要求20所述的方法,包括,在接收到所述中斷時(shí), 逐個(gè)地執(zhí)行所述目標(biāo)代碼指令。
22. 根據(jù)權(quán)利要求21所述的方法,包括在所述目標(biāo)處理器(13)中調(diào)用步進(jìn)模式,以逐個(gè)地執(zhí)行所述目標(biāo)指令。
23. 根據(jù)權(quán)利要求21所述的方法,包括調(diào)用目標(biāo)代碼解釋器 (197)以逐個(gè)地解釋所述目標(biāo)代碼指令。
24. —種用于在從主體代碼(17)到目標(biāo)代碼(21)的動態(tài)二進(jìn) 制轉(zhuǎn)換過程中準(zhǔn)確地處理異常的方法,包括下列步驟從主體代碼指令的序列生成目標(biāo)代碼指令的序列;以及執(zhí)行所述目標(biāo)代碼指令的序列;其特征在于當(dāng)發(fā)生異常時(shí),沿著目標(biāo)代碼指令的所述序列向前滾動,直到遇 到能實(shí)現(xiàn)準(zhǔn)確的主體狀態(tài)的目標(biāo)代碼指令;以及推遲所述異常的處理,直到能實(shí)現(xiàn)所述準(zhǔn)確的主體狀態(tài)。
25. —種用于執(zhí)行從主體代碼(17)到目標(biāo)代碼(21)的程序代 碼轉(zhuǎn)換的轉(zhuǎn)換器設(shè)備,包括轉(zhuǎn)換單元(19),具有解碼單元(19),用于根據(jù)主體指令集體系 結(jié)構(gòu),對可由主體處理器執(zhí)行的主體代碼(17)進(jìn)行解碼,并且還具 有目標(biāo)代碼生成單元(192),用于從所述主體代碼(17)生成目標(biāo)代 碼(21);以及根據(jù)目標(biāo)指令集體系結(jié)構(gòu)執(zhí)行所述目標(biāo)代碼(21)的目標(biāo)處理 器(13);其特征在于所述解碼單元(19)用于標(biāo)識在所述主體指令集體系結(jié)構(gòu)中潛 在地發(fā)生錯(cuò)誤的易發(fā)生錯(cuò)誤的指令(174);以及所述目標(biāo)代碼生成單元(192)用于從所述標(biāo)識的易發(fā)生錯(cuò)誤的 主體指令生成一個(gè)或多個(gè)對等目標(biāo)指令(214),并存儲與所述對等目 標(biāo)指令(214)或每一個(gè)所述對等目標(biāo)指令(214)關(guān)聯(lián)的恢復(fù)信息 (195);其中,所述設(shè)備進(jìn)一步包括恢復(fù)處理單元(215),當(dāng)在所述目標(biāo)處理器(13)中執(zhí)行所述對 等目標(biāo)指令(214)中的相應(yīng)的一個(gè)對等目標(biāo)指令(2")的過程指出錯(cuò)誤時(shí),檢索與所述一個(gè)或多個(gè)對等目標(biāo)指令(214)中的所述相應(yīng)的 一個(gè)對等目標(biāo)指令(214)關(guān)聯(lián)的所述恢復(fù)信息(195),并使用所述恢 復(fù)信息(195)恢復(fù)準(zhǔn)確的主體狀態(tài);以及異常處理單元(170),用于使用所述準(zhǔn)確的主體狀態(tài)準(zhǔn)確地處理錯(cuò)誤。
26. —種用于執(zhí)行從主體代碼(17)到目標(biāo)代碼(21)的程序代 碼轉(zhuǎn)換的轉(zhuǎn)換器設(shè)備,包括用于將可由主體處理器執(zhí)行的所述主體代碼(17)轉(zhuǎn)換為可由 目標(biāo)處理器(13)執(zhí)行的目標(biāo)代碼(21)的轉(zhuǎn)換器單元(19);以及執(zhí)行所迷目標(biāo)代碼(21)的目標(biāo)處理器(13);其特征在于轉(zhuǎn)換器單元(19)用于標(biāo)識所述主體代碼(17)中的易發(fā)生錯(cuò)誤 的指令(174),生成一個(gè)或多個(gè)對等目標(biāo)代碼指令作為所述易發(fā)生錯(cuò) 誤的主體指令的對等物,并存儲與所述對等目標(biāo)指令(214)或所述一 個(gè)或多個(gè)對等目標(biāo)指令(214)中的每一個(gè)對等目標(biāo)指令(214)關(guān)聯(lián) 的恢復(fù)信息(I95);以及所述目標(biāo)處理器(13)執(zhí)行所述目標(biāo)代碼(21)以^"更,當(dāng)相對于 所述一個(gè)或多個(gè)對等目標(biāo)指令(214)中的相應(yīng)的一個(gè)對等目標(biāo)指令 (214)發(fā)生異常時(shí),定位與所述相應(yīng)的對等目標(biāo)指令(214)關(guān)聯(lián)的所 述恢復(fù)信息(195),根據(jù)所述定位的恢復(fù)信息(195),執(zhí)行恢復(fù)例程, 以糾正代表所述主體處理器的準(zhǔn)確的主體狀態(tài),并調(diào)用異常處理器 (170)以相對于所述經(jīng)過糾正的準(zhǔn)確的主體狀態(tài)處理所述異常。
27 . —種用于執(zhí)行從主體代碼(17)到目標(biāo)代碼(21)的程序代 碼轉(zhuǎn)換的轉(zhuǎn)換器設(shè)備,包括用于將可由主體處理器執(zhí)行的所述主體代碼(17)轉(zhuǎn)換為可由 目標(biāo)處理器(13)執(zhí)行的目標(biāo)代碼(21)的轉(zhuǎn)換器單元(19);以及執(zhí)行所述目標(biāo)代碼(21)的目標(biāo)處理器(13);其特征在于所述轉(zhuǎn)換器單元(19)用于生成所述目標(biāo)代碼(21),包括對應(yīng)于所述主體代碼(17)中的潛在地發(fā)生錯(cuò)誤的主體指令的至少一個(gè)對等 目標(biāo)指令(214),并存儲與所述至少一個(gè)對等目標(biāo)指令(214)關(guān)聯(lián)的恢復(fù)信息(l95),以及所述目標(biāo)處理器(13)用于執(zhí)行所迷目標(biāo)代碼(21),使得在接收 到中斷時(shí),繼續(xù)執(zhí)行目標(biāo)代碼指令,直到遇到所述至少一個(gè)對等目標(biāo) 指令(214);其中,所迷設(shè)備進(jìn)一步包括恢復(fù)處理器,當(dāng)由所述目標(biāo)處理器(13)遇到所述至少一個(gè)對等 目標(biāo)指令(214)時(shí),使用所述關(guān)聯(lián)的恢復(fù)信息(19S)恢復(fù)準(zhǔn)確的主 體狀態(tài),以及經(jīng)過轉(zhuǎn)換的主體異常處理器(270),用于使用所述已恢復(fù)的準(zhǔn)確 的主體狀態(tài),處理所述中斷。
28. —種用于執(zhí)行從主體代碼(17)到目標(biāo)代碼(21)的程序代碼 轉(zhuǎn)換的轉(zhuǎn)換器設(shè)備,包括用于從主體代碼指令的序列生成目標(biāo)代碼指令的序列的轉(zhuǎn)換器 單元(19);以及執(zhí)行所述目標(biāo)代碼指令的序列的目標(biāo)處理器(13); 其特征在于目標(biāo)處理器(13)用于執(zhí)行所述目標(biāo)代碼指令的序列,使得當(dāng)發(fā) 生異常時(shí),沿著目標(biāo)代碼指令的所述序列向前滾動,直到遇到能實(shí)現(xiàn) 準(zhǔn)確的主體狀態(tài)的目標(biāo)代碼指令,于是,調(diào)用異常處理器(170),以 使用所述準(zhǔn)確的主體狀態(tài),對所述異常進(jìn)行處理。
29. —種計(jì)算機(jī)可讀介質(zhì),在上面記錄了可由計(jì)算機(jī)實(shí)現(xiàn)的指令 以便執(zhí)行權(quán)利要求1到24中的任何一個(gè)權(quán)利要求所述的方法。
全文摘要
準(zhǔn)確的異常處理依賴于準(zhǔn)確的主體狀態(tài),包括精確的程序計(jì)數(shù)器和主體處理器的寄存器值。主體代碼(17)被轉(zhuǎn)換成可由目標(biāo)處理器(13)執(zhí)行的目標(biāo)代碼(21)。生成的目標(biāo)代碼(17)包括與易發(fā)生錯(cuò)誤的主體代碼指令(174)關(guān)聯(lián)的對等目標(biāo)指令(214)。此外,每一個(gè)對等目標(biāo)代碼指令(214)都與恢復(fù)信息(195)關(guān)聯(lián)。當(dāng)發(fā)生異常(例如,錯(cuò)誤)時(shí),檢索恢復(fù)信息(195),并將其用于恢復(fù)準(zhǔn)確的主體狀態(tài),具體來說,通過考慮優(yōu)化以生成共同的目標(biāo)常見的情況的目標(biāo)代碼(21)。然后,使用準(zhǔn)確的主體狀態(tài)來準(zhǔn)確地處理異常。
文檔編號G06F9/318GK101164041SQ200680013311
公開日2008年4月16日 申請日期2006年4月7日 優(yōu)先權(quán)日2005年4月20日
發(fā)明者萬奇曼, 加文·巴勒克拉夫, 阿貝杜爾·R·胡梅達(dá) 申請人:可遞有限公司