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