專利名稱:用于高級(jí)微處理器的門控存儲(chǔ)緩沖器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)系統(tǒng),特別是涉及與主微處理器一起控制存儲(chǔ)器存儲(chǔ)操作的門控存儲(chǔ)緩沖器,主微處理器執(zhí)行從為不同處理器的執(zhí)行而設(shè)計(jì)的程序翻譯過來的程序。
背景技術(shù):
在計(jì)算機(jī)上運(yùn)行著成千上萬針對(duì)特定微處理器系列設(shè)計(jì)的應(yīng)用程序。其中為利用“X86”系列微處理器(包括Intel8088、Intel 8086、Intel 80186 Intel80286、i386、i486以及隨后發(fā)展的各種奔騰系列微處理器,它們都是由位于加州Santa Clara的Intel公司設(shè)計(jì)和制造)的計(jì)算機(jī)(通常稱為“IBM兼容個(gè)人電腦”)而設(shè)計(jì)的程序數(shù)量最多。還有許多其他的程序設(shè)計(jì)來使來用其它系列處理器的計(jì)算機(jī)運(yùn)轉(zhuǎn)。由于運(yùn)行在這些計(jì)算機(jī)上的應(yīng)用程序非常多,所以能夠?yàn)檫@類計(jì)算機(jī)(特別是為處理X86程序而設(shè)計(jì)的計(jì)算機(jī))所用的微處理器擁有巨大的市場(chǎng)。微處理器市場(chǎng)不僅容量巨大而且獲利豐厚。
雖然能夠運(yùn)行大量應(yīng)用程序的微處理器市場(chǎng)容量巨大而且獲利豐厚,但是設(shè)計(jì)新的有競(jìng)爭(zhēng)力的微處理器卻不那么容易。例如,雖然X86系列的微處理器已經(jīng)問世多年并且在大多數(shù)銷售和使用的計(jì)算機(jī)內(nèi)都包含這些處理器,但是也只有少數(shù)成功的有競(jìng)爭(zhēng)力的微處理器者能夠運(yùn)行X86程序。其中的原因是多方面的。
為了取得成功,微處理器必須能在不高于現(xiàn)有微處理器開銷的前提下,與現(xiàn)有處理器一樣快地運(yùn)行針對(duì)現(xiàn)有系列處理器設(shè)計(jì)的所有程序(包括操作系統(tǒng)和已有程序)。此外,為了在經(jīng)濟(jì)上取得成功,新的微處理器必須至少在某一方面勝過現(xiàn)有的處理器,從而使買主有先于現(xiàn)有經(jīng)考慮的處理器而選購(gòu)新微處理器的理由。
要做到使微處理器運(yùn)行速度與現(xiàn)有微處理器一樣快是困難和昂貴的。處理器通過諸如加載、移位、相加、存儲(chǔ)和類似的低層次操作之類的基本操作執(zhí)行指令并且在執(zhí)行應(yīng)用程序提供的任何指令時(shí)僅僅響應(yīng)這類基本操作。例如在諸如X86之類為運(yùn)行復(fù)雜指令集計(jì)算機(jī)(CSIC)的指令而設(shè)計(jì)的處理器中,指令可能指定待進(jìn)行的過程具有較高的級(jí)別,該處理器包含存儲(chǔ)所謂微指令的只讀存儲(chǔ)器(ROM)。每條微指令包含一串基本指令,依照順序執(zhí)行這些基本指令將得到高級(jí)CISC指令所命令的結(jié)果。典型的“A加B”CISC指令經(jīng)過譯碼后形成在ROM內(nèi)查找地址,執(zhí)行“A加B”指令功能的微指令就存儲(chǔ)在ROM內(nèi)。加載微指令后,按照順序執(zhí)行其基本指令,從而完成“A加B”指令的執(zhí)行。在這類CSIC計(jì)算機(jī)中,微指令內(nèi)的基本操作在程序執(zhí)行過程中絕對(duì)不可能發(fā)生變化。每條CISC指令只能通過指令譯碼、尋址和讀取微指令以及按照微指令提供的順序運(yùn)行基本操作序列完成運(yùn)行過程。每次運(yùn)行微指令時(shí)都必須遵循同一順序。
運(yùn)行X86應(yīng)用程序的目前水平的處理器利用大量的技術(shù),以在合理的性價(jià)比前提下提供最快的處理速度。任何采用已知硬件技術(shù)提高處理器速度的新處理器都必然會(huì)增加處理硬件的復(fù)雜度。這增加了硬件成本。
例如超標(biāo)量微處理器(superscalar),為了同時(shí)執(zhí)行兩個(gè)或更多的操作,它使用多條處理通道,對(duì)此需要一系列額外的要求。在最底層級(jí)別上,簡(jiǎn)單的超標(biāo)量微處理器將每條應(yīng)用指令譯碼為執(zhí)行應(yīng)用指令功能的微指令。隨后,如果兩條微指令不需要相同的硬件資源并且一條微指令的執(zhí)行不依賴于待處理的另一條微指令的結(jié)果,則簡(jiǎn)單超標(biāo)量微處理器將這兩條微指令安排為同時(shí)執(zhí)行。
更加高級(jí)的超標(biāo)量微處理器一般將每條應(yīng)用指令譯碼為一系列的基本指令,從而以最有效率的執(zhí)行次序重新排序和安排這些基本指令的執(zhí)行。這需要每條基本操作都能單獨(dú)尋址和存取。為了完成重新排序,處理器必須確保需要其它基本指令產(chǎn)生數(shù)據(jù)的基本指令在其他指令產(chǎn)生所需數(shù)據(jù)之后執(zhí)行。這類超標(biāo)量微處理器必須確保同時(shí)執(zhí)行的兩條基本指令不需要使用同一硬件資源。而且還必須在完成轉(zhuǎn)移操作之前解決條件轉(zhuǎn)移。
因此超標(biāo)量微處理器需要大量的硬件來比較基本指令之間的相互關(guān)系,重新排序和安排執(zhí)行任何指令的基本指令的順序。隨著處理通道數(shù)的增加,完成這些超標(biāo)量加速技術(shù)的硬件數(shù)量和成本將以二次方的速度增加。所有這些硬件需求都增加所涉及電路系統(tǒng)的復(fù)雜性和成本。在處理微指令過程中,當(dāng)每次執(zhí)行一條應(yīng)用指令時(shí),超標(biāo)量微處理器都必須使用比較復(fù)雜的尋址和讀取硬件來讀取每條基本指令,都必須根據(jù)其它基本指令和硬件使用狀態(tài)重新排序和重新安排這些基本指令,并且隨后還必須執(zhí)行所有重新安排后的基本指令。由于每次執(zhí)行一條應(yīng)用指令時(shí)都必須通過整個(gè)硬件序列,所以限制了超標(biāo)量處理器能夠執(zhí)行指令的速度。
即使利用各種硬件技術(shù)提高了處理速度,由此帶來的硬件復(fù)雜性也大大增加了這類微處理器的成本。例如,Intel i486 DX4處理器采用大約150萬個(gè)晶體管。但是如果要在諸如Intel奔騰之類的基本超標(biāo)量處理器中通過增加硬件來利用兩條通道完成指令處理所需的依存度檢查和執(zhí)行安排,則需要300多萬個(gè)晶體管。在Intel Pentium ProTM微處理器中,為了能重新排序源自不同目標(biāo)指令的基本指令,提供預(yù)測(cè)執(zhí)行,完成寄存器更名和提供轉(zhuǎn)移預(yù)測(cè),增加到超過600多萬個(gè)晶體管。由此可見,為提高運(yùn)算速度而增加硬件已使最新的目前水平的代微處理器的晶體管數(shù)量出乎尋常地增加。
即使采用這些已知的技術(shù),但是由于現(xiàn)有微處理器制造商已經(jīng)采用了絕大部分經(jīng)濟(jì)可行的技術(shù)來提高現(xiàn)有微處理器的運(yùn)行速度,所以也不可能制造出更快的微處理器。這樣,設(shè)計(jì)更快的處理器就成了一項(xiàng)非常困難和費(fèi)錢的工作。
降低處理器成本也是非常困難的。如上所述,制造具有足夠能力處理器的硬件加速技術(shù)非常昂貴。如果要設(shè)計(jì)一種新的處理器,必須擁有生產(chǎn)硬件的設(shè)備。由于芯片制造商一般不會(huì)投資小批量器件,所以難以獲得這類設(shè)備。生產(chǎn)芯片制造設(shè)備所需的資本投資如此巨大,以致于超出了大多數(shù)公司力所能及的范圍。
即使設(shè)計(jì)出的新處理器能夠至少以競(jìng)爭(zhēng)處理器同樣快的速度運(yùn)行所有針對(duì)處理器系列設(shè)計(jì)的應(yīng)用程序,競(jìng)爭(zhēng)處理器在價(jià)格中也包含了足夠的利潤(rùn),從而確保其能面對(duì)競(jìng)爭(zhēng)對(duì)手作大幅度削價(jià)。
雖然通過增加硬件復(fù)雜度來設(shè)計(jì)富有競(jìng)爭(zhēng)力的處理器是非常困難的,但是可以有另一種運(yùn)行針對(duì)某一特定系列微處理器(目標(biāo)微處理器)設(shè)計(jì)的應(yīng)用程序(目標(biāo)應(yīng)用程序)的方法,它在另一種更快的微處理器(主微處理器)上用軟件仿真目標(biāo)微處理器。由于這僅僅需要增加一定形式的仿真軟件以在更快的微處理器上運(yùn)行應(yīng)用程序,所以是一種成本日趨低廉的方法。仿真器軟件將針對(duì)目標(biāo)處理器系列編寫的應(yīng)用程序目標(biāo)指令改寫為能夠被主微處理器執(zhí)行的主指令(hostinstruction)。隨后這些被改寫的指令在較快主微處理器上操作系統(tǒng)的控制下運(yùn)行。
有許多種不同的設(shè)計(jì)可以使目標(biāo)應(yīng)用程序運(yùn)行在處理器速度快于目標(biāo)計(jì)算機(jī)處理器的主計(jì)算機(jī)上。由于從理論上講,精簡(jiǎn)指令集(RISC)微處理器更為簡(jiǎn)單而且速度較其它類型處理器更快,所以利用仿真軟件執(zhí)行目標(biāo)程序的主計(jì)算機(jī)都采用RISC微處理器。
但是即使利用仿真器軟件的RISC計(jì)算機(jī)系統(tǒng)經(jīng)常能夠運(yùn)行X86(或其它)程序,它們的運(yùn)行速度通常也明顯慢于X86計(jì)算機(jī)系統(tǒng)運(yùn)行同一程序的速度。而且這些仿真器程序常常無法運(yùn)行所有或大量現(xiàn)有的目標(biāo)程序。
仿真器程序無法象目標(biāo)微處理器那樣快地運(yùn)行目標(biāo)程序的原因相當(dāng)復(fù)雜并且需要對(duì)不同的仿真操作有所了解。
圖1包括一系列的示意圖,它們表示多種不同類型微處理器執(zhí)行目標(biāo)應(yīng)用程序的不同的方式。
在圖1(a)中,示出諸如Intel X86微處理器之類的典型CISC微處理器運(yùn)行目標(biāo)應(yīng)用程序該目標(biāo)應(yīng)用程序?yàn)槟繕?biāo)微處理器運(yùn)行而設(shè)計(jì)。如圖所示,應(yīng)用程序運(yùn)行在利用CISC操作系統(tǒng)(例如X86計(jì)算機(jī)使用的MS DOS、Windows 3.1、Windows NT和OS/2)的CISC處理器上,這些操作系統(tǒng)設(shè)計(jì)成提供訪問計(jì)算機(jī)硬件的接口。典型情況是選擇應(yīng)用程序的指令,只通過操作系統(tǒng)提供的訪問使用計(jì)算機(jī)設(shè)備。因此操作系統(tǒng)處理允許應(yīng)用程序訪問計(jì)算機(jī)存儲(chǔ)器和各種輸入/輸出設(shè)備的操作。目標(biāo)計(jì)算機(jī)包含操作系統(tǒng)能夠識(shí)別的存儲(chǔ)器和硬件,并且目標(biāo)應(yīng)用程序?qū)Σ僮飨到y(tǒng)的調(diào)用使操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序在目標(biāo)計(jì)算機(jī)定義的設(shè)備上產(chǎn)生預(yù)期的操作。應(yīng)用程序的指令在處理器上執(zhí)行,它們被變換為可以被處理器執(zhí)行的操作,這些操作由微代碼或匯編為微代碼的更加基本的操作具體實(shí)現(xiàn)。如上所述,每次執(zhí)行復(fù)雜的目標(biāo)指令時(shí),指令都調(diào)用以微代碼(或同一基本操作組)形式存儲(chǔ)的同一子程序??偸菆?zhí)行同一子程序。如果處理器是超標(biāo)量的,則執(zhí)行目標(biāo)指令的這些基本操作常常可以被處理器以上述方式,利用各種處理通道進(jìn)行重新排序、重新安排和執(zhí)行;但是子程序仍然被讀取和執(zhí)行。
在圖1(b)中,諸如用于蘋果Macintosh計(jì)算機(jī)中的PowerPC之類的典型RISC微處理器運(yùn)行著同一目標(biāo)應(yīng)用程序該目標(biāo)應(yīng)用程序是針對(duì)圖1(a)CISC處理器運(yùn)行而設(shè)計(jì)的。如圖所示,目標(biāo)應(yīng)用程序運(yùn)行于采用至少一部分目標(biāo)操作系統(tǒng)的主處理器以響應(yīng)目標(biāo)應(yīng)用程序產(chǎn)生的一部分調(diào)用。典型的是對(duì)目標(biāo)操作系統(tǒng)應(yīng)用類部分的調(diào)用,用來在顯示器上提供圖形接口和通常是應(yīng)用類程序的小型實(shí)用程序。目標(biāo)應(yīng)用程序和目標(biāo)操作系統(tǒng)的這些部分由諸如SoftPC之類的軟件仿真器變換,它將目標(biāo)應(yīng)用程序和應(yīng)用類目標(biāo)操作系統(tǒng)配備的指令分解為主處理器及其主操作系統(tǒng)能夠執(zhí)行的指令。主操作系統(tǒng)提供了訪問RISC計(jì)算機(jī)的存儲(chǔ)器和輸入/輸出硬件的接口。
但是主RISC處理器及在RISC計(jì)算機(jī)中與其相關(guān)的硬件設(shè)備通常與這樣一些設(shè)備有相當(dāng)大的差異,它們與針對(duì)目標(biāo)應(yīng)用程序而設(shè)計(jì)的處理器相關(guān);并且目標(biāo)應(yīng)用程序提供的各種指令被設(shè)計(jì)為使目標(biāo)操作系統(tǒng)的設(shè)備驅(qū)動(dòng)程序在訪問目標(biāo)計(jì)算機(jī)各部分時(shí)協(xié)同工作。因此對(duì)于將目標(biāo)應(yīng)用程序指令變換為主操作系統(tǒng)能夠利用的基本主指令的仿真程序而言,它必須在某種程度上將為操縱目標(biāo)計(jì)算機(jī)內(nèi)硬件設(shè)備而設(shè)計(jì)的操作與主系統(tǒng)硬件設(shè)備能夠?qū)崿F(xiàn)的操作聯(lián)系起來。由于目標(biāo)設(shè)備并不等同于主計(jì)算機(jī)的設(shè)備,所以通常需要由仿真器軟件產(chǎn)生響應(yīng)目標(biāo)應(yīng)用程序指令的虛擬設(shè)備來完成主系統(tǒng)無法實(shí)現(xiàn)的操作。有時(shí)候需要仿真器產(chǎn)生從這些虛擬設(shè)備通過主操作系統(tǒng)至主硬件設(shè)備的鏈接,這些主硬件設(shè)備雖然是真實(shí)存在,但是要由主操作系統(tǒng)按照不同的方式尋址。
由于眾多的原因,以這種方式執(zhí)行的目標(biāo)程序速度較慢。首先,來自目標(biāo)應(yīng)用程序和目標(biāo)操作系統(tǒng)的每條目標(biāo)指令都必須由仿真器變換為主處理器使用的主基本功能。如果目標(biāo)應(yīng)用程序是針對(duì)諸如X86之類的CSIC機(jī)而設(shè)計(jì)的,則目標(biāo)指令是長(zhǎng)度可變的并且相當(dāng)復(fù)雜的,因此將它們變換為主基本指令就相當(dāng)費(fèi)事。首先對(duì)源目標(biāo)指令譯碼,并確定構(gòu)成目標(biāo)指令的基本主指令序列。隨后確定每串基本主指令序列的地址,讀取每串基本主指令序列,并按照順序或者不按照順序執(zhí)行這些基本主指令。每次執(zhí)行指令時(shí)都必須由仿真器將目標(biāo)應(yīng)用程序和操作系統(tǒng)指令變換為主處理器理解的主指令,這需要大量額外的步驟,因此減慢了仿真處理的速度。
其次,許多目標(biāo)指令包括由特定硬件設(shè)備實(shí)施的操作的基準(zhǔn),這些特定硬件設(shè)備在目標(biāo)計(jì)算機(jī),硬件中起著特殊的作用,但在主計(jì)算機(jī)中卻不存在。為了執(zhí)行該類操作,仿真軟件必須通過已有的主操作系統(tǒng)與主計(jì)算機(jī)的硬件設(shè)備實(shí)現(xiàn)軟件連接或者配備虛擬硬件設(shè)備。用軟件仿真另一種計(jì)算機(jī)硬件是非常困難的。仿真軟件必須對(duì)主操作系統(tǒng)的每一個(gè)目標(biāo)應(yīng)用程序的調(diào)用產(chǎn)生虛擬設(shè)備;并且每一虛擬設(shè)備都必須向?qū)嶋H主設(shè)備提供調(diào)用。硬件設(shè)備仿真要求當(dāng)目標(biāo)指令使用設(shè)備時(shí)從存儲(chǔ)器中讀取表示指令所需虛擬設(shè)備的代碼并進(jìn)行運(yùn)行以實(shí)現(xiàn)設(shè)備功能。解決問題的這些方法中的每一個(gè)在執(zhí)行指令序列時(shí)都額外增加了一系列的操作。
仿真問題的復(fù)雜化是目標(biāo)應(yīng)用要解決各種意外事件的結(jié)果,為了使計(jì)算機(jī)系統(tǒng)運(yùn)行,目標(biāo)計(jì)算機(jī)的硬件和目標(biāo)操作系統(tǒng)要對(duì)這些意外事件作出處理。當(dāng)處理目標(biāo)計(jì)算機(jī)運(yùn)行期間的意外事件時(shí),一般必須通過調(diào)用微代碼序列以完成保存發(fā)生意外事件時(shí)刻計(jì)算機(jī)狀態(tài)的操作,必須檢索正確的意外事件處理器(handle),必須處理發(fā)生意外事件,并且必須找到程序繼續(xù)運(yùn)行下去的正確入口。有時(shí)候這要求程序返回至目標(biāo)計(jì)算機(jī)在發(fā)生意事件處的狀態(tài),而其它時(shí)候進(jìn)入意外事件處理器提供的轉(zhuǎn)移。在任一情況下,都必須在某種程度上對(duì)完成這些操作所需的目標(biāo)計(jì)算機(jī)硬件和軟件進(jìn)行仿真處理。由于必須在發(fā)生此類意外事件時(shí)可以得到正確的目標(biāo)狀態(tài)以供適當(dāng)執(zhí)行,仿真器必須始終精確跟蹤該狀態(tài)以準(zhǔn)確響應(yīng)這些意外事件。在現(xiàn)有技術(shù)中,這要求每條指令的執(zhí)行必須按照目標(biāo)應(yīng)用程序提供的順序,因?yàn)橹挥羞@種方式能夠保持正確的目標(biāo)狀態(tài)。
而且現(xiàn)有技術(shù)的仿真器出于其它原因,總是需要保持目標(biāo)應(yīng)用程序的執(zhí)行順序。目標(biāo)指令可以有兩種,一種影響存儲(chǔ)器另一種影響存儲(chǔ)器映象的輸入/輸出(I/O)設(shè)備。如果不試驗(yàn)著執(zhí)行指令是無法知道操作是影響存儲(chǔ)器還是存儲(chǔ)器映象I/O設(shè)備的。當(dāng)指令在存儲(chǔ)器上運(yùn)行時(shí),可以作優(yōu)化和重新排序并且這大大有助于提高系統(tǒng)運(yùn)行速度。但是作用于I/O設(shè)備的操作常常必須按照精確的順序進(jìn)行,這些操作必須按照該順序編程而不能省略任何步驟,否則可能對(duì)I/O設(shè)備的操作產(chǎn)生一些不利的影響。例如特殊的I/O操作可能會(huì)清除I/O寄存器的內(nèi)容。如果操作不按照順序進(jìn)行從而清除了寄存器內(nèi)仍然需要的值,則操作結(jié)果可能不同于目標(biāo)指令所命令的那樣。如果沒有區(qū)分存儲(chǔ)器和存儲(chǔ)器映象I/O的裝置,就需要將所有的指令都象處理作用于存儲(chǔ)器映象I/O的指令那樣處理。這大大限制了優(yōu)化所能達(dá)到的性能。由于現(xiàn)有技術(shù)的仿真器缺少檢測(cè)被尋址存儲(chǔ)器性質(zhì)的裝置和從這類故障恢復(fù)的裝置,所以需要順序處理目標(biāo)指令,就好象每條指令都作用于存儲(chǔ)器映象I/O那樣。這極大地制約了主指令的優(yōu)化的可能性。
另一個(gè)限制現(xiàn)有技術(shù)仿真器優(yōu)化主代碼能力的問題源于自修改代碼。如果目標(biāo)指令被變換為主指令序列,而主指令序列又接著寫回以改變了源目標(biāo)指令,則主指令不再有效。結(jié)果仿真器必須不斷地作檢驗(yàn)以確定目標(biāo)代碼區(qū)域是否有存儲(chǔ)。所有這些問題都使這種類型的仿真比在目標(biāo)處理器上運(yùn)行目標(biāo)應(yīng)用程序慢得多。
圖1(b)所示另一種類型的仿真軟件實(shí)例在題為“Talisman快速而精確的多計(jì)算機(jī)模擬”(R.C.Bedichek,麻省理工學(xué)院計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室)的文章中有所論述。這是更為完整的轉(zhuǎn)換實(shí)例,它可以仿真完整的研究系統(tǒng)并運(yùn)行研究目標(biāo)操作系統(tǒng)。Talisman采用主UNIX操作系統(tǒng)。
在圖1(c)中示出了另一種仿真實(shí)例。在該實(shí)例中,用于蘋果Macintosh計(jì)算機(jī)的PowerPC微處理器運(yùn)行針對(duì)莫托羅拉68000系列CISC處理器設(shè)計(jì)的目標(biāo)應(yīng)用程序,后者用于早期的Macintosh計(jì)算機(jī);這樣做的目的是為了使蘋果原有的程序能夠在帶RISC處理器的Macintosh計(jì)算機(jī)上運(yùn)行。顯而易見,目標(biāo)應(yīng)用程序使用至少部分目標(biāo)操作系統(tǒng)運(yùn)行于主處理器上以響應(yīng)目標(biāo)操作系統(tǒng)應(yīng)用類部分。軟件仿真器將目標(biāo)應(yīng)用程序和應(yīng)用類目標(biāo)操作系統(tǒng)程序配備的指令分解為主處理器及其主操作系統(tǒng)能夠執(zhí)行的指令。主操作系統(tǒng)提供了訪問主計(jì)算機(jī)的存儲(chǔ)器和輸入/輸出硬件的接口。
但是主RISC處理器及在主RISC計(jì)算機(jī)中與其相關(guān)的設(shè)備與配備莫托羅拉CISC處理器的設(shè)備有相當(dāng)大的差異;并且將各種目標(biāo)指令設(shè)計(jì)成為在訪問目標(biāo)計(jì)算機(jī)各部分時(shí)與目標(biāo)CSIC操作系統(tǒng)協(xié)同工作。因此仿真程序必須將操縱目標(biāo)計(jì)算機(jī)內(nèi)硬件設(shè)備的操作與主系統(tǒng)硬件設(shè)備能夠?qū)崿F(xiàn)的操作聯(lián)系起來。這需要由仿真器產(chǎn)生響應(yīng)目標(biāo)應(yīng)用程序指令的軟件虛擬設(shè)備并產(chǎn)生從這些虛擬設(shè)備通過主操作系統(tǒng)至主硬件設(shè)備的鏈接,這些主硬件設(shè)備雖然是真實(shí)存在,但是要由主操作系統(tǒng)按照不同的方式尋址。
由于與圖1(b)仿真運(yùn)行得慢的同樣的原因,以這種方式運(yùn)行的目標(biāo)程序運(yùn)行速度較慢。首先,來自目標(biāo)應(yīng)用程序和目標(biāo)操作系統(tǒng)的每條目標(biāo)指令都必須經(jīng)過指令讀取才能變換;并且每次執(zhí)行指令時(shí)從該指令導(dǎo)出的所有主基本功能都必須按照順序運(yùn)行。其次,仿真軟件必須產(chǎn)生每個(gè)目標(biāo)應(yīng)用程序調(diào)用主操作系統(tǒng)的虛擬設(shè)備;并且每一虛擬設(shè)備都必須向?qū)嶋H主設(shè)備提供調(diào)用。第三,仿真器必須象處理直接作用于存儲(chǔ)器映象I/O設(shè)備的指令那樣保守地處理所有指令,否則就有發(fā)生無法恢復(fù)的意外事件的危險(xiǎn)。最后,仿真器必須始終保持正確的目標(biāo)狀態(tài)并總是要在確定是否存儲(chǔ)目標(biāo)代碼區(qū)域之前檢查存儲(chǔ)操作。所有這些要求都削弱了仿真器對(duì)運(yùn)行在主處理器上代碼作重大優(yōu)化的能力并且使這種仿真的速度遠(yuǎn)遠(yuǎn)慢于目標(biāo)應(yīng)用程序在目標(biāo)處理器上的運(yùn)行速度。認(rèn)為仿真速度低于現(xiàn)有處理器的四分之一是很好的。通常情況下,這種仿真軟件在能夠運(yùn)行為另一種處理器設(shè)計(jì)的應(yīng)用程序的能力只是有用而非基本用途的情況下,很難找到它的使用價(jià)值。
在圖1(d)中示出一種在主處理器上仿真目標(biāo)應(yīng)用程序的特殊方法,它為非常少數(shù)的一系列目標(biāo)應(yīng)用程序提供了較好的性能。目標(biāo)應(yīng)用程序?yàn)榉抡嫫魈峁┲噶睿摲抡嫫鲗⑦@些指令變換為主處理器和主操作系統(tǒng)的指令。主處理器為數(shù)字設(shè)備公司的Alpha RISC處理器,而主操作系統(tǒng)為微軟的NT??梢栽谶@種系統(tǒng)上運(yùn)行的唯一的目標(biāo)應(yīng)用程序是為采用Windows WIN32s兼容操作系統(tǒng)的目標(biāo)X86處理器而設(shè)計(jì)的32位應(yīng)用程序。由于主操作系統(tǒng)和目標(biāo)操作系統(tǒng)幾乎是相同的,它們?cè)O(shè)計(jì)成處理相同的指令,所以仿真器軟件可以非常方便地變換指令。而且主操作系統(tǒng)也已設(shè)計(jì)為響應(yīng)目標(biāo)應(yīng)用程序產(chǎn)生的相同調(diào)用,所以產(chǎn)生虛擬設(shè)備的數(shù)量大大減少。
雖然在技術(shù)上它是一種使目標(biāo)應(yīng)用程序運(yùn)行于主處理器上的仿真系統(tǒng),但卻是一種非常特殊的情況。在這種情況下仿真軟件運(yùn)行于已經(jīng)為運(yùn)行相似應(yīng)用程序而設(shè)計(jì)好的主操作系統(tǒng)上。它使得來自目標(biāo)應(yīng)用程序的調(diào)用能夠更為簡(jiǎn)單地指向主處理器和主操作系統(tǒng)的正確的設(shè)備。更為重要的是,該系統(tǒng)只能運(yùn)行32位Windows應(yīng)用程序,其在所有X86應(yīng)用程序中所占的數(shù)量不到1%。而且該系統(tǒng)只能在一種操作系統(tǒng)上,即Windows NT上運(yùn)行應(yīng)用程序;而X86處理器可運(yùn)行針對(duì)大量操作系統(tǒng)而設(shè)計(jì)的應(yīng)用程序。因此就本說明書前面所表述的含義而言,這樣的系統(tǒng)不具備兼容性。因此運(yùn)行這類仿真器的處理器是不能認(rèn)為是富有競(jìng)爭(zhēng)力的X86處理器。
在圖1(e)中示出另一種仿真方法,它利用軟件在識(shí)別不同指令集的計(jì)算機(jī)上運(yùn)行為第一指令集編寫的應(yīng)用程序部分。這種形式的仿真軟件一般由程序員使用,他將一個(gè)應(yīng)用程序從一種計(jì)算機(jī)系統(tǒng)移植到另一種計(jì)算機(jī)系統(tǒng)上。典型的情況是目標(biāo)應(yīng)用程序針對(duì)除運(yùn)行仿真器的主機(jī)以外的一些目標(biāo)計(jì)算機(jī)而設(shè)計(jì)。仿真器軟件分析目標(biāo)指令,將這些指令翻譯為可以在主機(jī)上運(yùn)行的指令,并且將這些主指令存入高速緩沖存儲(chǔ)器內(nèi)供再次使用。這種動(dòng)態(tài)翻譯和高速緩存可以使應(yīng)用程序部分運(yùn)行得非??臁_@種形式的仿真器一般與軟件跟蹤工具一起使用,以提供正在運(yùn)行的目標(biāo)程序的詳細(xì)的運(yùn)行信息。跟蹤工具的輸出又被用來驅(qū)動(dòng)對(duì)跟蹤信息進(jìn)行分析的分析程序。
為了確定代碼實(shí)際上是如何工作的,這種類型的仿真器與主機(jī)上的主操作系統(tǒng)協(xié)同運(yùn)行,配備了主操作系統(tǒng)未提供的虛擬硬件,并且將設(shè)計(jì)應(yīng)用軟件的計(jì)算機(jī)的操作映象到主機(jī)硬件資源以執(zhí)行正在運(yùn)行的程序的操作。這種硬件的軟件虛擬化和對(duì)主計(jì)算機(jī)的映象可能非常慢并且很不完善。
而且由于常常需要多條主指令以執(zhí)行一條目標(biāo)指令,所以可能產(chǎn)生包括故障和陷井在內(nèi)的意外事件,這需要目標(biāo)操作系統(tǒng)的意外事件處理器,并且使主機(jī)在與目標(biāo)指令邊界無關(guān)的位置上終止處理主指令。當(dāng)發(fā)生這種情況時(shí),由于主處理器和存儲(chǔ)器的狀態(tài)不正確,所以無法正確處理意外事件。如果出現(xiàn)這種情況,仿真器必須停止并重新運(yùn)行以跟蹤產(chǎn)生意外事件的操作。因此雖然這種仿真器能夠非??斓剡\(yùn)行目標(biāo)代碼序列,但是卻沒有辦法從這些意外事件中恢復(fù)過來,因此無法快速運(yùn)行應(yīng)用程序中任何相當(dāng)大的一部分。
由于仿真器、跟蹤器和相關(guān)的分析器所完成的功能是直接產(chǎn)生新的程序或者將舊程序移植到另一種機(jī)器上,因而就仿真器軟件運(yùn)行速度而言很少有定論,因此這不是這種形式仿真器特有的問題。即,程序員通常對(duì)仿真器產(chǎn)生的代碼在主機(jī)上運(yùn)行得有多快并不感興趣,他們感興趣的是仿真器是否能產(chǎn)生可在為其設(shè)計(jì)的機(jī)器上執(zhí)行的代碼并能在該機(jī)器上快速地運(yùn)行的代碼。因此除了編程目的以外,這種類型的仿真軟件不能提供使第一指令集編寫的應(yīng)用程序能運(yùn)行在不同類型的微處理器上的方法。這種仿真軟件的實(shí)例在題為“ShadeA Fast Instruction-Set Simulator for Execution Profiling”(Cmelik和Keppel)的文章中有所論及。
因此最理想的是提供一種具有競(jìng)爭(zhēng)力的微處理器,它比現(xiàn)有技術(shù)的微處理器更快更便宜,但是又與為現(xiàn)有技術(shù)微處理器運(yùn)行各種可用操作系統(tǒng)而設(shè)計(jì)的目標(biāo)應(yīng)用程序完全兼容。
尤其,最理想的是提供一種電路系統(tǒng),它提供的主處理器在處理主處理器存儲(chǔ)內(nèi)容時(shí)能夠迅速?gòu)囊馔馐录谢謴?fù)過來,從而提高了處理器的功能速度。
發(fā)明內(nèi)容
因此本發(fā)明的目的是借助加速程序執(zhí)行期間產(chǎn)生的存儲(chǔ)器內(nèi)容的裝置提高微處理器的運(yùn)算速度。
實(shí)現(xiàn)本發(fā)明的本自的和其他目的的裝置和方法包括暫時(shí)保存除其它存儲(chǔ)器內(nèi)容以外的所有存儲(chǔ)器內(nèi)容,它們?cè)谥魈幚砥鲗⒛繕?biāo)指令翻譯為主指令的翻譯間隔期間依照順序產(chǎn)生;如果翻譯執(zhí)行不產(chǎn)生意外事件則將翻譯間隔期間按照順序產(chǎn)生的存儲(chǔ)器內(nèi)容轉(zhuǎn)移的電路系統(tǒng);響應(yīng)于存儲(chǔ)器地址的存儲(chǔ)器尋址指示哪一個(gè)至等同存儲(chǔ)器地址的存儲(chǔ)器內(nèi)容是最新的電路系統(tǒng);以及如果翻譯執(zhí)行不產(chǎn)生意外事件則將翻譯間隔期間按照順序產(chǎn)生的存儲(chǔ)器內(nèi)容消除的電路系統(tǒng)通過以下附圖對(duì)本發(fā)明的詳細(xì)描述可以更好地理解本發(fā)明的各種目的和特點(diǎn),在附圖中相同的單元采用相同的標(biāo)記。
附圖的簡(jiǎn)要說明圖1(a)-(e)為按照現(xiàn)有技術(shù)設(shè)計(jì)的微處理器操作方式的示意圖。
圖2為微處理器框圖,該處理器運(yùn)行針對(duì)不同微處理器設(shè)計(jì)的應(yīng)用程序。
圖3為圖2所示微處理器某一部分的示意圖。
圖4為寄存器文件的框圖,該寄存器文件用于圖3所示的微處理器。
圖5為按照本發(fā)明設(shè)計(jì)的門控存儲(chǔ)緩沖器的框圖。
圖6(a)-(c)示出了用于現(xiàn)有技術(shù)各種微處理器和圖3所示微處理器的指令。
圖7示出了圖3所示微處理器軟件部分實(shí)現(xiàn)的方法。
圖8示出了圖3所示微處理器軟件部分實(shí)現(xiàn)的另一種方法。
圖9為改進(jìn)的圖3所示計(jì)算機(jī)系統(tǒng)的框圖。
圖10為圖3所示微處理器某一部分的框圖。
圖11為圖3微處理器中翻譯旁視緩沖器的更為詳細(xì)的框圖。
圖12為圖3所示處理器中所用存儲(chǔ)器的詳細(xì)框圖。
圖13為按照本發(fā)明的門控存儲(chǔ)緩沖器第一邏輯實(shí)施例的框圖。
圖14為按照本發(fā)明的門控存儲(chǔ)緩沖器第二實(shí)施例的框圖。
記號(hào)和術(shù)語以下某些詳細(xì)描述部分將借助對(duì)計(jì)算機(jī)存儲(chǔ)器內(nèi)數(shù)據(jù)位操作所作的符號(hào)化表示。這些描述和表達(dá)形式是數(shù)據(jù)處理領(lǐng)域內(nèi)技術(shù)人員向同行表述其工作內(nèi)容最為有效的方式。這些操作需要對(duì)物理量施行物理操作。雖然并非必要,但是通常情況下這些物理量采用可以存儲(chǔ)、轉(zhuǎn)換、組合、比較和其他處理方式的電學(xué)或磁學(xué)信號(hào)形式。為方便起見,主要是通用的原因,這些信號(hào)被稱為位、值、單元、符號(hào)、字符、項(xiàng)、數(shù)字等。但是應(yīng)該認(rèn)識(shí)到,無論如何,所有這些以及相似的術(shù)語都與合適的物理量相聯(lián)系并且僅僅是為方便表示這些物理量而采用的標(biāo)記。
還有,所完成的控制通常用諸如加法或比較之類的術(shù)語表示,它們一般與操作人員所完成的思維操作有聯(lián)系。在構(gòu)成本發(fā)明的大多數(shù)操作中,操作人員的這種能力并不是必不可少或需要的;這些操作是機(jī)器操作。完成本發(fā)明操作的有用機(jī)器包括通用數(shù)字計(jì)算機(jī)或其它類似設(shè)備。在所有情況下,應(yīng)考慮到操縱計(jì)算機(jī)的操作方法與計(jì)算方法本身之間應(yīng)視為是有區(qū)別的。本發(fā)明涉及操作計(jì)算機(jī)的方法和裝置,這種計(jì)算機(jī)處理電學(xué)或其它(例如機(jī)械、化學(xué))物理信號(hào)以產(chǎn)生其它所需的物理信號(hào)。
在下面的描述中,由于大多數(shù)的仿真器都運(yùn)行X86應(yīng)用程序,所以為了舉例說明操作細(xì)節(jié),在某些情況下將目標(biāo)程序看作為在X86微處理器上執(zhí)行而設(shè)計(jì)的程序。但是目標(biāo)程序可以為在任意目標(biāo)計(jì)算機(jī)系列上運(yùn)行而設(shè)計(jì)。它們包括目標(biāo)虛擬計(jì)算機(jī),例如Pcode機(jī)、Postscript機(jī)或者Java虛擬機(jī)。
實(shí)施發(fā)明的較佳方式本發(fā)明有助于克服現(xiàn)有技術(shù)存在的問題并且提供了一種速度比現(xiàn)有技術(shù)的微處理器更快的微處理器,它能夠運(yùn)行所有(大量現(xiàn)有技術(shù)微處理器都可以運(yùn)行的)操作系統(tǒng)下的所有軟件,但是價(jià)格又低于現(xiàn)有技術(shù)的微處理器。
與采用更為復(fù)雜的硬件加快運(yùn)算速度的做法不同,處理器是組合的一個(gè)部分,包括比現(xiàn)有技術(shù)微處理器簡(jiǎn)單得多的增強(qiáng)硬件處理部分(在本說明書中稱為“詞態(tài)主機(jī)(morph host)”;以及仿真軟件部分(在本說明中稱為“代碼詞態(tài)化軟件(code morphing software”),二者結(jié)合成為比已知的有競(jìng)爭(zhēng)力的微處理器功能更強(qiáng)大的微處理器。詞態(tài)主機(jī)是一種包含硬件增強(qiáng)的處理器,當(dāng)發(fā)生意外事件或者錯(cuò)誤時(shí)它立即恢復(fù)為目標(biāo)計(jì)算機(jī)的狀態(tài),而代碼詞態(tài)化軟件將目標(biāo)程序的指令翻譯為詞態(tài)主機(jī)的詞態(tài)主機(jī)指令,并在需要時(shí)用正確的目標(biāo)狀態(tài)代替工作狀態(tài)以響應(yīng)意外事件或錯(cuò)誤,從而進(jìn)行正確的重新翻譯。代碼詞態(tài)化軟件還可以包括提高處理速度的各種過程。與所有速度極快的現(xiàn)有技術(shù)微處理器通過提供硬件來提高處理速度的做法不同,改進(jìn)的微處理器借助代碼詞態(tài)化軟件在可以選擇的階段運(yùn)用大量的加速增強(qiáng)技術(shù)。假定在代碼詞態(tài)化軟件中運(yùn)用提速技術(shù)使得可以采用復(fù)雜程度較低但運(yùn)行速度比現(xiàn)有技術(shù)微處理器更快而價(jià)格大為降低的硬件實(shí)現(xiàn)詞態(tài)主機(jī)。作為比較,在一個(gè)用包含Pentium Pro微處理器四分之一數(shù)量門電路的詞態(tài)主機(jī)實(shí)現(xiàn)的微處理器的實(shí)施例中,運(yùn)行X86應(yīng)用程序的速度要快于PentiumPro微處理器或者其它能夠處理這類應(yīng)用程序的已知微處理器。
代碼詞態(tài)化軟件采用了某些技術(shù),這些技術(shù)以前只是由程序員在設(shè)計(jì)新軟件或仿真新硬件時(shí)采用過。詞態(tài)主機(jī)包含硬件增強(qiáng)部分,它特別適合于充分利用代碼詞態(tài)化軟件提供的加速技術(shù)。這些硬件增強(qiáng)部分允許代碼詞態(tài)化軟件在更寬的指令范圍內(nèi)實(shí)現(xiàn)加速技術(shù)。這些硬件增強(qiáng)部分還允許代碼詞態(tài)化軟件實(shí)現(xiàn)其它加速技術(shù),這些技術(shù)在硬件處理器中不具備,且無法在硬件處理器內(nèi)應(yīng)用,除非花費(fèi)巨額的代價(jià)。與現(xiàn)有技術(shù)微處理器執(zhí)行本機(jī)指令集的情形相比,這些技術(shù)明顯提高了微處理器的速度。
例如,與增強(qiáng)型詞態(tài)主機(jī)結(jié)合的代碼詞態(tài)化軟件可以采用重新排列與重新安排由目標(biāo)指令序列產(chǎn)生的基本指令的技術(shù)而無需增加太多的電路。由于可以一起重新排序與重新安排大量目標(biāo)指令,所以可以采用其它的優(yōu)化技術(shù)來減少處理器執(zhí)行目標(biāo)指令組所需的步驟數(shù),使其少于其它運(yùn)行目標(biāo)應(yīng)用程序的微處理器所需的步驟數(shù)。
與增強(qiáng)型詞態(tài)主機(jī)組合起來的代碼詞態(tài)化軟件快速將目標(biāo)指令翻譯為詞態(tài)主機(jī)的指令并且將這些主指令高速緩存入存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)(在本說明書中稱為“翻譯緩沖器”)。使用保存翻譯指令的翻譯緩沖器可以再次調(diào)用指令而無需在每次執(zhí)行每條目標(biāo)指令時(shí),重新運(yùn)行冗長(zhǎng)的過程,確定需要哪一條基本指令來實(shí)現(xiàn)每條目標(biāo)指令,對(duì)每條基本指令作尋址、讀取基本指令、優(yōu)化基本指令序列,為每條基本指令分配資源,對(duì)基本指令進(jìn)行重新排序并執(zhí)行包括每一時(shí)間執(zhí)行的每一目標(biāo)指令的每一基本指令序列的每個(gè)步驟。目標(biāo)指令一旦被翻譯出來,它就可以從翻譯緩沖器內(nèi)再次調(diào)用并執(zhí)行而無需再三重復(fù)這些數(shù)不清的步驟。
現(xiàn)有仿真技術(shù)的主要問題是無法高性能地處理目標(biāo)程序執(zhí)行期間產(chǎn)生的意外事件。如果在運(yùn)行直接指向目標(biāo)操作系統(tǒng)的目標(biāo)應(yīng)用程序時(shí)產(chǎn)生意外事件,情況更是如此,此時(shí)為了正確處理意外事件和執(zhí)行隨后的指令,必須有發(fā)生意外事件時(shí)正確的目標(biāo)狀態(tài)供使用。因此迫使仿真器始終精確地跟蹤目標(biāo)狀態(tài)并一直進(jìn)行檢查,以確定是否存儲(chǔ)到目標(biāo)代碼區(qū)域。其它意外事件也會(huì)帶來類似的問題。例如仿真器可以產(chǎn)生意外事件以檢測(cè)已經(jīng)被一些特定主功能替代的特定目標(biāo)操作。特別是目標(biāo)處理器的各種硬件操作可以由仿真器軟件提供的軟件操作代替。此外,執(zhí)行由目標(biāo)指令導(dǎo)出的主指令的主處理器也可能產(chǎn)生意外事件。所有這些意外事件都有可能在仿真器試圖將目標(biāo)指令變換為主指令時(shí)或者在主處理器上執(zhí)行主翻譯時(shí)發(fā)生。高效的仿真必須提供一些從這些意外事件有效恢復(fù)的方式并且能夠正確處理意外事件。現(xiàn)有技術(shù)均無法對(duì)所有被仿真的軟件做到這一點(diǎn)。
為了克服現(xiàn)有技術(shù)的這些不足,在增強(qiáng)型詞態(tài)主機(jī)中作了大量的硬件改進(jìn)。這些改進(jìn)包括門控(gated)存儲(chǔ)緩沖器和許多新增加的處理器寄存器。某些新增加的寄存器可以采用寄存器重新命名以緩解需要同一硬件資源指令的問題。新增的寄存器還可以維護(hù)一組處理主指令的主機(jī)或工作寄存器和一組目標(biāo)寄存器以保持目標(biāo)處理器(用它產(chǎn)生目標(biāo)應(yīng)用程序)的正式狀態(tài)。目標(biāo)(或屏蔽)寄存器通過專用接口與與其等效的工作寄存器相連,專用接口使得稱為“調(diào)撥”的操作將所有工作寄存器的內(nèi)容快速傳遞至正式目標(biāo)寄存器,并使得稱為“返還”的操作將所有正式目標(biāo)寄存器的內(nèi)容快速傳遞回與其等效的工作寄存器。門控存儲(chǔ)緩沖器存儲(chǔ)硬件“門電路”的“未調(diào)撥”一側(cè)的工作存儲(chǔ)器狀態(tài)變化,和硬件門電路“調(diào)撥”一側(cè)的正式存儲(chǔ)器狀態(tài)變化,這些調(diào)撥的存儲(chǔ)“排放”至主存儲(chǔ)器。調(diào)撥操作將門電路為非調(diào)撥一側(cè)的存儲(chǔ)傳遞至門電路的調(diào)撥一側(cè)。新增的正式寄存器和門控存儲(chǔ)緩沖器使存儲(chǔ)器狀態(tài)和目標(biāo)寄存器狀態(tài)在一條或一組目標(biāo)指令被翻譯和運(yùn)行無誤之后一起更新。
這些更新由代碼詞態(tài)化軟件選擇以發(fā)生于完整的目標(biāo)指令邊界。因此,如果由主處理器運(yùn)行構(gòu)成目標(biāo)指令系列翻譯的基本主指令而未發(fā)生意外事件,則將這些指令產(chǎn)生的工作存儲(chǔ)器存儲(chǔ)和工作寄存器狀態(tài)傳遞至正式存儲(chǔ)器和正式目標(biāo)寄存器。這樣,如果在處理主指令時(shí)發(fā)生意外事件而此時(shí)又不在被翻譯的一條或一組目標(biāo)指令的邊界上時(shí),可以將最近更新(或調(diào)撥)的目標(biāo)寄存器的原始狀態(tài)再次調(diào)用至工作寄存器并可以轉(zhuǎn)儲(chǔ)門控存儲(chǔ)緩沖器內(nèi)未調(diào)撥的存儲(chǔ)器存儲(chǔ)結(jié)果。如果發(fā)生的意外事件是目標(biāo)意外事件,則可以一次重新翻譯一條引起目標(biāo)意外事件的目標(biāo)指令并象目標(biāo)微處理器執(zhí)行目標(biāo)指令那樣依照順序執(zhí)行目標(biāo)指令。當(dāng)正確無誤地執(zhí)行每條目標(biāo)指令時(shí),可以更新目標(biāo)寄存器的狀態(tài);并且存儲(chǔ)緩沖器內(nèi)數(shù)據(jù)受到門電路的控制向存儲(chǔ)器傳送。隨后,當(dāng)運(yùn)行主指令時(shí)再次發(fā)生意外事件時(shí),目標(biāo)計(jì)算機(jī)的正確狀態(tài)由詞態(tài)主機(jī)的目標(biāo)寄存器和存儲(chǔ)器保存;并且可以無延遲地正確地處理操作。由這種糾錯(cuò)翻譯產(chǎn)生的每條新翻譯結(jié)果可以高速緩存以供以后使用。因?yàn)槭菍?duì)一次性或偶爾發(fā)生的諸如頁面出錯(cuò)事件而翻譯或者交替轉(zhuǎn)儲(chǔ)的。這使得代碼詞態(tài)化軟件與詞態(tài)主機(jī)組合構(gòu)成的微處理器能夠比原先為其編寫軟件的處理器更快地執(zhí)行指令。
應(yīng)該指出的是,在利用本發(fā)明的微處理器執(zhí)行目標(biāo)程序的過程中,可能會(huì)發(fā)生許多不同類型的意外事件,它們需要不同方式處理。例如一些意外事件由產(chǎn)生意外事件的目標(biāo)軟件引起,該意外事件使用了目標(biāo)操作系統(tǒng)意外事件處理器。使用這種意外事件處理器要求代碼詞態(tài)化軟件包含仿真整個(gè)意外事件處理過程的子程序,該以外事件處理過程包含任何由處理過程的目標(biāo)計(jì)算機(jī)提供的硬件。這就需要代碼詞態(tài)化軟件保存目標(biāo)處理器的狀態(tài)從而在處理完意外事件之后繼續(xù)正確執(zhí)行。某些意外事件,例如頁面出錯(cuò),需要在實(shí)現(xiàn)將過程翻譯之前在新的存儲(chǔ)器頁面中讀取數(shù)據(jù),當(dāng)意外事件處理之后它要求返回至被翻譯過程的開始之處。其它意外事件實(shí)現(xiàn)了軟件中硬件未提供的特殊操作。這些意外事件都要求意外事件處理器在處理完意外事件之后將操作返回翻譯中的下一步驟。每種不同類型的意外事件都可以由本發(fā)明的微處理器有效地處理。
此外,有些意外事件由主機(jī)硬件產(chǎn)生并且檢測(cè)各種主機(jī)和目標(biāo)機(jī)狀態(tài)。有些意外事件的表現(xiàn)如同在普通微處理器上一樣,而其它的則被代碼詞態(tài)化軟件用來檢測(cè)各種預(yù)測(cè)的故障。在這些情況下,采用上述狀態(tài)保存和恢復(fù)機(jī)制的代碼詞態(tài)化軟件使目標(biāo)狀態(tài)恢復(fù)至其最近的正式狀態(tài)并將產(chǎn)生和保存新的翻譯結(jié)果(或者再次使用先前產(chǎn)生的安全的翻譯結(jié)果),這避免了無效預(yù)測(cè)。隨后執(zhí)行該翻譯結(jié)果。
詞態(tài)主機(jī)包含新增的硬件意外事件檢測(cè)機(jī)構(gòu),它與上述返還和重新翻譯方法結(jié)合可以作進(jìn)一步的優(yōu)化。例子為有一種裝置,它將存儲(chǔ)器從存儲(chǔ)器映象I/O區(qū)分開來,另有一種裝置,它通過保護(hù)地址或地址范圍省卻了存儲(chǔ)器基準(zhǔn),由此可以在寄存器內(nèi)保存目標(biāo)變量。
在利用意外事件檢測(cè)其它預(yù)測(cè)失效(例如操作是否影響存儲(chǔ)器或存儲(chǔ)器映象I/O)時(shí),通過借助不同的存儲(chǔ)器操作和不同的優(yōu)化產(chǎn)生的新的翻譯結(jié)果來完成恢復(fù)工作。
圖2為詞態(tài)主機(jī)硬件的示意圖,它正在運(yùn)行與圖1(a)上CISC處理器相同的應(yīng)用程序。如圖所示,微處理器包含上述代碼詞態(tài)化軟件部分和增強(qiáng)型硬件詞態(tài)主機(jī)部分。目標(biāo)應(yīng)用程序?qū)⒛繕?biāo)指令載入代碼詞態(tài)化軟件以將其翻譯成為詞態(tài)主機(jī)能夠執(zhí)行的主機(jī)指令。與此同時(shí),目標(biāo)操作系統(tǒng)接收來自目標(biāo)應(yīng)用程序的調(diào)用并將調(diào)用轉(zhuǎn)送至代碼詞態(tài)化軟件。在微處理器的較佳實(shí)施例中,詞態(tài)主機(jī)是一種超長(zhǎng)指令字(VLIW)處理器,將它設(shè)計(jì)成有多條處理通道。圖6(c)示出了這種處理器的總體操作。
在圖6(a)-(c)中示出了適用于CISC處理器、RISC處理器和VLIW處理器的指令。顯然CISC指令是變長(zhǎng)度的并且可以包含多條更基本的操作(例如加載和相加)。另一方面,RISC指令是等長(zhǎng)度的并且主要是基本操作。圖示的VLIW處理器的一條超長(zhǎng)指令包括CISC和RISC指令的每個(gè)更為基本的操作(例如加載、存儲(chǔ)、整數(shù)相加、比較、浮點(diǎn)乘法和轉(zhuǎn)移)。如圖6(c)所示,每條基本指令一起構(gòu)成一條超長(zhǎng)指令字,所述基本指令與其它基本指令并行地載入VLIW處理器中多條分開的處理通道中的一條或者存儲(chǔ)器內(nèi)以供處理通道和存儲(chǔ)器并行處理。并行操作的所有結(jié)果都被轉(zhuǎn)送至多端口寄存器文件。
可作為詞態(tài)主機(jī)基礎(chǔ)的VLIW處理器是比上述其它處理器簡(jiǎn)單得多的處理器。它不包含檢測(cè)結(jié)果依存性的電路或者重新排序、優(yōu)化和重新安排基本指令的電路。與運(yùn)行原先為其設(shè)計(jì)目標(biāo)應(yīng)用程序的處理器或者利用仿真程序運(yùn)行目標(biāo)應(yīng)用程序的其它處理器相比,這使得可以在較高的時(shí)鐘頻率有更快的處理速度。但是這并不局限于VLIW處理器,諸如RISC處理器之類的任意類型的處理器都可以實(shí)現(xiàn)同樣的效果。
圖2所示微處理器的代碼詞態(tài)化軟件包括翻譯機(jī)部分,它對(duì)目標(biāo)應(yīng)用程序的指令進(jìn)行譯碼,將目標(biāo)指令轉(zhuǎn)換為詞態(tài)主機(jī)能夠執(zhí)行的基本主指令,優(yōu)化目標(biāo)指令所需的操作,將基本指令重新排序和重新安排為用于詞態(tài)主機(jī)的VLIW指令(翻譯)并執(zhí)行主VLIW指令。圖7為翻譯機(jī)操作示意圖,它示出了代碼詞態(tài)化軟件主循環(huán)操作。
為了加速包含代碼詞態(tài)化軟件和增強(qiáng)詞態(tài)主硬件的微處理器的操作速度,如圖2所示,代碼詞態(tài)化軟件包含翻譯緩沖器。一個(gè)實(shí)施例的翻譯緩沖器是一種可以在存儲(chǔ)器內(nèi)存儲(chǔ)的軟件數(shù)據(jù)結(jié)構(gòu);在特殊的實(shí)施例中也可以采用硬件高速緩存。用翻譯緩沖器存儲(chǔ)主指令,主指令概括了每一個(gè)目標(biāo)指令的完整的翻譯。顯而易見,一旦翻譯出單條目標(biāo)指令并對(duì)獲得的主指令進(jìn)行優(yōu)化、重新排序和重新安排,所得到的主指令就被存儲(chǔ)在翻譯緩沖器內(nèi)。構(gòu)成翻譯結(jié)果的主指令隨后由詞態(tài)主機(jī)執(zhí)行。如果主指令的執(zhí)行不發(fā)生意外事件,則無論何時(shí)需要實(shí)現(xiàn)由目標(biāo)指令或指令的操作時(shí)都可以再次調(diào)用該翻譯結(jié)果。
如圖7所示,由應(yīng)用程序載入目標(biāo)指令地址的微處理器詞態(tài)化軟件的典型操作是首先確定目標(biāo)地址上的目標(biāo)指令是否已經(jīng)翻譯。如果目標(biāo)指令未被翻譯,則讀取該目標(biāo)指令以及隨后的目標(biāo)指令,并且將它們譯碼、翻譯并隨后(可能是)優(yōu)化、重新排序和重新安排為新的主翻譯結(jié)果,并由翻譯機(jī)將它們存儲(chǔ)在翻譯緩沖器內(nèi)。如下可見,優(yōu)化可以達(dá)到不同的程度。在本說明書中術(shù)語“優(yōu)化”常常指的是加速處理的技術(shù)。例如重新排序就是一種優(yōu)化形式,它使得處理更快,因此屬于該術(shù)語的范疇。許多可能的優(yōu)化方法在現(xiàn)有技術(shù)的編譯器優(yōu)化中都有描述,有些優(yōu)化方法難以在類似現(xiàn)有技術(shù)的“超塊”中完成,而在VLIW研究中出現(xiàn)。隨后控制被轉(zhuǎn)移至翻譯以使增強(qiáng)詞態(tài)主硬件重新開始執(zhí)行。
在運(yùn)行應(yīng)用程序中當(dāng)接著遇到特定的目標(biāo)指令序列時(shí),將在翻譯緩沖器內(nèi)找到主翻譯指令并立即執(zhí)行而無需翻譯、優(yōu)化、重新排序或者重新安排。利用下述高級(jí)技術(shù),據(jù)估計(jì)每一百萬次中只有一次需執(zhí)行翻譯??稍诜g緩沖器中找到所有目標(biāo)指令(曾一旦全部經(jīng)過翻譯)的翻譯結(jié)果。因此在第一次翻譯之后,翻譯所需的所有步驟(例如譯碼、讀取基本指令,優(yōu)化基本指令,將其重新安排為主翻譯指令并在翻譯緩沖器內(nèi)存儲(chǔ))可以從所要求的處理中省略。由于為其編寫目標(biāo)指令的處理器在每次執(zhí)行指令時(shí)都必須譯碼、讀取、重新排序和重新安排每條指令,所以這樣做大大減少了執(zhí)行目標(biāo)指令所需的工作量并提高了改進(jìn)型微處理器的速度。
在省略所有這些現(xiàn)有技術(shù)處理器執(zhí)行目標(biāo)應(yīng)用程序所需的步驟之后,本發(fā)明的微處理器克服了現(xiàn)有技術(shù)的問題,這些問題使得這類操作不能合理的速度運(yùn)行。例如改進(jìn)型微處理器的某些技術(shù)被用于上述仿真器以將應(yīng)用程序移植到其它系統(tǒng)。但是由于在處理翻譯指令時(shí),引起調(diào)用各種系統(tǒng)意外事件處理器的意外事件發(fā)生在主處理器狀態(tài)與處理同樣指令的目標(biāo)處理器無關(guān)的操作時(shí)刻,所以一些仿真器無法運(yùn)行應(yīng)用程序較長(zhǎng)的部分。因此產(chǎn)生這類意外事件時(shí)目標(biāo)處理器的狀態(tài)是未知的。這樣,目標(biāo)機(jī)的正確狀態(tài)就無法確定;操作必須停止,重新啟動(dòng),并在意外事件可以處理和繼續(xù)執(zhí)行之前確認(rèn)正確的狀態(tài)。這使得無法以主機(jī)速度運(yùn)行應(yīng)用程序。
詞態(tài)主機(jī)硬件包含了解決該問題的多個(gè)增強(qiáng)部分。圖3、4和5示出了這些增強(qiáng)部分。為了在發(fā)生錯(cuò)誤時(shí)確定寄存器的正確狀態(tài),增強(qiáng)硬件提供了一組正式目標(biāo)寄存器來保存為其設(shè)計(jì)源應(yīng)用程序的目標(biāo)處理器的寄存器狀態(tài)。目標(biāo)寄存器可以包含在每個(gè)浮點(diǎn)單元、任何整數(shù)單元和其它執(zhí)行單元內(nèi)。這些正式寄存器連同增加的正常工作寄存器一起被加入詞態(tài)主機(jī)使得包括寄存器重命名的一系列優(yōu)化得以實(shí)現(xiàn)。增強(qiáng)硬件的一個(gè)實(shí)施例在整數(shù)單元內(nèi)包含64個(gè)工作寄存器而在浮點(diǎn)單元內(nèi)包含32個(gè)工作寄存器。實(shí)施例還包含一組增強(qiáng)目標(biāo)寄存器,它們包含所有提供處理器狀態(tài)的經(jīng)常變化的目標(biāo)處理器寄存器;這包括狀態(tài)控制寄存器和其它控制仿真系統(tǒng)所需的寄存器。
應(yīng)該注意的是,根據(jù)詞態(tài)主機(jī)所用的增強(qiáng)處理硬件類型,翻譯指令序列可包含構(gòu)成從源應(yīng)用程序來的多條目標(biāo)指令的基本操作。例如VLIW微處理器可以如圖6(a)-(c)所示立即執(zhí)行多條CISC指令或者RISC指令。無論詞態(tài)主機(jī)類型如何,除了整體目標(biāo)指令邊界以外詞態(tài)主機(jī)硬件的目標(biāo)寄存器狀態(tài)是不會(huì)改變的;并且隨后所有的目標(biāo)寄存器得到了更新。因此,如果微處理器正在執(zhí)行目標(biāo)指令或已經(jīng)被翻譯為一系列可以重新排序和重新安排為主翻譯指令的基本指令,則當(dāng)處理器開始執(zhí)行已翻譯的指令序列時(shí),正式目標(biāo)寄存器在第一條目標(biāo)指令被尋址時(shí)保存由為其設(shè)計(jì)應(yīng)用程序的目標(biāo)處理器寄存器保存的值。但是在詞態(tài)主機(jī)開始執(zhí)行翻譯指令之后,工作寄存器保存由執(zhí)行到該點(diǎn)的翻譯指令基本操作確定的值。因此盡管一些工作寄存器保存的是與正式目標(biāo)寄存器內(nèi)相同的值,但是其它工作寄存器內(nèi)保存的值對(duì)于目標(biāo)處理器毫無意義。在為了采用高級(jí)加速技術(shù)提供位定目標(biāo)機(jī)更多的寄存器的實(shí)施例中這尤其是如此。一旦開始執(zhí)行經(jīng)翻譯的主指令,工作寄存器中的值是經(jīng)翻譯的主指令確定寄存器狀態(tài)的任何值。如果執(zhí)行一組經(jīng)翻譯的主指令而未產(chǎn)生意外事件,則在這組指令結(jié)束時(shí)確定的新工作寄存器值就被一起轉(zhuǎn)送至正式目標(biāo)寄存器(可能包括目標(biāo)指令指針寄存器)。在本實(shí)施例的處理器,這種轉(zhuǎn)移發(fā)生于主指令執(zhí)行的外部在附加的流水線站內(nèi),從而不會(huì)降低詞態(tài)主機(jī)的處理速度。
同樣,圖5所示實(shí)施例中的門控存儲(chǔ)緩沖器在改進(jìn)型微處理器的硬件中被用來控制數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器。門控存儲(chǔ)緩沖器包括多個(gè)單元,每個(gè)相當(dāng)于一個(gè)存儲(chǔ)單元,可保存存儲(chǔ)器存儲(chǔ)操作的地址和數(shù)據(jù)。可通過任意數(shù)量的不同的硬件配置(例如先進(jìn)先出緩沖器)執(zhí)行這些單元所示實(shí)施例利用隨機(jī)存取存儲(chǔ)器和三個(gè)專用工作寄存器執(zhí)行。三個(gè)專用寄存器分別存儲(chǔ)指向存儲(chǔ)器存儲(chǔ)隊(duì)列首部的指針、指向門的指針和指向存儲(chǔ)器存儲(chǔ)隊(duì)列尾部的指針。指針還存儲(chǔ)在分立的寄存器內(nèi)(圖5中未畫出),該寄存器指定將數(shù)據(jù)讀取至存儲(chǔ)器的單元。存儲(chǔ)單元內(nèi)位于隊(duì)列首部與門之間的存儲(chǔ)器存儲(chǔ)內(nèi)容已經(jīng)被調(diào)撥給存儲(chǔ)器,而與其它存儲(chǔ)單元相隔的存儲(chǔ)單元內(nèi)位于隊(duì)列門與尾部之間的還未調(diào)撥給存儲(chǔ)器。在主翻譯指令執(zhí)行期間產(chǎn)生的存儲(chǔ)器存儲(chǔ)內(nèi)容由整數(shù)單元將按照詞態(tài)主機(jī)執(zhí)行主指令的順序放入存儲(chǔ)緩沖器但是在主指令中遇到調(diào)撥操作以前不允許寫入存儲(chǔ)器。因此隨著翻譯指令的執(zhí)行,存儲(chǔ)操作被放入隊(duì)列。假定這些是第一次存儲(chǔ)的內(nèi)容因而在門控存儲(chǔ)緩沖器內(nèi)沒有其它的存儲(chǔ)內(nèi)容,則首部指針和門指針將指向同一位置。隨著執(zhí)行每一存儲(chǔ)內(nèi)容,它被放入隊(duì)列中下一位置并且尾部指針指向下一個(gè)位置(在圖中是向上)。這一直持續(xù)到執(zhí)行調(diào)撥指令為止。這通常發(fā)生于完成一組目標(biāo)指令翻譯而未發(fā)生意外事件或者出現(xiàn)錯(cuò)誤退出條件時(shí)。當(dāng)詞態(tài)主機(jī)正確無誤地執(zhí)行翻譯指令時(shí),執(zhí)行期間產(chǎn)生的存儲(chǔ)緩沖器內(nèi)的存儲(chǔ)器存儲(chǔ)內(nèi)容被一起轉(zhuǎn)移通過存儲(chǔ)緩沖器的門(給調(diào)撥的)并隨后寫入存儲(chǔ)器。在所示實(shí)施例中,這是通過將保存尾部指針的寄存器內(nèi)的值復(fù)制到保存門指針的寄存器內(nèi)而完成的。
由此可見,寄存器狀態(tài)從工作寄存器轉(zhuǎn)送至正式目標(biāo)寄存器和工作存儲(chǔ)器內(nèi)容轉(zhuǎn)移至正式存儲(chǔ)器是一起發(fā)生的并且只發(fā)生在整個(gè)目標(biāo)指令之間的邊界上對(duì)明確的調(diào)撥操作作出響應(yīng)。
這使得微處理器可以從在增強(qiáng)詞態(tài)主機(jī)執(zhí)行指令過程中發(fā)生的目標(biāo)意外事件中幾乎無延遲地恢復(fù)過來。如果在運(yùn)行任何翻譯指令或指令期間產(chǎn)生目標(biāo)意外事件,則由詞態(tài)主機(jī)硬件或軟件檢測(cè)意外事件。為了響應(yīng)檢測(cè)到目標(biāo)意外事件,代碼詞態(tài)化軟件可以將正式寄存器內(nèi)保存的任何值放回工作寄存器并使門控存儲(chǔ)緩沖器內(nèi)未調(diào)撥的存儲(chǔ)器存儲(chǔ)內(nèi)容轉(zhuǎn)儲(chǔ)(一種稱為“轉(zhuǎn)儲(chǔ)”的操作)。圖5在門控存儲(chǔ)緩沖器內(nèi)的存儲(chǔ)器存儲(chǔ)內(nèi)容的轉(zhuǎn)儲(chǔ)可以通過將保存門指針的寄存器內(nèi)的值復(fù)制到保存尾部指針的寄存器內(nèi)實(shí)現(xiàn)。
將目標(biāo)寄存器的值放入工作寄存器可以使發(fā)生意外事件時(shí)的第一條正在運(yùn)行的目標(biāo)指令的地址放入工作指令指針寄存器內(nèi)。從工作寄存器內(nèi)目標(biāo)處理器的正式狀態(tài)開始,當(dāng)發(fā)生意外事件時(shí)正在運(yùn)行的目標(biāo)指令將按照串行順序重新翻譯而不進(jìn)行重新排序或其它優(yōu)化。在將每條目標(biāo)指令重新譯碼和翻譯為新的主指令之后,代表目標(biāo)指令的翻譯后的主指令由詞態(tài)主機(jī)執(zhí)行并且可能引起意外事件或不引起意外事件。(如果詞態(tài)主機(jī)是VLIW處理器以外的處理器,則主翻譯指令的每條基本操作按照順序執(zhí)行。如果在主翻譯指令執(zhí)行時(shí)沒有產(chǎn)生意外事件,則運(yùn)行下一基本功能)。這一直延續(xù)到再發(fā)生意外事件為止或者已經(jīng)翻譯和執(zhí)行單條目標(biāo)指令為止。在一個(gè)實(shí)施例中,如果在執(zhí)行目標(biāo)指令翻譯時(shí)沒有產(chǎn)生意外事件,則工作寄存器的狀態(tài)被轉(zhuǎn)移至目標(biāo)寄存器并且門控存儲(chǔ)緩沖器內(nèi)的數(shù)據(jù)被調(diào)撥從而可以轉(zhuǎn)移至存儲(chǔ)器。但是如果在翻譯指令運(yùn)行期間再次發(fā)生意外事件,則目標(biāo)寄存器和存儲(chǔ)器的狀態(tài)未變化而是與發(fā)生意外事件時(shí)目標(biāo)計(jì)算機(jī)內(nèi)產(chǎn)生的狀態(tài)一致。因此當(dāng)產(chǎn)生目標(biāo)意外事件時(shí),意外事件將由目標(biāo)操作系統(tǒng)正確處理。
同樣,一旦指令系列在翻譯時(shí)產(chǎn)生意外事件的第一條目標(biāo)指令執(zhí)行時(shí)未發(fā)生意外事件,則目標(biāo)指令指針指向下一目標(biāo)指令。這第二條目標(biāo)指令與第一條指令的處理方式一樣,只作譯碼和重新翻譯而不進(jìn)行優(yōu)化或重新排序。隨著詞態(tài)主機(jī)處理單條目標(biāo)指令的每條主翻譯指令,當(dāng)目標(biāo)寄存器和存儲(chǔ)器的狀態(tài)與目標(biāo)計(jì)算機(jī)內(nèi)發(fā)生的狀態(tài)一致時(shí)將產(chǎn)生意外事件。因此意外事件得到立即而正確的處理。這些新的翻譯指令可以存儲(chǔ)在翻譯緩沖器內(nèi)作為目標(biāo)應(yīng)用程序內(nèi)指令序列的正確翻譯結(jié)果,并在指令再次執(zhí)行時(shí)被再次調(diào)用。
完成與圖5門控存儲(chǔ)緩沖器同樣結(jié)果的其它實(shí)施例包括這樣的方案,它將存儲(chǔ)內(nèi)容直接轉(zhuǎn)移至存儲(chǔ)器而與此同時(shí)記錄足夠的數(shù)據(jù)以恢復(fù)目標(biāo)計(jì)算機(jī)的狀態(tài)如果在意外事件或者錯(cuò)誤需要返回時(shí)執(zhí)行翻譯結(jié)果。在這種情況下,任何在翻譯和執(zhí)行期間發(fā)生的存儲(chǔ)器存儲(chǔ)內(nèi)容的影響都不得不逆轉(zhuǎn)過來并且恢復(fù)翻譯開始時(shí)存儲(chǔ)器的狀態(tài);與此同時(shí)工作寄存器必須以上述方式接收正式目標(biāo)寄存器內(nèi)保存的數(shù)據(jù)。在實(shí)現(xiàn)這項(xiàng)操作的一個(gè)實(shí)施例中,維持一個(gè)分立的目標(biāo)存儲(chǔ)器保存原始的存儲(chǔ)器狀態(tài),如果需要返回,則該狀態(tài)被用來代替改寫的存儲(chǔ)器內(nèi)容。在實(shí)現(xiàn)存儲(chǔ)器返回的另一實(shí)施例中,在每條存儲(chǔ)和存儲(chǔ)器數(shù)據(jù)被替換時(shí)對(duì)它們進(jìn)行登錄并在需要返回時(shí)使存儲(chǔ)過程逆向進(jìn)行。
實(shí)現(xiàn)上面詳述的門控存儲(chǔ)緩沖器存在許多問題。例如,在微處理器運(yùn)行期間數(shù)據(jù)可以經(jīng)常地存儲(chǔ)在同一存儲(chǔ)器地址上。在這種存儲(chǔ)數(shù)據(jù)實(shí)際傳送至存儲(chǔ)器之前的任意時(shí)刻,微處理器可能需要將數(shù)據(jù)用于其它操作。通常情況下,所應(yīng)該用的數(shù)據(jù)是最新可得到的有效的數(shù)據(jù)。在典型的存儲(chǔ)緩沖器中,轉(zhuǎn)移至緩沖器內(nèi)同一存儲(chǔ)器地址的數(shù)據(jù)作為已在緩沖器內(nèi)的數(shù)據(jù)的地址通常存儲(chǔ)在舊數(shù)據(jù)的位置上。因此,無需搜索該地址上的有效數(shù)據(jù)就可以立即從緩沖器調(diào)用最新的數(shù)據(jù)。
但是由于緩沖器專門設(shè)計(jì)為保存還未完成操作的存儲(chǔ)內(nèi)容,所以上述門控存儲(chǔ)器要做到上述情況是不可能的。在這些存儲(chǔ)內(nèi)容調(diào)撥入存儲(chǔ)器之前,必須確定產(chǎn)生存儲(chǔ)內(nèi)容的指令序列是否正確執(zhí)行。因此,通過將緩沖器內(nèi)較近發(fā)生的存儲(chǔ)器內(nèi)容代替已經(jīng)調(diào)入的較早存儲(chǔ)器內(nèi)容,將在完成產(chǎn)生新存儲(chǔ)數(shù)據(jù)的主指令執(zhí)行之前高效率地調(diào)撥新的存儲(chǔ)數(shù)據(jù)而不會(huì)發(fā)生意外事件。這完全與門控存儲(chǔ)緩沖器的用途背道而馳。
因此,在門控存儲(chǔ)緩沖器的一個(gè)實(shí)施例中,新的存儲(chǔ)器內(nèi)容并不代替同一地址上舊的存儲(chǔ)內(nèi)容,而當(dāng)它們產(chǎn)生時(shí)是按順序存儲(chǔ)在緩沖器的分立的部分或隔離的部分;而且在任意時(shí)刻,門控存儲(chǔ)緩沖器內(nèi)可能有多個(gè)存儲(chǔ)內(nèi)容存儲(chǔ)至同一存儲(chǔ)器地址,有些是調(diào)撥入存儲(chǔ)器而其它一些還未調(diào)撥。門控存儲(chǔ)緩沖器內(nèi)每個(gè)存儲(chǔ)位置包括一些存儲(chǔ)位置內(nèi)數(shù)據(jù)有效性的標(biāo)記。在圖13所示的邏輯布局實(shí)施例中,對(duì)于門控存儲(chǔ)緩沖器存儲(chǔ)位置上的每個(gè)數(shù)據(jù)字節(jié)(實(shí)施例中可尋址的最小數(shù)據(jù)量)提供了有效位(用V表示的列)。一般采用64位存儲(chǔ)每個(gè)緩沖器存儲(chǔ)位置上的數(shù)據(jù),因此緩沖器內(nèi)每個(gè)存儲(chǔ)位置包括帶自身有效位的8個(gè)單獨(dú)字節(jié)。
為了區(qū)分保存在緩沖器內(nèi)存儲(chǔ)器地址上最近存儲(chǔ)的數(shù)據(jù),每個(gè)存儲(chǔ)位置的每個(gè)字節(jié)提供了第一位(用M指定的列),它被用于指示該字節(jié)是存儲(chǔ)器地址上最近的數(shù)據(jù)字節(jié)。每個(gè)存儲(chǔ)位置包括比較電路系統(tǒng),它測(cè)試存儲(chǔ)器地址(包括字節(jié)地址)和每個(gè)新寫入門控存儲(chǔ)緩沖器的控制位。當(dāng)新數(shù)據(jù)存儲(chǔ)在存儲(chǔ)緩沖器的存儲(chǔ)位置時(shí),新存儲(chǔ)數(shù)據(jù)的每個(gè)字節(jié)包含所聲明的最近存儲(chǔ)位。如果新存儲(chǔ)數(shù)據(jù)的存儲(chǔ)器地址與門控存儲(chǔ)緩沖器內(nèi)有效數(shù)據(jù)的存儲(chǔ)器地址一致,則比較電路系統(tǒng)根據(jù)字節(jié)確定這一點(diǎn)并去除先前最近存儲(chǔ)的同一存儲(chǔ)器地址上任何字節(jié)的最近位標(biāo)記。這樣,通過在特定存儲(chǔ)器地址用其所聲明的最近位檢測(cè)數(shù)據(jù)可以滿足將最近數(shù)據(jù)加載至存儲(chǔ)器地址的需要。
在本實(shí)施例中顯而易見的是,替代現(xiàn)有技術(shù)中在門控存緩沖器的存儲(chǔ)器地址上存儲(chǔ)的舊數(shù)據(jù),為了從該地址加載至微處理器寄存器,通過去除舊的最近位標(biāo)記消除了舊數(shù)據(jù)。去除被訪問存儲(chǔ)器地址上字節(jié)的最近位標(biāo)記使得該字節(jié)被忽略而用最近位標(biāo)記的同一地址的字節(jié)從存儲(chǔ)緩沖器內(nèi)讀取作加載操作。同時(shí),存儲(chǔ)位置上不再有最近位標(biāo)記的數(shù)據(jù)保存在存儲(chǔ)緩沖器內(nèi)從而可以最終按照門控存儲(chǔ)緩沖器內(nèi)的順序排序調(diào)撥入存儲(chǔ)器。
由于為了以上述方式加速微處理器的性能,門控存儲(chǔ)緩沖器內(nèi)的數(shù)據(jù)受調(diào)撥和返回操作的支配,所以在返回操作期間未調(diào)撥存儲(chǔ)的數(shù)據(jù)可以轉(zhuǎn)儲(chǔ)(消除)。該數(shù)據(jù)總是比保存在門控存儲(chǔ)緩沖器的同一存儲(chǔ)器地址上任何的調(diào)撥數(shù)據(jù)更新。因此如果調(diào)撥數(shù)據(jù)存在于門控存儲(chǔ)緩沖器相同存儲(chǔ)器地址的另一存儲(chǔ)位置上作為被轉(zhuǎn)儲(chǔ)的未調(diào)撥數(shù)據(jù),則在返回之后,存儲(chǔ)器地址上的最新調(diào)撥數(shù)據(jù)在存儲(chǔ)緩沖器的存儲(chǔ)器地址上仍然是最新的并且應(yīng)該這樣標(biāo)明。但是當(dāng)在門控存儲(chǔ)緩沖器內(nèi)同一地址上,放置較新的未調(diào)撥數(shù)據(jù)(已經(jīng)被轉(zhuǎn)儲(chǔ))時(shí),將去除該調(diào)撥數(shù)據(jù)的最新位標(biāo)記。
為了確保存儲(chǔ)器地址的最新數(shù)據(jù)在返回和調(diào)撥操作后保持正確的指定,每個(gè)字節(jié)不僅有一個(gè)最近位位置而且還有第二個(gè)“屏蔽最近位”位置(圖13中用“S”指定)。當(dāng)通過將門位置移動(dòng)至緩沖器尾部來調(diào)撥門控存儲(chǔ)緩沖器內(nèi)一個(gè)或多個(gè)存儲(chǔ)位置上的數(shù)據(jù)時(shí),存儲(chǔ)在緩沖器內(nèi)每個(gè)地址上的最近數(shù)據(jù)包含被標(biāo)記的屏蔽最新位并且與此同時(shí)去除同一存儲(chǔ)器地址上其它數(shù)據(jù)的屏蔽最近位標(biāo)記。當(dāng)這情況發(fā)生的時(shí)刻,新調(diào)撥的數(shù)據(jù)實(shí)際上是存儲(chǔ)器地址上的最近數(shù)據(jù),所以所需要的是將與被調(diào)撥的每個(gè)存儲(chǔ)位置的每個(gè)字節(jié)相關(guān)的最近位復(fù)制到該字節(jié)的屏蔽最近位。當(dāng)較新的數(shù)據(jù)被寫入同一存儲(chǔ)器地址的存儲(chǔ)緩沖器時(shí),被調(diào)撥數(shù)據(jù)的最近位被去除標(biāo)記而屏蔽最近位仍然保留標(biāo)記。隨后,如果接著發(fā)生返回從而使得更近的調(diào)撥至該地址的數(shù)據(jù)被轉(zhuǎn)儲(chǔ),則被調(diào)撥數(shù)據(jù)最近的屏蔽最近位被復(fù)制至調(diào)撥字節(jié)的最近位位置從而正確指示最近調(diào)撥數(shù)據(jù)實(shí)際上是最近的存儲(chǔ)數(shù)據(jù)。
因此在上述實(shí)施例中,顯而易見的是用來寫入門控存儲(chǔ)緩沖器的邏輯將新數(shù)據(jù)寫入下一存儲(chǔ)器位置并賦予寫入該存儲(chǔ)位置的每個(gè)字節(jié)以有效和最近位標(biāo)記。邏輯比較寫入緩沖器內(nèi)存儲(chǔ)位置的存儲(chǔ)器地址的數(shù)據(jù)的存儲(chǔ)器地址以確定該地址上的舊數(shù)據(jù)是否在緩沖器內(nèi)。如果發(fā)現(xiàn)這樣的數(shù)據(jù),則去除該地址的舊數(shù)據(jù)的最近位標(biāo)記。在調(diào)撥操作中,所有帶最近位標(biāo)記的數(shù)據(jù)包含屏蔽最近位標(biāo)記;并且所有帶屏蔽最近位標(biāo)記的數(shù)據(jù)包含去除的位標(biāo)記。在返回操作中,未調(diào)撥數(shù)據(jù)被轉(zhuǎn)儲(chǔ)并且對(duì)帶屏蔽最近位的調(diào)撥數(shù)據(jù)作最近位標(biāo)記。
圖示的實(shí)施例可以利用新增的寄存器將指針存儲(chǔ)到存儲(chǔ)器存儲(chǔ)位置。接下來將抽取該存儲(chǔ)位置的數(shù)據(jù)主存儲(chǔ)器,從而使得數(shù)據(jù)被依次抽取入存儲(chǔ)器。隨著將每個(gè)存儲(chǔ)位置上的數(shù)據(jù)抽取至存儲(chǔ)器,為了保持正確的抽取序列,該數(shù)據(jù)的有效位、最近位和陰影最近位被清除。為了通過利用邏輯比較所有存儲(chǔ)到每個(gè)存儲(chǔ)器地址上的調(diào)撥數(shù)據(jù)并只抽取存儲(chǔ)器地址的最近調(diào)撥數(shù)據(jù)至存儲(chǔ)器而忽略不是最近的調(diào)撥數(shù)據(jù)來縮短抽取至存儲(chǔ)器的操作,也可以采用指向被抽取存儲(chǔ)位置的新增寄存器。
圖14示出了門控存儲(chǔ)緩沖器的第二實(shí)施例。該實(shí)施例利用多組存儲(chǔ)位置,每組保存足夠數(shù)量的存儲(chǔ)位置來保存目標(biāo)指令序列典型的完整翻譯產(chǎn)生的存儲(chǔ)內(nèi)容,一個(gè)以上的組被用來存儲(chǔ)翻譯指令。與圖13的實(shí)施例一樣,一組中的每個(gè)存儲(chǔ)位置保存存儲(chǔ)數(shù)據(jù)的多個(gè)字節(jié)、存儲(chǔ)器地址和每個(gè)字節(jié)的有效位。每組存儲(chǔ)位置可以指定為工作組(例如通過賦予組以位W),其中當(dāng)前存儲(chǔ)了所產(chǎn)生的存儲(chǔ)數(shù)據(jù)。工作組中的數(shù)據(jù)全部未被調(diào)撥。但是每組排列為相關(guān)的高速緩沖存儲(chǔ)器尋址從而使新的寫入特定存儲(chǔ)器地址的存儲(chǔ)數(shù)據(jù)覆蓋已存在于工作組內(nèi)的舊存儲(chǔ)數(shù)據(jù)并寫入同一存儲(chǔ)器地址。在所示實(shí)施例中是利用在每個(gè)存儲(chǔ)位置上的比較器完成的。這樣,在存儲(chǔ)位置組的僅僅一個(gè)存儲(chǔ)位置上有尋址至存儲(chǔ)在組內(nèi)的任何存儲(chǔ)器地址的數(shù)據(jù)。因此如果數(shù)據(jù)需要在調(diào)撥前由主處理器加載,則可以通過測(cè)試組內(nèi)存儲(chǔ)器地址尋找。這省去了前面實(shí)施例中所用的最近位和屏蔽最近位。
如果執(zhí)行目標(biāo)指令序列而不產(chǎn)生意外事件,則工作組內(nèi)該序列產(chǎn)生的數(shù)據(jù)存儲(chǔ)內(nèi)容被一起調(diào)撥。利用標(biāo)記與存儲(chǔ)位置特定組相關(guān)的調(diào)撥位(位C)并去除該組的工作位(位W)可以完成這種調(diào)撥(它等效于前述實(shí)施例中將門指針移向尾部指針的位置)。一旦調(diào)撥了一組存儲(chǔ)位置,這些存儲(chǔ)位置上的數(shù)據(jù)就保留在該組內(nèi)直到被抽取至存儲(chǔ)器。因此省去了保存首部、門和尾部指針以指定調(diào)撥或未調(diào)撥存儲(chǔ)內(nèi)容的電路系統(tǒng)而利用工作和調(diào)撥位獲得同樣的結(jié)果。
因此如果在執(zhí)行翻譯的目標(biāo)指令序列時(shí)產(chǎn)生了需要返回的意外事件,則簡(jiǎn)單地消除存儲(chǔ)在工作組內(nèi)的數(shù)據(jù)(轉(zhuǎn)儲(chǔ))。例如為此可以去除作為W位存儲(chǔ)的工作指示而不去除調(diào)撥位來實(shí)現(xiàn)。實(shí)際上,去除工作指示等效于前面實(shí)施例中將尾部指針移動(dòng)至門指針位置。
上述兩個(gè)實(shí)施例的各種組合對(duì)于本領(lǐng)域內(nèi)技術(shù)人員來說是顯而易見的。例如利用允許只在門與尾部(數(shù)據(jù)還未調(diào)撥)之間的存儲(chǔ)位置內(nèi)用新數(shù)據(jù)存儲(chǔ)內(nèi)容覆蓋舊數(shù)據(jù)的邏輯可以縮小第一實(shí)施例的規(guī)模。同樣,可以利用邏輯檢測(cè)同一地址的所有經(jīng)調(diào)撥的存儲(chǔ)內(nèi)容并按照上面的表示利用抽取指針指向最近調(diào)撥數(shù)據(jù)的方式僅僅將最近(字節(jié))寫入存儲(chǔ)器。
也可以將上述實(shí)施例的細(xì)節(jié)與典型的處理器高速緩沖存儲(chǔ)器結(jié)合從而用單一電路完成兩種用途。在這種情況下,需要提供手段來指示存儲(chǔ)調(diào)撥的和未調(diào)撥的存儲(chǔ)器內(nèi)容的高速緩存以及其它控制指示符的指示線。
代碼詞態(tài)軟件提供了一項(xiàng)新增的操作,它大大加快了被翻譯的處理程序的速度。除了簡(jiǎn)單翻譯指令、優(yōu)化、重新排序、重新安排、高速緩存和執(zhí)行每條翻譯指令從而可以在需要執(zhí)行該組指令時(shí)再次運(yùn)行以外,翻譯器還鏈接不同的翻譯結(jié)果以在絕大多數(shù)情況下避免返回翻譯過程的主循環(huán)。圖8示出了完成鏈接過程的代碼詞態(tài)化軟件翻譯器部分所執(zhí)行的步驟。對(duì)于本領(lǐng)域內(nèi)的普通技術(shù)人員來說,顯而易見的是這種鏈接操作基本上在大多數(shù)指令翻譯時(shí)避免了返回主循環(huán),這節(jié)約了開銷。
為了示例的目的的運(yùn)行的目標(biāo)程序由X86指令組成。當(dāng)翻譯目標(biāo)指令序列并且重新排序和重新安排基本主指令時(shí),可能在每條主翻譯指令結(jié)束產(chǎn)生兩條基本主指令。第一條是一基本指令,它更新目標(biāo)處理器的指令指針(或其等效的)的值;該指令用來將下一目標(biāo)指令的正確地址放入目標(biāo)指令指針寄存器。該基本指令之后是一條轉(zhuǎn)移指令,它包含轉(zhuǎn)移的兩種可能目標(biāo)中的每一個(gè)的地址。處理轉(zhuǎn)移指令的基本指令可以更新目標(biāo)處理器的指令指針值,其方式是測(cè)試在條件代碼寄存器內(nèi)的轉(zhuǎn)移條件代碼,并隨后確定控制轉(zhuǎn)移的條件所指示的兩個(gè)轉(zhuǎn)移地址中一個(gè)是否存入翻譯緩沖器內(nèi)。第一次翻譯目標(biāo)指令序列時(shí),主指令的兩個(gè)轉(zhuǎn)移目標(biāo)都保存翻譯機(jī)軟件主循環(huán)的同一主處理器地址。
當(dāng)主翻譯指令完成翻譯,存儲(chǔ)在翻譯緩沖器并第一次執(zhí)行時(shí),目標(biāo)指令指針寄存器(作為其余目標(biāo)寄存器)內(nèi)的指令指針得到更新;并且操作轉(zhuǎn)移返回主循環(huán)。在主循環(huán)內(nèi),翻譯器軟件在目標(biāo)指令指針寄存器內(nèi)查找指向下一目標(biāo)指令的指令指針。隨后對(duì)下一目標(biāo)指令序列尋址。假定尚未對(duì)該目標(biāo)指令序列進(jìn)行過翻譯,因此在翻譯緩沖器內(nèi)未駐留翻譯指令,則從存儲(chǔ)器讀取下一組目標(biāo)指令,對(duì)其譯碼、翻譯、優(yōu)化、重新排序、重新安排、高速緩存入翻譯緩沖器并予以執(zhí)行。由于第二組目標(biāo)指令跟隨在第一組目標(biāo)指令之后,所以第一組目標(biāo)指令的主翻譯結(jié)束處的基本轉(zhuǎn)移指令就被自動(dòng)更新替代為第二組目標(biāo)指令的主翻譯指令地址成為控制轉(zhuǎn)移的特定條件轉(zhuǎn)移地址。
如果這樣,則第二經(jīng)翻譯主指令循環(huán)返回到第一條經(jīng)翻譯的主指令,第二翻譯指令結(jié)束處的轉(zhuǎn)移操作包含主循環(huán)地址和第一條翻譯指令的X86地址作為轉(zhuǎn)移兩種可能的目標(biāo)。前述轉(zhuǎn)移的更新指令指針基本操作測(cè)試狀態(tài)并確定循環(huán)返回到第一翻譯指令以及將目標(biāo)指令指針更新為第一條翻譯指令的X86地址。這使得翻譯器在翻譯緩沖器內(nèi)查找以確定所尋找的X86地址是否在那里出現(xiàn)。第一條翻譯指令的地址被找到,并且它在主機(jī)存儲(chǔ)器空間內(nèi)的值被第二條主翻譯指令結(jié)束時(shí)轉(zhuǎn)移中的X86地址上的值替換。隨后第二主翻譯指令被高速緩存和執(zhí)行。這使得循環(huán)延續(xù)下去直到從第一條翻譯指令轉(zhuǎn)移到第二條翻譯指令的條件失敗,并且轉(zhuǎn)移取道返回主循環(huán)。當(dāng)發(fā)生這種情況時(shí),第一條翻譯主指令轉(zhuǎn)移返回主循環(huán),從而在翻譯緩沖器內(nèi)搜索目標(biāo)指令指針指定的下一組目標(biāo)指令,從高速緩存中讀取主指令;或者在翻譯緩沖器內(nèi)找不到,則從存儲(chǔ)器內(nèi)讀取該目標(biāo)指令并進(jìn)行翻譯。當(dāng)該經(jīng)過翻譯的主指令高速緩存入翻譯緩沖器內(nèi)時(shí),其地址代替了結(jié)束循環(huán)的轉(zhuǎn)移指令內(nèi)的主循環(huán)地址。
這樣,各種翻譯主指令被互相鏈接起來,因此只有在這種鏈接不存在時(shí)才需要?dú)v經(jīng)通過翻譯器主循環(huán)的長(zhǎng)路徑。最終,主指令的轉(zhuǎn)移指令內(nèi)主循環(huán)參考地址幾乎可以完全省略。當(dāng)達(dá)到該條件時(shí),在運(yùn)行任何主指令之前讀取目標(biāo)指令、譯碼目標(biāo)指令譯碼、讀取構(gòu)成目標(biāo)指令的基本指令、優(yōu)化這些基本操作、基本操作重新排序和這些基本操作重新安排所需的時(shí)間可以省去。因此與所有每次執(zhí)行應(yīng)用程序指令時(shí)必須執(zhí)行這些步驟的每一步的所有現(xiàn)有技術(shù)微處理器相反,利用改進(jìn)型微處理器在第一條翻譯指令執(zhí)行之后運(yùn)行任意目標(biāo)指令組所需的工作量大為減少。當(dāng)每組經(jīng)翻譯的主指令與其它組經(jīng)翻譯的主指令都鏈接起來時(shí),工作量可進(jìn)一步減少。實(shí)際上,據(jù)估計(jì)在應(yīng)用程序運(yùn)行期間一百萬條翻譯指令需要執(zhí)行的翻譯次數(shù)不超過一次。
本領(lǐng)域內(nèi)技術(shù)人員將會(huì)發(fā)現(xiàn),由于為了避免再次翻譯,被翻譯的每組指令都被高速緩存,所以微處理器需要大量的翻譯緩沖器。針對(duì)不同系統(tǒng)編程的應(yīng)用程序功能而設(shè)計(jì)的翻譯機(jī)將根據(jù)支持的緩沖存儲(chǔ)器不同而有所不同。但是針對(duì)運(yùn)行X86程序設(shè)計(jì)的微處理器實(shí)施例采用2Mb的隨機(jī)存儲(chǔ)器作為翻譯緩沖器。
兩種新增的硬件增強(qiáng)手段有助于提高本發(fā)明微處理器處理應(yīng)用程序的速度。第一種手段是將異常/正常(A/N)保護(hù)位,與每條地址翻譯指令一起存儲(chǔ)在翻譯指令旁視緩沖器(TLB)(參見圖3)中,在上述緩沖器中首先查找目標(biāo)指令的物理地址。翻譯指令內(nèi)的目標(biāo)存儲(chǔ)器操作可以分為兩類,一種是對(duì)存儲(chǔ)器操作(正常操作)而另一種是對(duì)存儲(chǔ)器映象I/O設(shè)備操作(異常操作)。
作用于存儲(chǔ)器的正常存取以正常方式完成。當(dāng)指令在存儲(chǔ)器上操作時(shí),指令的優(yōu)化和重新排序是有益的并且大大加快了利用本發(fā)明微處理器的任何系統(tǒng)的操作。另一方面,作用于I/O設(shè)備的異常存取操作經(jīng)常必須按照這些操作編程時(shí)的精確順序進(jìn)行而不能省略任何步驟,否則對(duì)I/O設(shè)備有不利的影響。例如某一特定的I/O操作可能是清除I/O寄存器;如果基本操作順序出錯(cuò),則操作結(jié)果可能會(huì)不同于目標(biāo)指令命令的操作。由于沒有區(qū)分存儲(chǔ)器和存儲(chǔ)器映象I/O的裝置,所以要用作用于存儲(chǔ)器映象I/O的翻譯指令所用的保守假設(shè)處理所有的存儲(chǔ)器。這大大限制了優(yōu)化所能達(dá)到的性能。由于現(xiàn)有技術(shù)仿真器沒有檢測(cè)被尋址存儲(chǔ)器性質(zhì)預(yù)測(cè)失效的裝置和從這類失效中恢復(fù)過來的裝置,所以其性能受到限制。
在圖11所示的微處理器實(shí)施例中,A/N位是可以在翻譯旁視緩沖器內(nèi)設(shè)定的位,以指示是存儲(chǔ)器頁面還是存儲(chǔ)器映象I/O。翻譯旁視緩沖器存儲(chǔ)用于存儲(chǔ)器存取的頁表項(xiàng)。每一項(xiàng)包括被存取的虛擬地址和可以用以找到數(shù)據(jù)的物理地址以及其它有關(guān)該項(xiàng)的信息。A/N位屬于其它信息部分并且表示物理地址是存儲(chǔ)器地址還是存儲(chǔ)器映象I/O地址。盡管作用于存儲(chǔ)器的操作似乎屬于存儲(chǔ)器操作的翻譯,但是實(shí)際上該操作的翻譯是預(yù)測(cè)其作用于存儲(chǔ)器。在一個(gè)實(shí)施例中,當(dāng)代碼詞態(tài)化軟件首先試圖執(zhí)行需要訪問存儲(chǔ)器或存儲(chǔ)器映象I/O設(shè)備的指令翻譯時(shí),它實(shí)際上假定該存取是存儲(chǔ)器存取。在另一實(shí)施例中,軟件可能假定目標(biāo)指令需要進(jìn)行I/O存取。假定在此之前未對(duì)該地址進(jìn)行過訪問,則在翻譯旁視緩沖器中將沒有相應(yīng)的頁表項(xiàng);并且在翻譯旁視緩沖器中的存取失敗。這種失敗使得軟件進(jìn)行頁表查找并將頁表項(xiàng)填入翻譯旁視緩沖器的存儲(chǔ)位置以向虛擬地址提供正確的物理地址翻譯結(jié)果。此后,軟件將物理地址的A/N位輸入翻譯旁視緩沖器內(nèi)。隨后假定訪問的是存儲(chǔ)器地址,則試圖進(jìn)行再一次的存取。當(dāng)試圖進(jìn)行存取時(shí),通過將預(yù)先假定的存取類型(正?;虍惓?與TLB頁表項(xiàng)內(nèi)的A/N保護(hù)位比較,檢驗(yàn)?zāi)繕?biāo)存儲(chǔ)器的參考地址。當(dāng)存取類型與A/N保護(hù)不一致時(shí),發(fā)生意外事件。如果操作實(shí)際上作用于存儲(chǔ)器,則在翻譯期間可以正確應(yīng)用上述優(yōu)化、重新排序和重新安排技術(shù)。如果與TLB中A/N位的比較表明操作作用于I/O設(shè)備,則操作的執(zhí)行導(dǎo)致意外事件;并且翻譯器一次產(chǎn)生一條目標(biāo)指令的新翻譯結(jié)果而不進(jìn)行優(yōu)化、重新排序或者重新安排等。同樣,如果翻譯時(shí)錯(cuò)誤地將實(shí)際上作用于存儲(chǔ)器的操作假定為I/O操作,則操作的執(zhí)行導(dǎo)致意外事件;并且利用優(yōu)化、重新排序和重新安排技術(shù)重新翻譯目標(biāo)指令。這樣處理器可以出乎尋常地提高性能。
本領(lǐng)域內(nèi)的技術(shù)人員將會(huì)發(fā)現(xiàn),利用A/N位來確定有關(guān)存儲(chǔ)器訪問還是存儲(chǔ)器映象I/O設(shè)備訪問的預(yù)測(cè)是否失敗的技術(shù)也可以用來預(yù)測(cè)存儲(chǔ)器映象地址的其它性質(zhì)。例如可以利用這種正常/異常位來區(qū)分不同類型的存儲(chǔ)器。本領(lǐng)域內(nèi)技術(shù)人員還可以找到區(qū)分存儲(chǔ)器性質(zhì)的其它類似用途。
改進(jìn)型微處理器預(yù)測(cè)最多的是翻譯內(nèi)是否發(fā)生目標(biāo)意外事件。這使得與現(xiàn)有技術(shù)相比作了明顯的優(yōu)化。首先,目標(biāo)狀態(tài)不必在每條目標(biāo)指令邊界上更新而只需在發(fā)生在翻譯邊界的目標(biāo)指令邊界上更新。這省略了在每條目標(biāo)指令邊界上保存目標(biāo)狀態(tài)所需的指令。原先無法對(duì)安排和去除冗余操作所作的優(yōu)化現(xiàn)在也變得可行起來。
改進(jìn)的微處理器適于選擇合適的翻譯過程。按照上述翻譯方法,盡管一組指令是作用于存儲(chǔ)器的,但是仍然可以先進(jìn)行翻譯。然后當(dāng)優(yōu)化、重新排序和重新安排主指令時(shí),利用翻譯旁視緩沖器內(nèi)提供的A/N位狀態(tài)可能發(fā)現(xiàn)是I/O設(shè)備的地址。A/N位與表示I/O操作的翻譯指令地址進(jìn)行比較后產(chǎn)生錯(cuò)誤意外事件,啟動(dòng)軟件初始返回儲(chǔ)程序,引起未調(diào)撥的存儲(chǔ)器存儲(chǔ)內(nèi)容轉(zhuǎn)儲(chǔ)并將目標(biāo)寄存器內(nèi)的值放回到工作寄存器。隨后一次對(duì)一條目標(biāo)指令進(jìn)行翻譯而不進(jìn)行優(yōu)化、重新排序或者重新安排。這種重新翻譯適合于對(duì)I/O設(shè)備進(jìn)行主翻譯。
同樣,也可能將存儲(chǔ)器操作錯(cuò)誤地翻譯為I/O操作。所產(chǎn)生的錯(cuò)誤可以用來引發(fā)正確的重新翻譯,對(duì)指令進(jìn)行優(yōu)化、重新排序和重新安排以提供更快的操作。
現(xiàn)有技術(shù)仿真器對(duì)稱為自修改代碼的問題一直比較棘手。如果目標(biāo)程序向包含目標(biāo)指令的存儲(chǔ)器寫入內(nèi)容,這將導(dǎo)致目標(biāo)指令已有的翻譯結(jié)果“過時(shí)”并不再有效。當(dāng)這些存儲(chǔ)器內(nèi)容動(dòng)態(tài)地發(fā)生時(shí)需要對(duì)它們進(jìn)行檢測(cè)。在現(xiàn)有技術(shù)中,這種檢測(cè)需要借助對(duì)每一存儲(chǔ)使用額外的指令完成。這個(gè)問題的范圍要超出程序本身的修改。任何能夠向存儲(chǔ)器寫入內(nèi)容的機(jī)構(gòu),例如第二處理器或DMA設(shè)備,也可能引起這個(gè)問題。
現(xiàn)在經(jīng)過改進(jìn)的微處理器通過另外的增強(qiáng)詞態(tài)主機(jī)的性能解決這個(gè)問題。可以用也存儲(chǔ)在翻譯旁視緩沖器內(nèi)的翻譯位(T位)來表示已存在翻譯結(jié)果的目標(biāo)存儲(chǔ)器頁面。T位可表示目標(biāo)存儲(chǔ)器特定頁面包含已存在主翻譯的目標(biāo)指令,如果對(duì)這些目標(biāo)指令重寫則它們將變得過時(shí)。如果試圖向存儲(chǔ)器內(nèi)被保護(hù)的頁面寫入內(nèi)容,則翻譯位的存在將引起意外事件,當(dāng)代碼詞態(tài)化軟件進(jìn)行處理時(shí)將使相當(dāng)?shù)姆g結(jié)果無效或者從翻譯緩沖器內(nèi)去除。T位還可以用來標(biāo)記其它目標(biāo)頁面使翻譯結(jié)果不被重寫。
借助圖3可以理解這一點(diǎn),它示出了本發(fā)明微處理器總體功能單元的框圖。當(dāng)詞態(tài)主機(jī)執(zhí)行目標(biāo)程序時(shí),實(shí)際上它運(yùn)行的是代碼詞態(tài)化軟件的翻譯器部分,它僅僅包括有效地運(yùn)行在詞態(tài)主機(jī)上的初始未翻譯主指令。圖中右邊示出存儲(chǔ)器,它被劃分為包含翻譯器和翻譯緩沖器的主機(jī)部分和包含目標(biāo)指令和數(shù)據(jù)(包括目標(biāo)操作系統(tǒng))的目標(biāo)部分。詞態(tài)主機(jī)硬件開始執(zhí)行翻譯器時(shí)從存儲(chǔ)器內(nèi)讀取主指令并將其放入指令高速緩存內(nèi)。翻譯器指令產(chǎn)生對(duì)存儲(chǔ)在存儲(chǔ)器目標(biāo)部分內(nèi)的第一條目標(biāo)指令的讀取指令。執(zhí)行目標(biāo)讀取指令使整數(shù)單元在正式目標(biāo)指令指針寄存器內(nèi)查找目標(biāo)指令的首地址。隨后在存儲(chǔ)器管理單元的翻譯旁視緩沖器內(nèi)訪問首地址。存儲(chǔ)器管理單元包括調(diào)度頁面的硬件并提供TLB的存儲(chǔ)器映象手段。假定TLB被正確地映象從而保存了目標(biāo)存儲(chǔ)器的正確頁面的查找數(shù)據(jù),則將目標(biāo)指令指針值翻譯為目標(biāo)指令的物理地址。此時(shí),對(duì)表示目標(biāo)指令是否完成翻譯的位(T位)狀態(tài)進(jìn)行檢測(cè);但是訪問是讀操作,并且不會(huì)發(fā)生T位意外事件。還檢測(cè)了表示是對(duì)存儲(chǔ)器還是對(duì)存儲(chǔ)器映象I/O訪問的A/N位的狀態(tài)。假定后面提及的位表示存儲(chǔ)器位置,則由于不存在翻譯結(jié)果,所以在目標(biāo)存儲(chǔ)器內(nèi)訪問目標(biāo)指令。將目標(biāo)指令和后續(xù)目標(biāo)指令作為數(shù)據(jù)轉(zhuǎn)移至詞態(tài)主機(jī)計(jì)算單元并在指令高速緩存內(nèi)存儲(chǔ)的翻譯器指令的控制下進(jìn)行翻譯。翻譯器指令采用重新排序、優(yōu)化和重新安排技術(shù),就好象處理作用于存儲(chǔ)器的目標(biāo)指令一樣。隨后將包含主指令序列的最終翻譯結(jié)果存儲(chǔ)在主存儲(chǔ)器的翻譯緩沖器內(nèi)。翻譯結(jié)果經(jīng)門控存儲(chǔ)緩沖器被直接轉(zhuǎn)送至主存儲(chǔ)器中的翻譯緩沖器內(nèi)。一旦將翻譯結(jié)果存儲(chǔ)在主存儲(chǔ)器內(nèi)之后,翻譯器轉(zhuǎn)入隨后執(zhí)行的翻譯。所執(zhí)行的操作(以及后續(xù)操作)確定翻譯是否對(duì)意外事件和存儲(chǔ)器作出了正確的假設(shè)。在執(zhí)行翻譯之前,對(duì)包含已翻譯目標(biāo)指令的目標(biāo)頁面的T位進(jìn)行設(shè)定。該指示提醒指令已經(jīng)翻譯;并且如果試圖向目標(biāo)地址寫入內(nèi)容,則將導(dǎo)致意外事件,可能使得翻譯結(jié)果無效或者被除去。
如果試圖向用T位標(biāo)記的目標(biāo)頁面寫入內(nèi)容,則產(chǎn)生意外事件并中止寫入。在意外事件的響應(yīng)確認(rèn)對(duì)寫入目標(biāo)存儲(chǔ)器地址有關(guān)的指令翻譯是無效的或者受到保護(hù)的,直到它們被適當(dāng)更新之后,寫入操作才可以繼續(xù)。由于沒有效的翻譯起作用,所以有些寫入操作實(shí)際上不需要做。其它的寫入操作則需要,做一條或更多與尋址的目標(biāo)存儲(chǔ)器相關(guān)的翻譯被適當(dāng)標(biāo)記或者去除。圖11示出了翻譯旁視緩沖器的實(shí)施例,包含保存T位指示的每條頁面項(xiàng)的存儲(chǔ)位置。
新增的加強(qiáng)詞態(tài)主機(jī)性能的硬件電路可以使正常存儲(chǔ)在存儲(chǔ)器內(nèi)但經(jīng)常用于操作執(zhí)行的數(shù)據(jù)在執(zhí)行單元寄存器內(nèi)被復(fù)制(或者“別名”)以便節(jié)省數(shù)據(jù)從存儲(chǔ)器內(nèi)讀取或存入存儲(chǔ)器內(nèi)的時(shí)間。例如如果存儲(chǔ)器內(nèi)的數(shù)據(jù)在代碼序列執(zhí)行期間經(jīng)常被重復(fù)使用,則在每次使用該數(shù)據(jù)時(shí)一般從存儲(chǔ)器內(nèi)將其調(diào)出并載入執(zhí)行單元內(nèi)的寄存器。為了減少這種頻繁的存儲(chǔ)器訪問所需的時(shí)間,在代碼序列執(zhí)行期間,數(shù)據(jù)可以在代碼序列開始時(shí)一次性地從存儲(chǔ)器載入執(zhí)行單元寄存器。該指定的寄存器在代碼序列繼續(xù)執(zhí)行期間起著代替存儲(chǔ)器的作用一旦這樣,每條將數(shù)據(jù)從指定的存儲(chǔ)器地址載入寄存器的加載操作就變?yōu)榧拇嫫?。與寄存器之間的復(fù)制操作,這使處理加快了許多;而且即使是復(fù)制操作,也可以經(jīng)常通過進(jìn)一步的優(yōu)化而省略。
同樣,在執(zhí)行代碼序列期間代碼序列的執(zhí)行常常需要將數(shù)據(jù)寫入存儲(chǔ)器地址。為了減少頻繁地將存儲(chǔ)器內(nèi)容數(shù)據(jù)寫入同一地址所需的時(shí)間,在執(zhí)行代碼序列期間,每次將數(shù)據(jù)寫入存儲(chǔ)器地址時(shí),都可以將其轉(zhuǎn)送至指定功能的執(zhí)行單元寄存器以在代碼序列繼續(xù)執(zhí)行期間代替存儲(chǔ)器空間。一旦指定了執(zhí)行單元寄存器,則每次數(shù)據(jù)更改都只需進(jìn)行簡(jiǎn)單的寄存器到寄存器之間的傳送操作,這比存入存儲(chǔ)器地址要快得多。
為了完成這些別名操作,改進(jìn)的微處理器提供了獨(dú)特的技術(shù)。在圖10所示的實(shí)施例中,詞態(tài)主機(jī)被設(shè)計(jì)為響應(yīng)針對(duì)指定存儲(chǔ)器地址的“加載和保護(hù)”命令,在執(zhí)行代碼序列時(shí)頻繁地使用該地址。詞態(tài)主機(jī)對(duì)執(zhí)行單元110內(nèi)保存存儲(chǔ)器數(shù)據(jù)的工作寄存器111進(jìn)行分配并將存儲(chǔ)器地址存入存儲(chǔ)器控制單元的特殊寄存器112內(nèi)。工作寄存器111可以是以此目的而分配的執(zhí)行單元內(nèi)許多寄存器中之一(例如圖4所示為8個(gè)工作寄存器)。
當(dāng)采用存儲(chǔ)器別名避免從存儲(chǔ)器地址將數(shù)據(jù)加載入執(zhí)行單元時(shí),存儲(chǔ)器地址上的數(shù)據(jù)首先被載入寄存器111而存儲(chǔ)器地址則被放入寄存器112。隨后,利用寄存器111內(nèi)的數(shù)據(jù)加速執(zhí)行代碼序列。在此期間,通常需要從保存在寄存器112內(nèi)的存儲(chǔ)器地址加載數(shù)據(jù)的每條操作都被從寄存器111復(fù)制數(shù)據(jù)所取代。這種操作一直延續(xù)到代碼序列執(zhí)行結(jié)束(或者以某種其他方式終止)并且去除存儲(chǔ)器空間保護(hù)為止。
同樣,為了加快執(zhí)行常常將數(shù)據(jù)從執(zhí)行單元110存到同一存儲(chǔ)器地址的代碼序列,可以采用類似的別名處理。“加載和保護(hù)”命令使存儲(chǔ)器地址放入寄存器112并將通常存儲(chǔ)在該存儲(chǔ)器地址上的數(shù)據(jù)轉(zhuǎn)移至工作寄存器111。例如在循環(huán)執(zhí)行的計(jì)算中通常將一系列數(shù)值存儲(chǔ)在同一存儲(chǔ)器地址上的計(jì)算中,通過分配保存數(shù)據(jù)的寄存器111并在寄存器112內(nèi)保存存儲(chǔ)器地址可以使存儲(chǔ)過程變?yōu)閳?zhí)行單元內(nèi)部的寄存器至寄存器之間的數(shù)據(jù)轉(zhuǎn)移。這種操作一直延續(xù)到代碼序列執(zhí)行結(jié)束(或者以某種其他方式終止),存儲(chǔ)空間被更新,并且去除存儲(chǔ)器空間保護(hù)為止。
雖然這些別名技術(shù)都大大提高了某些代碼序列的執(zhí)行速度,但是這些減少存儲(chǔ)器訪問的操作會(huì)引起相當(dāng)多的問題。如果主處理器操作的基本部分涉及目標(biāo)指令集與主指令集之間的指令翻譯時(shí)情況尤其如此。所有這些問題都涉及到需要確保指令執(zhí)行時(shí)使用的數(shù)據(jù)在使用時(shí)是有效的。
因存儲(chǔ)在存儲(chǔ)器地址上的數(shù)據(jù)與存儲(chǔ)在執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)不同而造成其中之一在某一時(shí)刻失效的例子很多。例如,如果工作寄存器111被用來保存代碼序列執(zhí)行期間經(jīng)常從存儲(chǔ)器加載到寄存器的數(shù)據(jù),則可能在完成利用執(zhí)行單元寄存器內(nèi)數(shù)據(jù)的代碼序列執(zhí)行完成以前將指令寫入存儲(chǔ)器地址。在這種情況下,代碼序列所使用的執(zhí)行單元寄存器內(nèi)數(shù)據(jù)將會(huì)過時(shí)并且必須更新。
作為另一個(gè)實(shí)例,如果工作寄存器被用來保存代碼序列執(zhí)行期間經(jīng)常存入存儲(chǔ)器地址上的數(shù)據(jù),則可以在利用執(zhí)行單元寄存器代替存儲(chǔ)器的代碼序列的執(zhí)行完成前將一條指令寫入存儲(chǔ)器地址。如果主處理器處于只在代碼序列執(zhí)行結(jié)束時(shí)正常地更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(回寫模式),則執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)將會(huì)過時(shí)并且必須用寫入存儲(chǔ)器地址的數(shù)據(jù)更新。當(dāng)然,如果主處理器處于每次將數(shù)據(jù)寫入執(zhí)行單元寄存器時(shí)正常更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(寫入模式),則寄存器與存儲(chǔ)器是一致的。
作為另一個(gè)實(shí)例,如果工作寄存器被用來保存代碼序列執(zhí)行期間經(jīng)常存入存儲(chǔ)器地址上的數(shù)據(jù),則指令可以在完成將數(shù)據(jù)轉(zhuǎn)移至寄存器111的代碼序列之前從存儲(chǔ)器地址上讀取數(shù)據(jù)。如果主處理器處于只在代碼序列執(zhí)行結(jié)束時(shí)正常地更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(回寫模式),則存儲(chǔ)器內(nèi)的數(shù)據(jù)將會(huì)過時(shí)并且在讀取之前必須用執(zhí)行單元寄存器內(nèi)數(shù)據(jù)更新。如上例所述,如果主處理器處于每次將數(shù)據(jù)寫入執(zhí)行單元寄存器時(shí)正常地更新存儲(chǔ)器地址上數(shù)據(jù)的功能模式(寫入模式),則寄存器與存儲(chǔ)器是一致的。
另一種可能性是由于詞態(tài)主機(jī)與代碼詞態(tài)化軟件組合形成的微處理器適于重新排序并重新安排以加快執(zhí)行速度,所以存儲(chǔ)器和別名寄存器內(nèi)保存的數(shù)據(jù)可能不一致。從下面代碼序列的各種實(shí)例可見,一旦在執(zhí)行單元寄存器內(nèi)的存儲(chǔ)器數(shù)據(jù)被賦予別名以用于代碼序列的執(zhí)行,則執(zhí)行單元寄存器內(nèi)數(shù)據(jù)就可以復(fù)制到其它寄存器內(nèi)并且可能對(duì)指令進(jìn)行重新排序和重新安排處理。如果有重新排序和重新安排處理,則代碼序列中的指令可能被寫入賦予別名的存儲(chǔ)器地址從而在進(jìn)一步使用之前必須更新執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)。但是,如果執(zhí)行單元寄存器111內(nèi)剛剛過時(shí)的數(shù)據(jù)已經(jīng)被復(fù)制到其它寄存器內(nèi)并且利用這些寄存器的指令的代碼序列已經(jīng)變動(dòng),則被復(fù)制的寄存器內(nèi)過時(shí)數(shù)據(jù)可能會(huì)在代碼序列執(zhí)行時(shí)使用。因此可能發(fā)生第二級(jí)不一致。
在加載和存儲(chǔ)操作后,未確認(rèn)存儲(chǔ)器地址上數(shù)據(jù)與寄存器111內(nèi)數(shù)據(jù)一致之前對(duì)受保護(hù)的存儲(chǔ)器地址保證不進(jìn)行加載和存儲(chǔ)操作,存儲(chǔ)器控制單元內(nèi)的比較器113與地址寄存器112相連。在翻譯期間,比較器113從存儲(chǔ)器接收加載地址并存儲(chǔ)到指向存儲(chǔ)器的門控存儲(chǔ)緩沖器。如果加載或存儲(chǔ)的存儲(chǔ)器地址與寄存器112(或者根據(jù)實(shí)施情況不同而是其它寄存器)內(nèi)的地址進(jìn)行比較,則根據(jù)模式的不同產(chǎn)生一定的意外事件。代碼詞態(tài)化軟件響應(yīng)意外事件,確保存儲(chǔ)器地址與執(zhí)行單元寄存器111保存同一正確數(shù)據(jù)。這可以糾正上述的不一致。
代碼詞態(tài)化軟件作出響應(yīng)的方式取決于特定的意外事件。如果是數(shù)據(jù)不一致,則在一個(gè)實(shí)施例中是返回翻譯并重新執(zhí)行,執(zhí)行單元寄存器內(nèi)沒有任何的“別名”數(shù)據(jù)。這種解決方案可以糾正存儲(chǔ)器與執(zhí)行單元寄存器數(shù)據(jù)的不一致和存儲(chǔ)器與在代碼序列重新排序和重新安排之前就被從執(zhí)行單元寄存器111復(fù)制到其它寄存器的數(shù)據(jù)的不一致。解決這個(gè)問題的其它可行方法是用最近的存儲(chǔ)器數(shù)據(jù)更新執(zhí)行單元寄存器或者用最近的加載數(shù)據(jù)更新存儲(chǔ)器。
在存儲(chǔ)器地址被賦予別名以避免從存取地址加載數(shù)據(jù)期間,由于執(zhí)行單元寄存器111內(nèi)的數(shù)據(jù)可能在新數(shù)據(jù)寫入存儲(chǔ)器地址時(shí)過時(shí),所以比較器試圖進(jìn)行存儲(chǔ)器地址的寫入操作。在這種情況下,比較器113檢測(cè)到寫入受保護(hù)的存儲(chǔ)器地址的意圖;并且如果有這種意圖就產(chǎn)生意外事件。意外事件使得在進(jìn)一步使用寄存器數(shù)據(jù)之前將存儲(chǔ)器內(nèi)的數(shù)據(jù)寫入寄存器111以更新寄存器,或者導(dǎo)致不使用執(zhí)行單元寄存器的代碼返回并執(zhí)行以完成別名優(yōu)化。這可能涉及目標(biāo)代碼的重新翻譯。
在存儲(chǔ)器地址被賦予別名以使順序存儲(chǔ)操作利用寄存器111表示存儲(chǔ)器地址期間,可能有一個(gè)命令禁止存儲(chǔ)數(shù)據(jù)到存儲(chǔ)器地址的意外事件的產(chǎn)生該命令將電路系統(tǒng)置于一種模式(寫入模式),在讀模式中未檢查別名就從寄存器111將數(shù)據(jù)存入存儲(chǔ)器地址從而使寄存器的數(shù)據(jù)重復(fù)寫入受保護(hù)的存儲(chǔ)器地址。
另一方面,在存儲(chǔ)器地址被賦予別名允許利用寄存器111表示存儲(chǔ)器地址的存儲(chǔ)操作期間,電路系統(tǒng)可以處于一種模式(回寫模式),應(yīng)該模式中存儲(chǔ)器地址上數(shù)據(jù)直到代碼序列執(zhí)行完畢或以其他方式終止時(shí)才更新。在這種模式下,寫入存儲(chǔ)器地址的指令可能需要更新保存在執(zhí)行單元寄存器內(nèi)的數(shù)據(jù)使之與新數(shù)據(jù)一致。另一方面,在這種模式下,試圖讀取存儲(chǔ)器地址的操作要求產(chǎn)生意外事件,從而可以在讀取數(shù)據(jù)之前使存儲(chǔ)器內(nèi)保存的數(shù)據(jù)更新為與執(zhí)行單元寄存器內(nèi)新數(shù)據(jù)一致。
圖12示出了包含比較器120的實(shí)施例的別名電路,比較器120用來檢測(cè)和控制對(duì)受保護(hù)存儲(chǔ)器的數(shù)據(jù)加載和存儲(chǔ)操作。比較器120包括多個(gè)存儲(chǔ)單元122(圖中只示出了一個(gè)),諸如內(nèi)容定址存儲(chǔ)器的作為受保護(hù)存儲(chǔ)器地址的輸入項(xiàng)。例如可以有8個(gè)存儲(chǔ)單元用于輸入項(xiàng)。每個(gè)輸入項(xiàng)包含足夠多數(shù)量的位位置(例如32個(gè))來存儲(chǔ)存儲(chǔ)器單元的物理地址、字節(jié)屏蔽和各種屬性位。在屬性位中有表示受保護(hù)存儲(chǔ)器大小的位和表示存儲(chǔ)器地址是正常還是異常的位。應(yīng)該指出的是,比較器120中輸入項(xiàng)的存儲(chǔ)單元的每一個(gè)都與圖10所示寄存器112等效,從而使得比較器120擔(dān)負(fù)起圖10的寄存器112和比較器113的功能。
別名電路還包括別名使能寄存器124、屏蔽別名使能寄存器的寄存器125、別名出錯(cuò)寄存器126、存儲(chǔ)別名電路使能指示(例如單個(gè)位)的寄存器127以及存儲(chǔ)模式位的寄存器128。
在操作中,受保護(hù)的物理地址連同字節(jié)屏蔽(表示哪些位置的字節(jié)受保護(hù)的位)一起存儲(chǔ)在輸入項(xiàng)的其中一個(gè)存儲(chǔ)單元內(nèi)。這種物理地址可以對(duì)64位的數(shù)據(jù)尋址,字節(jié)屏蔽的每個(gè)位表示該地址上數(shù)據(jù)的一個(gè)字節(jié)。受保護(hù)的特定輸入項(xiàng)通過設(shè)定硬件使能寄存器124的特定位表示。在翻譯期間當(dāng)允許返回翻譯時(shí),寄存器125屏蔽調(diào)撥時(shí)刻寄存器124內(nèi)的值。在所示實(shí)施例中,使能寄存器124和屏蔽使能寄存器實(shí)際上被分配為存儲(chǔ)單元122的屬性位。
當(dāng)寄存器127指示別名使能時(shí),根據(jù)寄存器128指示的設(shè)定模式的條件,比較器保存物理存儲(chǔ)器地址和字節(jié)屏蔽并用來檢測(cè)存儲(chǔ)器加載和存儲(chǔ)的存儲(chǔ)器地址。如果模式設(shè)定為寫入狀態(tài),則持續(xù)用執(zhí)行單元寄存器保存的受保護(hù)存儲(chǔ)器地址的數(shù)據(jù)更新存儲(chǔ)器,因此從該存儲(chǔ)器地址加載其它地址的數(shù)據(jù)一直是最新的數(shù)據(jù)并且無需檢驗(yàn)。但是將數(shù)據(jù)存入存儲(chǔ)器地址可能使執(zhí)行單元寄存器112內(nèi)的數(shù)據(jù)無效,因此必須測(cè)試這些存儲(chǔ)數(shù)據(jù)。如果將數(shù)據(jù)存儲(chǔ)在受保護(hù)的地址上并且字節(jié)屏蔽表明數(shù)據(jù)存儲(chǔ)在比較器120保存的存儲(chǔ)器地址的受保護(hù)字節(jié)上,則比較器產(chǎn)生別名意外事件以檢測(cè)寫入模式下的存儲(chǔ)操作。
另一方面,如果模式設(shè)定為回寫模式狀態(tài),則只有當(dāng)別名硬件釋放或者發(fā)生意外事件時(shí)才更新存儲(chǔ)器地址。因此存儲(chǔ)器地址上的數(shù)據(jù)可能過時(shí),因此在別名硬件處于使能狀態(tài)時(shí)必須檢測(cè)加載和存儲(chǔ)二種操作。為此,如果加載或存儲(chǔ)指向受保護(hù)地址并且其字節(jié)屏蔽表明被訪問的數(shù)據(jù)位于比較器120保存的存儲(chǔ)器地址的受保護(hù)字節(jié)上,則比較器產(chǎn)生別名意外事件。
兩種模式下發(fā)生的意外事件都在別名出錯(cuò)寄存器126內(nèi)設(shè)定合適的位以指定引起意外事件的地址。根據(jù)代碼詞態(tài)化軟件的特定意外事件處理器,所產(chǎn)生的特定的意外事件可以修復(fù)或者返回以解決這種問題。以修復(fù)解決問題的使得最新的數(shù)據(jù)被放入作用于執(zhí)行單元數(shù)據(jù)寄存器和存儲(chǔ)器地址的特定字節(jié)上。這包括使能寄存器124的狀態(tài)返回到寄存器125所保存的狀態(tài)。
以上描述了采用別名檢測(cè)硬件可以進(jìn)行減少加載和存儲(chǔ)操作的優(yōu)化并且可以在加載和存儲(chǔ)操作減少的基礎(chǔ)上進(jìn)行重新排序和重新安排操作。重新排序有利于在諸如超標(biāo)量或VLIW之類并行執(zhí)行資源的機(jī)器上更好地安排操作。
這種方法也可以在不減少加載和存儲(chǔ)操作的情形下,根據(jù)加載和存儲(chǔ)的情況安全地重新排序操作。這改善了安排性能并且對(duì)于不重復(fù)加載或存儲(chǔ)操作的代碼很有用。
本領(lǐng)域內(nèi)的技術(shù)人員將會(huì)發(fā)現(xiàn),微處理器可以通過電路形式與典型的計(jì)算機(jī)元件連接從而構(gòu)成諸如圖9所示的計(jì)算機(jī)。顯而易見,當(dāng)微處理器用于現(xiàn)代X86計(jì)算機(jī)時(shí),它可以通過處理器總線與存儲(chǔ)器和總線控制電路連接。存儲(chǔ)器和總線控制電路安排或能提供對(duì)主存儲(chǔ)器的訪問,也提供了對(duì)與微處理器一起使用的高速緩存的訪問。存儲(chǔ)器和總線控制線路還提供了對(duì)諸如PCI或其它局部總線的訪問,通過這些總線對(duì)I/O設(shè)備進(jìn)行訪問。特定的計(jì)算機(jī)系統(tǒng)取決于由本發(fā)明微處理器所替代的典型微處理器一起使用的電路。
為了描述處理器的操作和加快執(zhí)行速度的方法,這里的實(shí)例是將X86目標(biāo)代碼的少量實(shí)例翻譯為主基本指令。實(shí)例涉及了將X86目標(biāo)指令翻譯為詞態(tài)主機(jī)指令的過程,包括本發(fā)明微處理器所作的優(yōu)化、重新排序和重新安排各種步驟。通過以下描述的過程,本領(lǐng)域內(nèi)技術(shù)人員將會(huì)理解利用目標(biāo)處理器執(zhí)行源指令所需的操作與主處理器上執(zhí)行翻譯所需操作之間的差別。
用C語言源代碼編寫的源指令描述了一個(gè)非常簡(jiǎn)單的循環(huán)操作。當(dāng)每次循環(huán)后都減一的變量“n”大于“0”時(shí),數(shù)值“c”存儲(chǔ)在指針“*s”表示的地址內(nèi),每次循環(huán)之后該指針都增一。
<pre listing-type="program-listing"><![CDATA[Original C code while( (n--)>0) { *s++=c}====================================================================Win32×86 instructions produced by a compiler compiling this C code.mov%ecx,[%ebp+0×c] // load c from memory address into the %ecxmov%eax,[%ebp+0×8] // load s from memory address into the %eaxmov[%eax],%ecx // store c into memory address s held in %eaxadd%eax,#4// increment s by 4.mov[%ebp+0×8],%eax // store(s+4)back into memorymov%eax,[%ebp+0×10] // load n from memory address into the %eaxlea%ecx,[%eax-1] // decrement n and store the result in %ecxmov[%ebp+0×10],%ecx // store (n-1) into memoryand%eax,%eax // test n to set the condition codesjg .-0×1b // branch to the top of this section if “n>0”]]></pre>在實(shí)例的第一部分,執(zhí)行用C語言語句定義的操作的每條X86匯編語言指令用匯編語言操作助記符列示,后面跟著涉及特定基本操作的參數(shù)。每條指令的注釋對(duì)操作作了解釋,雖然所示的執(zhí)行順序可以由目標(biāo)處理器改變,但是每次執(zhí)行目標(biāo)C語言指令的循環(huán)時(shí)每條匯編語言指令都必須執(zhí)行。因此,如果循環(huán)執(zhí)行100次,則所示的每條指令也必須執(zhí)行100次。
<pre listing-type="program-listing"><![CDATA[Shows each X86 Instruction shown above followed by the host instructions necessary toimplement the X86 Instruction.mov %ecx,[%ebp+0×c] // load c from memory address into ecxaddR0,Rebp,0×c ; form the memory address and put it in R0ld Recx,[R0] ; load c from memory address in R0 into Recxmov%eax,[%ebp+0×8]// load s from memory address into %eaxaddR2,Rebp,0×8 ; form the memory address and put it in R2ld Reax,[R2] ; load s from memory address in R2 into Recxmov[%eax],%ecx // store c into memory address s held in %eaxst [Reax],Recx ; store c into memory address s held in Reaxadd%eax,#4 // increment s by 4addReax,Reax,4 ; increment s by 4mov[%ebp+0×8],%eax// store (s+4) back into memoryaddR5,Rebp,0×8 ; form the memory address and put it in R5st [R5],Reax ; store (s+4) back into memorymov%eax,[%ebp+0×10]// load n from memory address into %eaxaddR7,Rebp,0×10 ; form the memory address and put it in R7ld Reax,[R7] ; load n from memory address into the Reaxlea%ecx,[%eax-1]// decrement n and store the result in %ecxsubRecx,Reax,1 ; decrement n and store the result in Recxmov[%ebp+0×10],%ecx// store (n-1) into memoryaddR9,Rebp,0×10 ; form the memory address and put it in R9st [R9],Recx ; store (n-1) into memoryand%eax,%eax// test n to set the condition codesandcc R11,Reax,Reax; test n to set the condition codesjg .-0×1b // branch to the top of this section if “n>0”Most Instruction keyld=load add=ADD st=storesub=subtract jg=j(luò)ump if condition codes indicate greaterandcc=and set the condition codes]]></pre>下一實(shí)例描述了執(zhí)行C語言指令的同一目標(biāo)基本指令。但是在每條基本目標(biāo)指令之后列出了在微處理器特定實(shí)施例中完成同一操作所需的基本主指令,其中詞態(tài)主機(jī)為針對(duì)上述方式設(shè)計(jì)的VLIW處理器。應(yīng)該注意的是,由正式目標(biāo)寄存器屏蔽的主寄存器用X86寄存器名的前面加“R”表示,因此例如Reax表示與EAX正式目標(biāo)寄存器相關(guān)的工作寄存器。
<pre listing-type="program-listing"><![CDATA[Adds host instructions necessary to perform X86 address computation and upper and lowersegment limit checks.mov %ecx,[%ebp+0×c] // load cadd R0,Rebp,0×c ; form logical address into R0chkl R0,Rss_limit ; Check the logical address against segment lowerlimitchku R0,R_FFFFFFFF; Check the logical address against segment upperlimitadd R1,R0,Rss_base ; add the segment base to form the linearaddressldRecx,[R1] ; load c from memory address in R1 into Recxmov %eax,[%ebp+0×8] // load sadd R2,Rebp,0×8 ; form logical address into R0chkl R2,Rss_limit ; Check the logical address against segment lowerlimitchku R2,R_FFFFFFFF; Check the logical address against segment upperlimitadd R3,R2,Rss_base ; add the segment base to form the linearaddressldReax, [R3] ; load s from memory address in R3 into Ramov [%eax],%ecx // store c into [s]chku Reax,Rds_limit ; Check the logical address against segment upperlimitadd R4,Reax,Rds_base ; add the segment base to form the linearaddressst[R4],Recx ; store c into memory address sadd %eax,#4// increment s by 4addcc Reax,Reax,4; increment s by 4mov [%ebp+0×8],%eax // store (s+4) to memoryadd R5,Rebp,0×8 ; form logical address into R5chkl R5,Rss_limit ; Check the logical address against segment lowerlimitchku R5,R_FFFFFFFF; Check the logical address against segment upperlimitadd R6,R5,Rss_base ; add the segment base to form the linearaddressst[R6],Reax ; store (s+4) to memory address in R6mov %eax,[%ebp+0×10] // load nadd R7,Rebp,0×10 ; form logical address into R7chkl R7,Rss_limit ; Check the logical address against segment lowerlimitchku R7,R_FFFFFFFF; Check the logical address against segment upperlimitadd R8,R7,Rss_base ; add the segment base to form the linearaddressldReax,[R8] ; load n from memory address in R8 into Reaxlea %ecx, [%eax-1]// decrement nsub Recx,Reax,1; decrement nmov [%ebp+0×10], %ecx// store (n-1)addR9,Rebp,0×10 ;form logical address into R9chkl R9,Rss_limit ; Check the logical address against segment lowerlimitchku R9,R_FFFFFFFF ; Check the logical address against segment upperlimitaddR10,R9,Rss_base ; add the segment base to form the linearaddressst [R10],Recx ; store n-1 in Recx into memory using addressin R10and%eax,%eax // test n to set the condition codesandcc R11,Reax,Reax ;test n to set the condition codes]]></pre>下一實(shí)例表示每條基本目標(biāo)指令的主基本指令加法,代碼詞態(tài)化軟件可以利用其產(chǎn)生目標(biāo)操作所需的地址。應(yīng)該注意的是,主地址產(chǎn)生指令只是在采用代碼詞態(tài)化軟件產(chǎn)生地址而非地址產(chǎn)生硬件來產(chǎn)生地址的微處理器實(shí)施例中才需要。在諸如X86微處理器之類的目標(biāo)處理器中,地址是利用地址產(chǎn)生硬件產(chǎn)生的。在這種實(shí)施例中,無論何時(shí)產(chǎn)生地址,都完成了計(jì)算;并且還加入主基本指令以檢查地址值從而確定計(jì)算的地址是否在合適的X86段界內(nèi)。
<pre listing-type="program-listing"><![CDATA[Adds instructions to maintain the target X86 instruction pointer“eip”andthe commit instructions that use the special morph host hardware to update X86 state.mov %ecx,[%ebp+0×c]// load cadd R0,Rebp,0×cchkl R0,Rss_limitchku R0,R_FFFFFFFFadd R1,R0,Rss_baseldRecx,[R1]add Reip,Reip,3 ; add X86 instruction length to eip inReipcommit ; commits working state to official statemov %eax,[%ebp+0×8]// load sadd R2,Rebp,0×8chkl R2,Rss_limitchku R2,R_FFFFFFFFadd R3,R2,Rss_baseldReax,[R3]add Reip,Reip,3 ; add X86 instruction length to eip inReipcommit ; commits working state to official statemov [%eax],%ecx // store c into [s]chku Reax,Rds_limitadd R4,Reax,Rds_basest[R4],Recxadd Reip,Reip,2 ; add X86 instruction length to eip inReipcommit; commits working state to official stateadd %esx,#4 // increment s by 4addcc Reax,Reax,4add Reip,Reip,5 ; add X86 instruction length to eip inReipcommit; commits working state to official statemov [%ebp+0×8],%eax // store (s+4)add R5,Rebp,0×8chkl R5,Rss_limitchku R5,R_FFFFFFFFadd R6,R5,Rss_basest[R6],Reaxadd Reip,Reip,3 ; add X86 instruction length to eip inReipcommit; commits working state to official statemov %eax,[%ebp+0×10]// load nadd R7,Rebp,0×10chkl R7,Rss_limitchku R7,R_FFFFFFFFadd R8,R7,Rss_baseldReax,[R8]add Reip,Reip,3 ; add X86 instruction length to eip inReipcommit; commits working state to official statelea%ecx,[%eax-1] // decrement nsubRecx,Reax,1addReip,Reip,3; add x86 instruction length to eip inReipcommit ; commits working state to official statemov [%ebp+0×10],%ecx // store (n-1)addR9,Rebp,0×10chkl R9,Rss_limitchku R9,R_FFFFFFFFaddR10,R9,Rss_basest [R10],RecxaddReip,Reip,3 add x86 instruction length to eip inReipcommit; commits working state to official stateand%eax,%eax // test nandcc R11,Reax,ReaxaddReip,Reip,3commit; commits working state to official statejg .-0×1b// branch“n>0”addRseq,Reip,Length(jg)ldcRtarg,EIP(target)selcc Reip,Rseq,Rtargcommit; commits working state to official statejg mainloop,mainloopHost Instruction key commit=copy the contents of the working registers to the official target registers and send working stores to memory]]></pre>本實(shí)例示出了每組基本主指令的兩步相加,在執(zhí)行了完成每條基本指令所需的主指令后更新正式目標(biāo)寄存器并將門控存儲(chǔ)緩沖器內(nèi)未調(diào)撥的值調(diào)撥入存儲(chǔ)器。顯而易見,在每種情況下,目標(biāo)指令的長(zhǎng)度與工作指令指針寄存器(Reip)內(nèi)的值相加。隨后執(zhí)行調(diào)撥指令。在實(shí)施例中,調(diào)撥指令對(duì)屏蔽在相關(guān)正式目標(biāo)寄存器的每一工作寄存器的當(dāng)前值進(jìn)行復(fù)制并將指定門控存儲(chǔ)緩沖器位置的指針值從緊靠未調(diào)撥存儲(chǔ)數(shù)據(jù)之前移動(dòng)至緊靠這些存儲(chǔ)數(shù)據(jù)之后從而將它們放入存儲(chǔ)器。
顯而易見的是上面最后示出的指令清單都是構(gòu)成源目標(biāo)匯編語言指令的主指令翻譯所需的指令。如果翻譯操作在該處停止,則基本主指令的數(shù)量將遠(yuǎn)遠(yuǎn)大于目標(biāo)指令數(shù)量(大約是6倍),并且執(zhí)行時(shí)間將超過目標(biāo)處理器的執(zhí)行時(shí)間。但是此時(shí)尚未對(duì)指令進(jìn)行過重新排序、優(yōu)化和重新安排。
如果將運(yùn)行指令但只是運(yùn)行一次,則完成指令進(jìn)一步重新排序和其它優(yōu)化所需的時(shí)間可能超過此時(shí)執(zhí)行翻譯的時(shí)間。如果這樣,一種實(shí)施例的微處理器將在此處停止翻譯,存儲(chǔ)翻譯結(jié)果,隨后執(zhí)行翻譯指令以確定是否發(fā)生意外事件或錯(cuò)誤。在本實(shí)施例中,重新排序其它優(yōu)化步驟僅僅發(fā)生在經(jīng)確定特定的翻譯操作將進(jìn)行多次或者需要優(yōu)化時(shí)。例如通過在每條翻譯指令內(nèi)放入主指令,對(duì)翻譯執(zhí)行進(jìn)行計(jì)數(shù)并在計(jì)數(shù)值達(dá)到某一數(shù)值時(shí)產(chǎn)生意外事件(或轉(zhuǎn)移)的方法來實(shí)現(xiàn)。意外事件(或轉(zhuǎn)移)將操作轉(zhuǎn)移至代碼詞態(tài)化軟件,由其進(jìn)行下述部分或所有優(yōu)化以及任何適于該翻譯操作的其它優(yōu)化。第二種確定翻譯指令執(zhí)行次數(shù)和是否需要優(yōu)化的方法是以一定的頻度或者根據(jù)一些統(tǒng)計(jì)依據(jù)中斷翻譯指令的執(zhí)行,并優(yōu)化該時(shí)刻運(yùn)行的任何翻譯指令。這最終使得最經(jīng)常運(yùn)行的指令得到了優(yōu)化。另一種方案是對(duì)每一條特定類型的主指令進(jìn)行優(yōu)化,例如產(chǎn)生循環(huán)的主指令或者運(yùn)行次數(shù)可能最多的主指令。
<pre listing-type="program-listing"><![CDATA[Optimization============================================================================================Assumes 32 bit flat address space which allows the elimination of segment base additions andsome limit checks.Win32 uses Flat 32b segmentationRecord Assumptions Rss_base==0 Rss_limit==0 Rds_base==0 Rds_limit==FFFFFFFF SS and DS protection checkmov%ecx,[%ebp+0×c]//load caddR0,Rebp,0×cchku R0,R_FFFFFFFFld Recx,[R0]addReip,Reip,3commitmov%eax,[%ebp+0×8]//load saddR2,Rebp,0×8chku R2,R_FFFFFFFFld Reax,[R2]addReip,Reip,3commitmov[%eax],%ecx //store c into [s]chku Reax,R_FFFFFFFFst [Reax],RecxaddReip,Reip,2commitadd%eax,#4 //increment s by 4addcc Reax,Reax,4addReip,Reip,5commitmov[%ebp+0×8],%eax//store (s+4)addR5,Rebp,0×8chku R5,R_FFFFFFFFst [R5],ReaxaddReip,Reip,3commitmov%eax,[%ebp+0×10] //load naddR7,Rebp,0×10chku R7,R_FFFFFFFFld Reax,[R7]addReip,Reip,3commitlea%ecx,[%eax-1]//decrement n subRecx,Reax,1 addReip,Reip,3 commit mov[%ebp+0×10],%ecx//store (n-1) addR9,Rebp,0×10 chku R9,R_FFFFFFFF st [R9],Recx addReip,Reip,3 commit and%eax,%eax//test n andcc R11,Reax,Reax addReip,Reip,3 commit jg.-0×1b //branch “n>0”addRseq,Reip,Length(jg)ldcRtarg,EIP(target)selcc Reip,Rseq,Rtargcommitjg mainloop,mainloop]]></pre>本實(shí)例示出了可以利用改進(jìn)型微處理器實(shí)現(xiàn)的優(yōu)化步驟的第一階段。在優(yōu)化階段,就象代碼詞態(tài)化軟件的許多其它操作一樣,假定是有優(yōu)化結(jié)果的。特定的優(yōu)化操作假定作為為X86系列處理器普通存儲(chǔ)器模型編寫的目標(biāo)應(yīng)用程序作為32位程序?qū)⒗^續(xù)保持原樣。將會(huì)注意到是,這種假設(shè)只針對(duì)X86系列而對(duì)其它被仿真的處理器系列并非必要。
如果假設(shè)成立,則在X86應(yīng)用程序中所有的段都被映象至相同的地址空間。這使得可以減少X86分段處理所需的基本主指令。顯而易見,段值開始時(shí)被設(shè)定為零。隨后,數(shù)據(jù)基點(diǎn)也被設(shè)定為零,并且上限被設(shè)定為最大可用存儲(chǔ)空間。隨后在執(zhí)行目標(biāo)基本指令的每組基本主指令中,都省略了分段所需的對(duì)段基點(diǎn)值的檢查和段基點(diǎn)地址的計(jì)算。這減少了用于需要尋址功能的每條目標(biāo)基本指令的兩應(yīng)該注意的是,這種優(yōu)化需要對(duì)應(yīng)用程序是否采用32位普通存儲(chǔ)器模型作出預(yù)測(cè)。如果不是這樣的情況,則由于主循環(huán)要實(shí)現(xiàn)的目的地址的控制轉(zhuǎn)移并檢查出源地址假設(shè)與目的地址假設(shè)不匹配,所以將會(huì)發(fā)現(xiàn)錯(cuò)誤。隨后將進(jìn)行新的翻譯操作。這種技術(shù)非常普通并且被應(yīng)用于各種分段操作和其它不經(jīng)常變化的“模式化”情況,諸如調(diào)試、系統(tǒng)管理模式或“實(shí)”模式之類的“模式”。
<pre listing-type="program-listing"><![CDATA[Assume data addressed includes no bytes outside of computer memory limits which can onlyoccur on unaligned page crossing memory references at the upper memory limit,and can behandled by special case software or hardware.mov %ecx,[%ebp+0×c]//load cadd R0,Rebp,0×cld Recx,[R0]add Reip,Reip,3commitmov %eax,[%ebp+0×8]//load sadd R2,Rebp,0×8ld Reax,[R2]add Reip,Reip,3commitmov [%eax],%ecx //store c into [s]st [Reax],Recxadd Reip,Reip,2commitadd %eax,#4 //increment s by 4addcc Reax,Reax,4add Reip,Reip,5commitmov [%ebp+0×8],%eax //store (s+4)add R5,Rebp,0×8st[R5],Reaxadd Reip,Reip,3commitmov %eax,[%ebp+0×10] //load nadd R7,Rebp,0×10ldReax,[R7]add Reip,Reip,3commitlea%ecx,[%eax-1]// decrement nsubRecx,Reax,1addReip,Reip,3commitmov[%ebp+0×10],%ecx// store (n-1)addR9,Rebp,0×10st [R9],RecxaddReip,Reip,3commitand%eax,%eax// test nandcc R11,Reax,ReaxaddReip,Reip,3commitjg .-0×1b // branch“n>0”addRseq,Reip,Length(jg)ldcRtarg,EIP(target)selcc Reip,Rseq,Rtargcommitjg mainloop,mainloopHost Instruction keyselcc = Select one of the source registers and copy its contents to thedestination register based on the condition codes.]]></pre>上述實(shí)例示出了優(yōu)化步驟的下一階段,其中的預(yù)測(cè)翻譯操作避免了存儲(chǔ)上限邊界的檢查,這只對(duì)于穿越位于存儲(chǔ)器地址空間頂部的存儲(chǔ)器參考位置的未定位頁面才需要。由硬件或軟件定位工具檢查這種假設(shè)的失效。這減少了對(duì)需要尋址的每條目標(biāo)基本指令用另一主基本指令翻譯的量。這種優(yōu)化需要以前所作的假定,應(yīng)用程序使用32位普通存儲(chǔ)器模型并且預(yù)測(cè)到指令得到了定位。如果上述假設(shè)和預(yù)測(cè)都得不到滿足,則當(dāng)執(zhí)行翻譯指令時(shí)將會(huì)失效;并且需要重新翻譯。
<pre listing-type="program-listing"><![CDATA[Detect and eliminate redundant address calculations.The example shows the code aftereliminating the redundant operations.mov %ecx,[%ebp+0×c]// load cadd R0,Rebp,0×cld Recx,[R0]add Reip,Reip,3commitmov%eax,[%ebp+0×8] //load saddR2,Rebp,0×8ld Reax,[R2]addReip,Reip,3commitmov[%eax],%ecx//store c into [s]st [Reax],RecxaddReip,Reip,2commitadd%eax,#4 //increment s by 4addcc Reax,Reax,4addReip,Reip,5commitmov[%ebp+0×8],%eax //store (s+4)st [R2],ReaxaddReip,Reip,3commitmov%eax,[%ebp+0×10] //load naddR7,Rebp,0×10ld Reax,[R7]addReip,Reip,3commitlea%ecx,[%eax-1] //decrement nsubRecx,Reax,1addReip,Reip,3commitmov[%ebp+0×10],%ecx //store (n-1)st [R7],RecxaddReip,Reip,3commitand%eax,%eax //test nandcc R11,Reax,ReaxaddReip,Reip,3commitjg .-0×1b //branch“n>0”addRseq,Reip,Length(jg)ldcRtarg,EIP(target)selcc Reip,Rseq,Rtargcommitjg mainloop,mainloop]]></pre>
本實(shí)例示出了下一步優(yōu)化,其中省略了共用的主指令表達(dá)方式。具體而言,在翻譯第二條目標(biāo)基本指令時(shí),工作寄存器Rebp(表示X86處理器堆?;c(diǎn)寄存器的工作寄存器)內(nèi)的值與偏移值0×8相加并放入主工作寄存器R2。將會(huì)注意到的是,除了將加法結(jié)果放入工作寄存器R5以外,與在前面的實(shí)例中,翻譯目標(biāo)基本指令5時(shí)進(jìn)行的是同一操作。因此當(dāng)主基本指令5執(zhí)行期間工作寄存器R5內(nèi)放入的值已經(jīng)存在于工作寄存器R2中。這樣在翻譯目標(biāo)基本指令5時(shí)可以省略主加法指令;將工作寄存器R2的值復(fù)制到工作寄存器R5內(nèi)。同樣,由于在翻譯目標(biāo)基本指令6時(shí)已經(jīng)完成了將工作寄存器Rebp的值與偏移值0×10相加的步驟并且結(jié)果駐留在寄存器R7內(nèi),所以在翻譯目標(biāo)基本指令8時(shí)可以省略該步驟。應(yīng)該注意的是這種優(yōu)化不依賴于預(yù)測(cè),因此不會(huì)失效或者需要重新翻譯。
<pre listing-type="program-listing"><![CDATA[Assume that target exceptions will not occur within the translation so delay updating eip andtarget state.mov %ecx,[%ebp+0×c] //load cadd R0,Rebp,0×cld Recx,[R0]mov %eax,[%ebp+0×8] //load sadd R2,Rebp,0×8ld Reax,[R2]mov [%eax],%ecx//store c into [s]st [Reax],Recxadd %eax,#4 //increment s by 4add Reax,Reax,4mov [%ebp+0×8],%eax //store (s+4)st [R2],Reaxmov %eax,[%ebp+0×10]//load nadd R7,Rebp,0×10ldReax,[R7]lea %ecx,[%eax-1]//decrement nsub Recx,Reax,1mov [%ebp+0×10],%ecx//store (n-1)st[R7],Recxand %eax,%eax//test nandcc R11,Reax,Reaxjg.-0×1b //branch“n>0”add Rseq,Reip,Length(block)ldc Rtarg,EIP(target)selcc Reip,Rseq,Rtargcommitjgmainloop,mainloop]]></pre>上述實(shí)例示出了一種優(yōu)化步驟,它預(yù)測(cè)構(gòu)成整個(gè)翻譯操作的基本目標(biāo)指令的翻譯能夠在不發(fā)生意外事件的情況下完成。如果符合預(yù)測(cè)情況,則無需在執(zhí)行一條目標(biāo)基本指令的每一主基本指令序列結(jié)束時(shí)更新正式目標(biāo)寄存器或者調(diào)撥存儲(chǔ)緩沖器內(nèi)的未調(diào)撥的存儲(chǔ)結(jié)果。如果預(yù)測(cè)為真,則只需在目標(biāo)基本指令序列結(jié)束時(shí)更新正式目標(biāo)寄存器并且只需調(diào)撥一次存儲(chǔ)內(nèi)容。這可以省略兩條執(zhí)行每一基本目標(biāo)指令的基本主指令。它們被一條更新正式目標(biāo)寄存器并將未調(diào)撥存儲(chǔ)內(nèi)容調(diào)撥入存儲(chǔ)器的主基本指令代替。
顯而易見的是,其它的預(yù)測(cè)操作也極有可能是正確的預(yù)測(cè)。如果預(yù)測(cè)保持為真值,那么該步驟與現(xiàn)有仿真技術(shù)比就有極大的優(yōu)勢(shì)。它使所有執(zhí)行目標(biāo)基本指令序列的基本主指令歸類為一個(gè)序列從而可以對(duì)所有主基本指令逐條優(yōu)化。這有利于在得益于超長(zhǎng)指令字技術(shù)的詞態(tài)主機(jī)上并行運(yùn)行大量的操作。由于有更多的優(yōu)化選擇,所以可以采用其它大量的優(yōu)化。但是如果預(yù)測(cè)情況失真并且在執(zhí)行循環(huán)時(shí)發(fā)生意外事件,則由于直到實(shí)際執(zhí)行主指令序列后才發(fā)生調(diào)撥操作,所以正式目標(biāo)寄存器和存儲(chǔ)器保存的是目標(biāo)基本指令序列開始時(shí)的正式目標(biāo)狀態(tài)。從意外事件恢復(fù)所需的操作是轉(zhuǎn)儲(chǔ)未調(diào)撥的存儲(chǔ)內(nèi)容,使正式寄存器返回工作寄存器并在序列開始時(shí)重新翻譯目標(biāo)基本指令。這種重新翻譯一次翻譯一條目標(biāo)指令,并且在代表每條目標(biāo)基本指令的主序列翻譯之后才更新正式狀態(tài)。隨后執(zhí)行翻譯。當(dāng)該重新翻譯過程中出現(xiàn)意外事件時(shí),立即使用正式目標(biāo)寄存器和存儲(chǔ)器的正確目標(biāo)狀態(tài)來執(zhí)行意外事件。
<pre listing-type="program-listing"><![CDATA[In summary addR0,Rebp,0×c ld Recx,[R0] addR2,Rebp,0×8 ld Reax,[R2] st [Reax],Recx addReax,Reax,4 st [R2],Reax addR7,Rebp,0×10 ld Reax,[R7] //Live out subRecx,Reax,1//Live out st [R7],Recx andcc R11,Reax,Reax addRseq,Reip,Length(block) ldcRtarg,EIP (target) selcc Reip,Rseq,Rtarg commit jg mainloop,mainloopThe comment“Live Out”refers to the need to actually maintain Reax and Recxcorrectly prior to the commit. Otherwise further optimization might bepossible.============================================================================]]></pre>上面的總結(jié)示出了優(yōu)化過程中處于該位置時(shí)保留的主基本指令序列。雖然本實(shí)例示出了目標(biāo)指令指針(EIP)串列的維護(hù),但是也可以使翻譯時(shí)轉(zhuǎn)移的指針EIP保持不一致,這將省去實(shí)例中本步驟和后續(xù)步驟中更新序列的指針EIP。
<pre listing-type="program-listing"><![CDATA[Renaming to reduce register resource dependencies. This will allow subsequent scheduling to bemore effective. From this point on,the original target X86 code is omitted as the relationshipbetween individual target X86 instructions and host instructions becomes increasingly blurred.addR0,Rebp,0×cld R1,[R0]addR2,Rebp,0×8ld R3,[R2]st [R3],R1addR4,R3,4st [R2],R4addR7,Rebp,0×10ld Reax,[R7]//Live outsubRecx,Reax,1 //Live outst [R7],Recxandcc R11,Reax,ReaxaddRseq,Reip,Length(block)ldcRtarg,EIP(target)selcc Reip,Rseq,Rtargcommitjg mainloop,mainloop]]></pre>
本實(shí)例示出了通常稱為寄存器更名的下一個(gè)優(yōu)化步驟,其中需要使用在主基本指令序列中用于一個(gè)以上的操作的工作寄存器的操作改為采用不同的未使用工作寄存器以防止兩條主指令要求使用同一硬件。因此,例如在上述兩實(shí)例中的第二條主基本指令采用代表正式目標(biāo)寄存器ECX的工作寄存器Recx。第十條主基本指令也使用工作寄存器Recx。通過改變第二主基本指令中的操作從而使R0內(nèi)地址所指向的值存儲(chǔ)在工作寄存器R1中而不是寄存器Recx中,兩條主指令就不會(huì)使用同一寄存器。同樣,第四、第五和第六條主基本指令在前面實(shí)例中都使用工作寄存器Reax;通過使第四主基本指令使用前面未使用的工作寄存器R3以替代工作寄存器Reax而第六主基本指令使用前面未使用的工作寄存器R4以替代寄存器Reax,避免了它們使用同一硬件。
<pre listing-type="program-listing"><![CDATA[After the scheduling process which organizes the primitive host operations as multipleoperations that can execute in the parallel on the host VLIW hardware. Each line shows theparallel operations that the VLIW machine executes,and the“&”indicates the parallelism.addR2,Rebp,0×8& add R0,Rebp,0×cnop & add R7,Rebp,0×10ld R3,[R2] & add Rseq,Reip,Length(block)ld R1,[R0] & add R4,R3,4st [R3],R1 & ldc Rtarg,EIP(target)ld Reax,[R7]& nopst [R2],R4 & sub Recx,Reax,1st [R7],Recx& andcc R11,Reax,Reaxselcc Reip,Rseq,Rtarg & jg mainloop,mainloop & commitHost Instruction key nop=no operation]]></pre>上述實(shí)例示出了在詞態(tài)主機(jī)上執(zhí)行的主基本指令的安排。在該實(shí)例中,假定詞態(tài)主機(jī)為VLIW處理器,除了用于協(xié)調(diào)代的詞態(tài)化軟件的硬件增強(qiáng)部分以外,詞態(tài)主機(jī)還包括其它處理單元中的兩個(gè)算術(shù)和邏輯(ALU)單元。第一行表示兩個(gè)單獨(dú)的相加指令,將它們安排在詞態(tài)主機(jī)上一起運(yùn)行。顯而易見,在前述實(shí)例中它們是第三和第八條基本主指令。第二行包括NOP指令(無操作但是轉(zhuǎn)向下一指令)和另一加法操作。NOP指令表示即使在經(jīng)過某些安排優(yōu)化之后也不一定是兩條指令可以放在一起運(yùn)行。在任何情況下,該實(shí)例示出了此時(shí)只剩下9組基本主指令來執(zhí)行原先10條目標(biāo)指令。
<pre listing-type="program-listing"><![CDATA[Resolve host branch targets and chain stored translationsaddR2,Rebp,0×8 & add R0,Rebp,0×cnop& add R7,Rebp,0×10ld R3,[R2]& add Rseq,Reip,Length(block)ld R1,[R0]& add R4,R3,4st [R3],R1& ldc Rtarg,EIP(target)ld Reax,[R7] & nopst [R2],R4& sub Recx,Reax,1st [R7],Recx & andcc R11,Reax,Reaxselcc Reip,Rseq,Rtarg & jg Sequential,Target & commit]]></pre>本實(shí)例基本上表示同一組主基本指令,除了指令現(xiàn)在被存儲(chǔ)于翻譯緩沖器內(nèi)并且執(zhí)行一次或一次以上,由于最后的跳轉(zhuǎn)(jg)指令現(xiàn)在指向?qū)⒘硪环g指令序列鏈接起來的跳轉(zhuǎn)地址。鏈接過程使指令序列跳出了翻譯器主循環(huán)從而完成了序列的翻譯。
<pre listing-type="program-listing"><![CDATA[Advanced Optimizations,Backward Code MotionThis and subsequent examples start with the code prior to scheduling. Thisoptimization first depends on detecting that the code is a loop. Theninvariant operations can be moved out of the loop body and executed oncebefore entering the loop body.entry addR0,Rebp,0×c addR2,Rebp,0×8 addR7,Rebp,0×10 addRseq,Reip,Length(block) ldcRtarg,EIP(target)Loop ld R1,[R0] ld R3,[R2] st [R3],R1 addR4,R3,4 st [R2],R4 ld Reax,[R7] subRecx,Reax,1 st [R7],Recx andcc R11,Reax,Reax selcc Reip,Rseq,Rtarg commit jg mainloop,Loop]]></pre>上述實(shí)例示出了通常只與大量重復(fù)的序列一起使用的高級(jí)優(yōu)化步驟。該過程首先檢測(cè)構(gòu)成循環(huán)的翻譯,并檢查單條基本主指令以確定循環(huán)體內(nèi)哪條指令產(chǎn)生不變的結(jié)果。這些指令從循環(huán)內(nèi)去除并且只執(zhí)行一次,將值放入寄存器內(nèi);從此,存儲(chǔ)在寄存器內(nèi)的值被重復(fù)使用而不是重新運(yùn)行指令。
<pre listing-type="program-listing"><![CDATA[Schedule the loop body after backward code motion. For example purposes,onlycode in the loop body is shown scheduledEntryaddR0,Rebp,0×caddR2,Rebp,0×8addR7,Rebp,0×10addRseq,Reip,Length(block)ldcRtarg,EIP(target)Loopld R3,[R2] & nopld R1,[R0] & add R4,R3,4st [R3],R1 & nopld Reax,[R7] & nopst [R2],R4 & sub Recx,Reax,1st [R7],Recx & andcc R11,Reax,Reaxselcc Reip,Rseq,Rtarg & jg sequential,Loop & commitHost Instruction key ldc=load a 32-bit constant]]></pre>當(dāng)這些不重復(fù)的指令從循環(huán)中去除并且對(duì)序列進(jìn)行安排進(jìn)行執(zhí)行,經(jīng)安排的指令與上述實(shí)例中的指令相同。由此可見,在循環(huán)第一次迭代期間完成初始化指令但是只執(zhí)行一次,此后在循環(huán)期間只執(zhí)行所示7個(gè)時(shí)鐘間隔內(nèi)剩余的主基本指令。因此執(zhí)行基本目標(biāo)指令所需的。執(zhí)行時(shí)間從10條指令間隔縮短為7個(gè)指令間隔。
顯而易見,從循環(huán)中去除的步驟是地址產(chǎn)生步驟。這樣在改進(jìn)型微處理器內(nèi)只需在循環(huán)開始時(shí)產(chǎn)生一次地址;即,地址產(chǎn)生只需執(zhí)行一次。另一方面,X86目標(biāo)處理器的地址產(chǎn)生硬件必須在每次執(zhí)行循環(huán)時(shí)產(chǎn)生地址。如果循環(huán)執(zhí)行100次,則改進(jìn)型微處理器只產(chǎn)生一次地址而目標(biāo)處理器對(duì)每一地址要產(chǎn)生100次。
<pre listing-type="program-listing"><![CDATA[After Backward Code MotionTarget addR0,Rebp,0×c addR2,Rebp,0×8 addR7,Rebp,0×10 addRseq,Reip,Length(block) ldcRtarg,EIP(target)Loop ld R1,[R0] ld R3,[R2] st [R3],R1 addR4,R3,4 st [R2],R4 ld Reax,[R7] //Live outsubRecx,Reax,1 //Live out st [R7],Recx andcc R11,Reax,Reax selcc Reip,Rseq,Rtarg commit jg mainloop,Loop================================================================Register AllocationThis shows the use of register alias detection hardware of the morph hostthat allows variables to be safely moved from memory into registers. Thestarting point is the code after "backward code motion". This shows theoptimization that can eliminate loads.First the loads are performed. The address is protected by the aliashardware,such that should a store to the address occur,an "alias"exceptionis raised. The loads in the loop body are then replaced with copies. Afterthe main body of the loop,the alias hardware is freed.Entry addR0,Rebp,0×c addR2,Rebp,0×8 addR7,Rebp,0×10 addRseq,Reip,Length(block) ldcRtarg,EIP(target) ld Rc,[R0] ;First do the load of the variable from memory prot [R0],Alias1 ;Then protect the memory location from stores ld Rs, [R2] prot [R2],Alias2 ld Rn,[R7] prot [R7],Alias3Loop copy R1,Rc copy R3,Rs st[R3],R1 add R4,Rs,4 copy Rs,R4 st[R2],Rs,NoAliasCheck copy Reax,Rn //Live out sub Recx,Reax,1 //Live out copy Rn,Recx st[R7],Rn,noAliasCheck andcc R11,Reax,Reax selcc Reip,Rseq,Rtarg commit jgEpilog,LoopEpilog FA Alias1Free the alias detection hardware FA Alias2Free the alias detection hardware FA Alias3Free the alias detection hardware j SequentialHost Instruction keyprotect=protect address from loadsFA=free aliascopy=copyj=j(luò)ump]]></pre>本實(shí)例示出由本發(fā)明微處理器實(shí)現(xiàn)的更為高級(jí)的優(yōu)化步驟。參見本實(shí)例前的第二個(gè)實(shí)例就會(huì)注意到前3條相加指令包括堆棧內(nèi)的地址計(jì)算。這些地址在主操作序列執(zhí)行期間不會(huì)變化。因此這些地址上存儲(chǔ)的值可以從存儲(chǔ)器內(nèi)查找出來并裝載入寄存器以供立即可得到而執(zhí)行。顯而易見,這是在主基本指令6、8和10中完成的。在指令7、9和11中,每個(gè)存儲(chǔ)器地址被特殊的主別名硬件加上保護(hù)標(biāo)記并且寄存器被表示為這些存儲(chǔ)器地址的別名,所以如果試圖改變數(shù)據(jù)就會(huì)引發(fā)意外事件。此時(shí),每條涉及從堆棧存儲(chǔ)器地址移動(dòng)數(shù)據(jù)的加載操作都變?yōu)楹?jiǎn)單的寄存器至寄存器之間的復(fù)制操作,這比從存儲(chǔ)器地址加載數(shù)據(jù)要快許多。應(yīng)該注意的是,一旦循環(huán)執(zhí)行到n=0,則必須去除每個(gè)存儲(chǔ)器地址上的保護(hù)從而可以使用別名寄存器。
<pre listing-type="program-listing"><![CDATA[Copy PropagationAfter using the alias hardware to turn loads within the loop body intocopies,copy propagation allows the elimination of some copies.EntryaddR0,Rebp,0×caddR2,Rebp,0×8addR7,Rebp,0×10addRseq,Reip,Length(block)ldcRtarg,EIP(target)ld Rc,[R0]prot [R0],Alias1ld Rs,[R2]prot [R2],Alias2ld Recx,[R7]prot [R7],Alias3Loopst [Rs],RcaddRs,Rs,4st [R2],Rs,NoAliasCheckcopy Reax,Recx//Live outsubRecx,Reax,1 //Live outst [R7],Recx,NoAliasCheckandcc R11,Reax,Reaxselcc Reip,Rseq,Rtargcommitjg Epilog,LoopEpilog FAAlias1 FAAlias2 FAAlias3 j Sequential]]></pre>本實(shí)例示出了下一優(yōu)化步驟,其中大多數(shù)代替上一實(shí)例中優(yōu)化的加載指令的復(fù)制指令并非必要并且可以省略。即,如果進(jìn)行寄存器至寄存器之間的復(fù)制,則在復(fù)制數(shù)據(jù)的寄存器的操作前數(shù)據(jù)已經(jīng)存在。如果是這樣,可以在第一寄存器內(nèi)訪問數(shù)據(jù)而不是在復(fù)制數(shù)據(jù)的寄存器內(nèi),因此可以省略復(fù)制操作。顯而易見,這省略了上一實(shí)例循環(huán)中所示的第一、第二、第五和第九基本主指令。此外,其它主基本指令中所用的寄存器也可以改為反映正確的寄存器數(shù)據(jù)內(nèi)容。這樣,例如當(dāng)省略第一和第二復(fù)制指令時(shí),第三存儲(chǔ)指令必須從實(shí)際存在數(shù)據(jù)的工作寄存器Rc(而不是寄存器R1)復(fù)制數(shù)據(jù)并放入實(shí)際存在地址的工作寄存器Rs(而非寄存器R3)表示的地址上。
<pre listing-type="program-listing"><![CDATA[Example illustrating scheduling of the loop body only.Entry addR0,Rebp,0×c addR2,Rebp,0×8 addR7,Rebp,0×10 addRseq,Reip,Length(block) ldcRtarg,EIP(target) ld Rc,[R0] prot [R0],Alias1 ld Rs,[R2] prot [R2],Alias2 ld Recx,[R7] prot [R7],Alias3Loop st [Rs],Rc, & add Rs,Rs,4& copy Reax,Recx st [R2],Rs,NAC & sub Recx,Reax,1 st [R7],Recx,NAC & andcc Rll,Reax,Reax selcc Reip,Rseq,Rtarg& jg Epilog,Loop & commitEpilog FAAlias1 FAAlias2 FAAlias3 j SequentialHost Instruction keyNAC=No Alias Check]]></pre>
上述實(shí)例示出了安排后的主指令。將會(huì)看到,在執(zhí)行該循環(huán)時(shí),序列所需的時(shí)鐘數(shù)要少于從源代碼經(jīng)原始譯碼而得到的基本目標(biāo)指令執(zhí)行所需的時(shí)鐘數(shù)。因此除了所有其它加速技術(shù)以外,所運(yùn)行聯(lián)合的操作的總數(shù)也少于執(zhí)行源目標(biāo)代碼所需的操作數(shù)量。
<pre listing-type="program-listing"><![CDATA[Store Elimination by use of the alias hardware.Entry addR0,Rebp,0×c addR2,Rebp,0×8 addR7,Rebp,0×10 addRseq,Reip,Length(block) ldcRtarg,EIP(target) ld Rc,[R0] prot [R0],Alias1 ;protect the address from loads andstores ldRs,[R2] prot [R2],Alias2 ;protect the address from loads andstores ldRecx,[R7] prot [R7],Alias3 ;protect the address from loads andstoresLoop st[Rs],Rc, & add Rs,Rs,4 & copy Reax,Recx sub Recx,Reax,1 & andcc R11,Reax,Reax selcc Reip,Rseq,Rtarg & jg Epilog,Loop & commitEpilog FAAlias1 FAAlias2 FAAlias3 st[R2],Rs ;writeback the final value of Rs st[R7],Recx ;writeback the final value of Recx j Sequential]]></pre>
本實(shí)例所示的最后優(yōu)化用于別名硬件以節(jié)省存儲(chǔ)。這節(jié)省了循環(huán)體內(nèi)的存儲(chǔ)并且只在循環(huán)結(jié)束部分施行。與最初10條目標(biāo)指令相比,這將循環(huán)體內(nèi)主指令的數(shù)量減少到3條。
雖然以上借助實(shí)施例描述了本發(fā)明,但是本領(lǐng)域內(nèi)技術(shù)人員可以在不偏離本發(fā)明范圍和精神的前提下對(duì)本發(fā)明作出各種修改和變動(dòng)。例如雖然本發(fā)明描述的是X86處理器的仿真,但是它也可以應(yīng)用于針對(duì)其它處理器結(jié)構(gòu)設(shè)計(jì)的應(yīng)用程序上,也可以用于運(yùn)行在虛擬機(jī)上執(zhí)行的程序,例如P code、Postscript或Java程序等。因此本發(fā)明由下面所附權(quán)利要求限定。
權(quán)利要求
1.一種對(duì)處理器指令序列執(zhí)行期間產(chǎn)生的數(shù)據(jù)存儲(chǔ)在存儲(chǔ)器中進(jìn)行控制的緩沖器,其特征在于包含多個(gè)存儲(chǔ)單元,每個(gè)能夠保存尋址至存儲(chǔ)器的數(shù)據(jù)和數(shù)據(jù)地址;當(dāng)產(chǎn)生數(shù)據(jù)時(shí)將處理器操作產(chǎn)生的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)單元直到指令序列完成執(zhí)行為止的裝置;識(shí)別緩沖器內(nèi)由未完成執(zhí)行指令序列產(chǎn)生的數(shù)據(jù)的裝置;檢測(cè)緩沖器內(nèi)指向特定存儲(chǔ)器地址的最近數(shù)據(jù)以響應(yīng)存儲(chǔ)器訪問的裝置;在產(chǎn)生存儲(chǔ)內(nèi)容的指令序列執(zhí)行完成而未產(chǎn)生意外事件或錯(cuò)誤之后將存儲(chǔ)單元內(nèi)的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器的裝置;以及當(dāng)產(chǎn)生存儲(chǔ)內(nèi)容的指令序列執(zhí)行時(shí)產(chǎn)生意外事件或錯(cuò)誤時(shí)消除存儲(chǔ)單元內(nèi)的數(shù)據(jù)的裝置。
2.如權(quán)利要求1所述的緩沖器,其特征在于檢測(cè)緩沖器內(nèi)指向特定存儲(chǔ)器地址的最近數(shù)據(jù)以響應(yīng)存儲(chǔ)器訪問的裝置包含緩沖器內(nèi)指向特定存儲(chǔ)器地址的每次最近可尋址數(shù)據(jù)量的裝置。
3.如權(quán)利要求2所述的緩沖器,其特征在于識(shí)別緩沖器內(nèi)由未完成執(zhí)行指令序列產(chǎn)生的數(shù)據(jù)的裝置包含將未完成執(zhí)行的指令序列產(chǎn)生的數(shù)據(jù)從緩沖器內(nèi)其它數(shù)據(jù)分離直到指令序列執(zhí)行為止的裝置。
4.如權(quán)利要求3所述的緩沖器,其特征在于將數(shù)據(jù)從緩沖器內(nèi)其他數(shù)據(jù)分離直到指令序列執(zhí)行的裝置是指緩沖器內(nèi)數(shù)據(jù)序列開始和結(jié)束的裝置。
5.如權(quán)利要求4所述的緩沖器,其特征在于緩沖器內(nèi)指向特定存儲(chǔ)器地址以響應(yīng)存儲(chǔ)器訪問的每一最近可尋址數(shù)據(jù)量的裝置包含用尋址至同一存儲(chǔ)器地址并由尚未執(zhí)行指令序列產(chǎn)生的新數(shù)據(jù)代替緩沖器內(nèi)數(shù)據(jù)序列開始與結(jié)束之間存儲(chǔ)單元內(nèi)舊數(shù)據(jù)的裝置。
6.如權(quán)利要求4所述的緩沖器,其特征在于緩沖器內(nèi)指向特定存儲(chǔ)器地址以響應(yīng)存儲(chǔ)器訪問的每次最近可尋址數(shù)據(jù)量的裝置包含可尋址存儲(chǔ)單元的第一指示器,用來將放入緩沖器內(nèi)的數(shù)據(jù)識(shí)別為最近數(shù)據(jù);將正向存儲(chǔ)單元內(nèi)放入數(shù)據(jù)的存儲(chǔ)器地址與存儲(chǔ)單元內(nèi)已有數(shù)據(jù)的存儲(chǔ)器地址進(jìn)行比較并去除存儲(chǔ)器地址與存儲(chǔ)單元內(nèi)放入的數(shù)據(jù)存儲(chǔ)器地址相同的數(shù)據(jù)的指示符的比較器;可尋址存儲(chǔ)單元的第二指示器,用來將存儲(chǔ)單元內(nèi)的數(shù)據(jù)識(shí)別為指令序列產(chǎn)生的最近數(shù)據(jù)以響應(yīng)未產(chǎn)生錯(cuò)誤或意外事件的指令序列執(zhí)行;以及將產(chǎn)生存儲(chǔ)內(nèi)容的指令序列的執(zhí)行產(chǎn)生意外事件或錯(cuò)誤時(shí)從緩沖器內(nèi)消除的數(shù)據(jù)的存儲(chǔ)器地址與識(shí)別未消除并由第二指示器識(shí)別為指令序列產(chǎn)生的最近數(shù)據(jù)的存儲(chǔ)器地址進(jìn)行比較的比較器,用來響應(yīng)未產(chǎn)生錯(cuò)誤或意外事件的指令序列的執(zhí)行并作為最近數(shù)據(jù)寫入第一指示器。
7.如權(quán)利要求2所述的緩沖器,其特征在于當(dāng)產(chǎn)生存儲(chǔ)內(nèi)容的指令序列執(zhí)行時(shí)產(chǎn)生意外事件或錯(cuò)誤時(shí)消除存儲(chǔ)單元內(nèi)的數(shù)據(jù)的裝置包含使數(shù)據(jù)無效以響應(yīng)指令序列執(zhí)行期間產(chǎn)生的錯(cuò)誤或意外事件的指示器。
8.如權(quán)利要求3所述的緩沖器,其特征在于從緩沖器內(nèi)其它數(shù)據(jù)中分離出數(shù)據(jù)直到指令序列完成執(zhí)行為止的裝置包括將數(shù)據(jù)序列放入所指緩沖器物理分立部分內(nèi)以包含尚未執(zhí)行指令數(shù)據(jù)的裝置。
9.如權(quán)利要求8所述的緩沖器,其特征在于指示緩沖器內(nèi)指向特定存儲(chǔ)器地址的每次最近可尋址數(shù)據(jù)量以響應(yīng)存儲(chǔ)器訪問的裝置包含用尋址至同一存儲(chǔ)器地址并由尚未執(zhí)行指令序列產(chǎn)生的新數(shù)據(jù)代替指向包含未執(zhí)行指令序列數(shù)據(jù)緩沖器的物理分立部分內(nèi)存儲(chǔ)單元上的舊數(shù)據(jù)的裝置。
10.如權(quán)利要求8所述的緩沖器,其特征在于當(dāng)產(chǎn)生數(shù)據(jù)的指令序列執(zhí)行時(shí)未產(chǎn)生意外事件或錯(cuò)誤時(shí)將存儲(chǔ)單元內(nèi)的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器的裝置進(jìn)一步包含指示數(shù)據(jù)由未發(fā)生錯(cuò)誤的指令序列產(chǎn)生的裝置。
11.如權(quán)利要求8所述的緩沖器,其特征在于在產(chǎn)生數(shù)據(jù)內(nèi)容的指令序列執(zhí)行后未產(chǎn)生意外事件或錯(cuò)誤時(shí)將存儲(chǔ)單元內(nèi)的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器的裝置進(jìn)一步包含比較器,它比較未發(fā)生錯(cuò)誤或意外事件的指令序列產(chǎn)生的緩沖器內(nèi)數(shù)據(jù)的存儲(chǔ)器地址并僅僅選擇最近可尋址數(shù)據(jù)存儲(chǔ)在任何存儲(chǔ)器地址上。
12.一種對(duì)處理器指令序列執(zhí)行期間產(chǎn)生的數(shù)據(jù)存儲(chǔ)在存儲(chǔ)器中進(jìn)行控制的方法,其特征在于包含以下步驟當(dāng)產(chǎn)生存儲(chǔ)緩沖器分離部分的數(shù)據(jù)時(shí)按照順序?qū)⑴c存儲(chǔ)器地址相關(guān)的數(shù)據(jù)轉(zhuǎn)移;檢測(cè)存儲(chǔ)緩沖器中特定存儲(chǔ)器地址的最近數(shù)據(jù)以響應(yīng)對(duì)存儲(chǔ)器地址的訪問;如果指令序列未產(chǎn)生意外事件或錯(cuò)誤則將來自存儲(chǔ)緩沖器分離部分的所有數(shù)據(jù)轉(zhuǎn)移以抽取至存儲(chǔ)器;以及如果指令序列引起意外事件或錯(cuò)誤則從存儲(chǔ)緩沖器分離部分消除所有數(shù)據(jù)。
13.如權(quán)利要求12所述的方法,其特征在于當(dāng)產(chǎn)生存儲(chǔ)緩沖器偏析部分的數(shù)據(jù)時(shí)按照順序?qū)⑴c存儲(chǔ)器地址相關(guān)的數(shù)據(jù)轉(zhuǎn)移的步驟包含按照存儲(chǔ)單元順序?qū)?shù)據(jù)放入第一與最后存儲(chǔ)單元之間的存儲(chǔ)緩沖器部分內(nèi)的步驟。
14.如權(quán)利要求13所述的方法,其特征在于如果指令序列未產(chǎn)生意外事件或錯(cuò)誤則將來自存儲(chǔ)緩沖器分離部分的所有數(shù)據(jù)轉(zhuǎn)移以抽取至存儲(chǔ)器的步驟包含移動(dòng)第一存儲(chǔ)單元指示以指定最后存儲(chǔ)單元的步驟;以及如果指令序列引起意外事件或錯(cuò)誤則從存儲(chǔ)緩沖器分離部分消除所有數(shù)據(jù)的步驟包含移動(dòng)最后存儲(chǔ)單元指示以指定第一存儲(chǔ)單元的步驟。
15.如權(quán)利要求14所述的方法,其特征在于檢測(cè)存儲(chǔ)緩沖器內(nèi)特定存儲(chǔ)器地址最近數(shù)據(jù)以響應(yīng)對(duì)存儲(chǔ)器地址訪問的步驟包含以下步驟當(dāng)放入存儲(chǔ)單元的數(shù)據(jù)是與該數(shù)據(jù)相關(guān)的存儲(chǔ)器地址的最近數(shù)據(jù)時(shí)對(duì)任何可尋址數(shù)據(jù)放置第一指示;當(dāng)數(shù)據(jù)從存儲(chǔ)緩沖器分離部分轉(zhuǎn)移時(shí),且該數(shù)據(jù)為從存儲(chǔ)緩沖器分離部分轉(zhuǎn)移的最近數(shù)據(jù),則對(duì)任何可尋址數(shù)據(jù)放置第二指示;當(dāng)消除存儲(chǔ)緩沖器分離部分內(nèi)所有數(shù)據(jù)時(shí)對(duì)包含第二指示的任何可尋址數(shù)據(jù)放置第一指示;以及比較存儲(chǔ)器地址和保護(hù)在可尋址的存儲(chǔ)單元中的任何數(shù)據(jù)的第一指示以響應(yīng)保持在存儲(chǔ)緩沖器中的數(shù)據(jù)的存儲(chǔ)器地址的訪問。
16.如權(quán)利要求12所述的方法,其特征在于包含下列步驟當(dāng)產(chǎn)生存儲(chǔ)緩沖器分離部分的數(shù)據(jù)時(shí)按照順序?qū)⑴c存儲(chǔ)器地址相關(guān)的數(shù)據(jù)轉(zhuǎn)移的步驟包含在緩沖器物理分離部分放置數(shù)據(jù)序列;以及指示存儲(chǔ)緩沖器物理分離部分包含來自未完全執(zhí)行指令序列的數(shù)據(jù)。
17.如權(quán)利要求16所述的方法,其特征在于檢測(cè)存儲(chǔ)緩沖器內(nèi)特定存儲(chǔ)器地址最近數(shù)據(jù)以響應(yīng)對(duì)存儲(chǔ)器地址訪問的步驟包含以下步驟將每個(gè)分立的數(shù)據(jù)可尋址部分寫入存儲(chǔ)緩沖器的分離部分內(nèi),復(fù)蓋在存儲(chǔ)緩沖器的分離部分內(nèi)的同一存儲(chǔ)器地址上的;以及將存儲(chǔ)緩沖器中所有數(shù)據(jù)的存儲(chǔ)器地址與被訪問的任何存儲(chǔ)器地址比較以檢測(cè)存儲(chǔ)緩沖器內(nèi)的最近數(shù)據(jù)。
18.如權(quán)利要求16所述的方法,其特征在于如果指令序列未產(chǎn)生意外事件或錯(cuò)誤則將來自存儲(chǔ)緩沖器分離部分的所有數(shù)據(jù)轉(zhuǎn)移以抽取至存儲(chǔ)器的步驟包含指示存儲(chǔ)緩沖器物理分離部分包含來自已執(zhí)行指令序列數(shù)據(jù)的步驟;以及如果指令序列引起意外事件或錯(cuò)誤則從存儲(chǔ)緩沖器分離部分消除所有數(shù)據(jù)的步驟包含指示存儲(chǔ)緩沖器物理分離部分包含無效數(shù)據(jù)。
19.如權(quán)利要求18所述的方法,其特征在于進(jìn)一步包含從存儲(chǔ)緩沖器的分離部分將所有數(shù)據(jù)抽取至存儲(chǔ)器的步驟,為此它對(duì)每一存儲(chǔ)器地址比較從分離部分轉(zhuǎn)移的所有數(shù)據(jù)的地址并只將任何存儲(chǔ)器地址的最近數(shù)據(jù)抽取至存儲(chǔ)器。
20.一種用于處理系統(tǒng)的裝置,處理系統(tǒng)包括主處理器,它能夠執(zhí)行第一指令集以幫助運(yùn)行不同指令集的指令,不同指令集由主處理器翻譯為第一指令集,其特征在于包含緩沖器,包含暫時(shí)存儲(chǔ)所產(chǎn)生的存儲(chǔ)器內(nèi)容直到確定翻譯指令序列在主處理器上不發(fā)生意外事件或錯(cuò)誤地執(zhí)行為止的分離區(qū)域;檢測(cè)向緩沖器內(nèi)特定存儲(chǔ)器地址存儲(chǔ)的最近存儲(chǔ)器內(nèi)容以響應(yīng)對(duì)存儲(chǔ)器地址的訪問的邏輯電路系統(tǒng);從偏析部分去除暫時(shí)存儲(chǔ)的存儲(chǔ)器內(nèi)容并在確定翻譯指令序列在主處理器上能不發(fā)生意外事件或錯(cuò)誤地執(zhí)行時(shí)永久存儲(chǔ)存儲(chǔ)器內(nèi)容的抽取電路系統(tǒng);以及當(dāng)確定翻譯指令序列在主處理器上能不發(fā)生意外事件或錯(cuò)誤地執(zhí)行時(shí)消除緩沖器分離部分內(nèi)暫時(shí)存儲(chǔ)的存儲(chǔ)器內(nèi)容的裝置。
21.如權(quán)利要求20所述的用于處理系統(tǒng)的裝置,其特征在于緩沖器分離區(qū)域由指向第一和最后存儲(chǔ)單元的指針定義;檢測(cè)向緩沖器內(nèi)特定存儲(chǔ)器地址存儲(chǔ)的最近存儲(chǔ)器內(nèi)容以響應(yīng)對(duì)存儲(chǔ)器地址的訪問的邏輯電路系統(tǒng)包含位于每個(gè)存儲(chǔ)單元內(nèi)的第一位置以指示最近存儲(chǔ)器內(nèi)容;無論何時(shí)存儲(chǔ)器內(nèi)容放置在存儲(chǔ)單元內(nèi)在第一位置內(nèi)放置指示并去除第一位置內(nèi)同一存儲(chǔ)器地址的舊存儲(chǔ)器內(nèi)容指示的電路系統(tǒng);位于每個(gè)存儲(chǔ)單元內(nèi)的第二位置以指示緩沖器分離部分以外的最近存儲(chǔ)器內(nèi)容;無論何時(shí)由抽取電路系統(tǒng)從分離部分去除存儲(chǔ)器內(nèi)容在第二位置內(nèi)放置指示并去除第二位置內(nèi)同一存儲(chǔ)器地址的舊存儲(chǔ)器內(nèi)容指示的電路系統(tǒng);以及比較存儲(chǔ)器地址并檢測(cè)第一位置內(nèi)存儲(chǔ)器內(nèi)容的指示的比較器。
22.如權(quán)利要求20所述的用于處理系統(tǒng)的裝置,其特征在于緩沖器偏析區(qū)域由存儲(chǔ)單元的物理分立部分定義,該存儲(chǔ)單元包含的指示表示該部分內(nèi)的存儲(chǔ)器內(nèi)容已經(jīng)由未完成執(zhí)行的指令序列產(chǎn)生;檢測(cè)向緩沖器內(nèi)特定存儲(chǔ)器地址存儲(chǔ)的最近存儲(chǔ)器內(nèi)容以響應(yīng)對(duì)存儲(chǔ)器地址的訪問的邏輯電路系統(tǒng)包含將存儲(chǔ)器內(nèi)容覆蓋分離部分已經(jīng)存儲(chǔ)的任何存儲(chǔ)器內(nèi)容的存儲(chǔ)器地址檢測(cè)器;指定存儲(chǔ)器內(nèi)容放置在緩沖器任何物理分立部分內(nèi)次序的電路系統(tǒng);以及比較存儲(chǔ)器地址并檢測(cè)緩沖器部分內(nèi)任何存儲(chǔ)單元上最舊存儲(chǔ)器內(nèi)容的比較器。
23.一種門控存儲(chǔ)緩沖器,其特征在于包含按照順序暫時(shí)存儲(chǔ)除其它存儲(chǔ)器內(nèi)容以外所有在主處理器將目標(biāo)指令序列翻譯為主指令的翻譯期間產(chǎn)生的存儲(chǔ)器內(nèi)容的裝置;如果執(zhí)行翻譯時(shí)未發(fā)生意外事件則按照順序?qū)⒎g期間產(chǎn)生的存儲(chǔ)器內(nèi)容轉(zhuǎn)移至存儲(chǔ)器的裝置;指示最近的向同一存儲(chǔ)器地址存儲(chǔ)的存儲(chǔ)器內(nèi)容以響應(yīng)對(duì)存儲(chǔ)器地址的訪問的裝置;以及如果執(zhí)行翻譯時(shí)未發(fā)生意外事件則按照順序消除翻譯期間產(chǎn)生的存儲(chǔ)器內(nèi)容的裝置。
24.一種計(jì)算機(jī),其特征在于包含為執(zhí)行主指令集指令而設(shè)計(jì)的主處理器;將目標(biāo)指令集的指令翻譯為主指令集指令的主機(jī)軟件;存儲(chǔ)器;以及用于存儲(chǔ)主機(jī)軟件在主處理器上翻譯目標(biāo)指令序列時(shí)產(chǎn)生的數(shù)據(jù)的存儲(chǔ)緩沖器,它包括多個(gè)存儲(chǔ)單元,每個(gè)能夠保存尋址至存儲(chǔ)器的數(shù)據(jù)和數(shù)據(jù)地址;當(dāng)產(chǎn)生數(shù)據(jù)時(shí)將主處理器操作產(chǎn)生的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)單元直到指令序列完成執(zhí)行為止的裝置;識(shí)別緩沖器內(nèi)由未完成執(zhí)行指令序列產(chǎn)生的數(shù)據(jù)的裝置;檢測(cè)緩沖器內(nèi)指向特定存儲(chǔ)器地址的最近數(shù)據(jù)以響應(yīng)存儲(chǔ)器訪問的裝置;在產(chǎn)生存儲(chǔ)內(nèi)容的指令序列執(zhí)行完成而未產(chǎn)生意外事件或錯(cuò)誤之后將存儲(chǔ)單元內(nèi)的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器的裝置;以及當(dāng)產(chǎn)生存儲(chǔ)內(nèi)容的指令序列執(zhí)行時(shí)產(chǎn)生意外事件或錯(cuò)誤時(shí)消除存儲(chǔ)單元內(nèi)的數(shù)據(jù)的裝置。
25.如權(quán)利要求24所述的計(jì)算機(jī),其特征在于當(dāng)數(shù)據(jù)產(chǎn)生時(shí)將處理器操作產(chǎn)生的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)單元直到指令序列完成執(zhí)行為止的裝置包含將數(shù)據(jù)轉(zhuǎn)移至緩沖器內(nèi)順序存儲(chǔ)單元上的手段;以及檢測(cè)緩沖器內(nèi)指向特定存儲(chǔ)器地址的最近數(shù)據(jù)以響應(yīng)存儲(chǔ)器訪問的裝置包含緩沖器內(nèi)指向特定存儲(chǔ)器地址的每次最近可尋址數(shù)據(jù)量的裝置。
26.如權(quán)利要求25所述的計(jì)算機(jī),其特征在于識(shí)別緩沖器內(nèi)由未完成執(zhí)行指令序列產(chǎn)生的數(shù)據(jù)的裝置包含將未完成執(zhí)行的指令序列產(chǎn)生的數(shù)據(jù)從緩沖器內(nèi)其它數(shù)據(jù)分離直到指令序列執(zhí)行為止的裝置。
27.如權(quán)利要求26所述的計(jì)算機(jī),其特征在于將數(shù)據(jù)從緩沖器內(nèi)數(shù)據(jù)分離直到指令序列已執(zhí)行的裝置是指示緩沖器內(nèi)數(shù)據(jù)序列開始和結(jié)束的裝置。
28.如權(quán)利要求27所述的計(jì)算機(jī),其特征在于緩沖器內(nèi)指向特定存儲(chǔ)器地址的每次最近可尋址數(shù)據(jù)量以響應(yīng)存儲(chǔ)器訪問的裝置包含用尋址至同一存儲(chǔ)器地址并由尚未執(zhí)行指令序列產(chǎn)生的新數(shù)據(jù)代替緩沖器內(nèi)數(shù)據(jù)序列開始與結(jié)束之間存儲(chǔ)單元內(nèi)舊數(shù)據(jù)的裝置。
29.如權(quán)利要求27所述的計(jì)算機(jī),其特征在于緩沖器內(nèi)指向特定存儲(chǔ)器地址的每次最近可尋址數(shù)據(jù)量以響應(yīng)存儲(chǔ)器訪問的裝置包含可尋址存儲(chǔ)單元的第一指示器,用來將放入緩沖器內(nèi)的數(shù)據(jù)識(shí)別為最近數(shù)據(jù);將存儲(chǔ)單元內(nèi)放入數(shù)據(jù)的存儲(chǔ)器地址與存儲(chǔ)單元內(nèi)已有數(shù)據(jù)的存儲(chǔ)器地址進(jìn)行比較并去除存儲(chǔ)器地址與存儲(chǔ)單元內(nèi)放入的數(shù)據(jù)存儲(chǔ)器地址相同的數(shù)據(jù)的指示符的比較器;可尋址存儲(chǔ)單元的第二指示器,用來將存儲(chǔ)單元內(nèi)的數(shù)據(jù)識(shí)別為指令序列產(chǎn)生的最近數(shù)據(jù)以響應(yīng)未產(chǎn)生錯(cuò)誤或意外事件的指令序列執(zhí)行;以及將產(chǎn)生存儲(chǔ)內(nèi)容的指令序列的執(zhí)行產(chǎn)生意外事件或錯(cuò)誤時(shí)從緩沖器內(nèi)消除的數(shù)據(jù)的存儲(chǔ)器地址與識(shí)別未消除并由第二指示器識(shí)別的由指令序列產(chǎn)生的最近數(shù)據(jù)的存儲(chǔ)器地址進(jìn)行比較的比較器,用來響應(yīng)未產(chǎn)生錯(cuò)誤或意外事件的指令序列的執(zhí)行并作為最近數(shù)據(jù)寫入第一指示器。
30.如權(quán)利要求24所述的計(jì)算機(jī),其特征在于當(dāng)指令序列執(zhí)行時(shí)產(chǎn)生意外事件或錯(cuò)誤時(shí)消除緩沖器內(nèi)的數(shù)據(jù)的裝置包含使數(shù)據(jù)無效以響應(yīng)指令序列執(zhí)行期間產(chǎn)生的錯(cuò)誤或意外事件的指示器。
31.如權(quán)利要求26所述的計(jì)算機(jī),其特征在于從緩沖器內(nèi)其它數(shù)據(jù)中分離出數(shù)據(jù)直到指令序列完成執(zhí)行為止的裝置包括將數(shù)據(jù)序列放入所指緩沖器物理分立部分內(nèi)以包含尚未執(zhí)行指令序列數(shù)據(jù)的裝置。
32.如權(quán)利要求31所述的計(jì)算機(jī),其特征在于指示緩沖器內(nèi)指向特定存儲(chǔ)器地址的每次最近可尋址數(shù)據(jù)量以響應(yīng)存儲(chǔ)器訪問的裝置包含用尋址至同一存儲(chǔ)器地址并由尚未執(zhí)行指令序列產(chǎn)生的新數(shù)據(jù)代替指向包含未執(zhí)行指令序列數(shù)據(jù)緩沖器的物理分立部分內(nèi)存儲(chǔ)單元上的舊數(shù)據(jù)的裝置。
33.如權(quán)利要求31所述的計(jì)算機(jī),其特征在于當(dāng)產(chǎn)生數(shù)據(jù)的指令序列執(zhí)行時(shí)未產(chǎn)生意外事件或錯(cuò)誤時(shí)將存儲(chǔ)單元內(nèi)的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器的裝置進(jìn)一步包含指示數(shù)據(jù)由未發(fā)生錯(cuò)誤的指令序列產(chǎn)生的裝置。
34.如權(quán)利要求31所述的計(jì)算機(jī),其特征在于當(dāng)產(chǎn)生數(shù)據(jù)的指令序列執(zhí)行時(shí)未產(chǎn)生意外事件或錯(cuò)誤時(shí)將存儲(chǔ)單元內(nèi)的數(shù)據(jù)轉(zhuǎn)移至存儲(chǔ)器的裝置進(jìn)一步包含比較器,它比較未發(fā)生錯(cuò)誤或意外事件的指令序列產(chǎn)生的緩沖器內(nèi)數(shù)據(jù)的存儲(chǔ)器地址并僅僅選擇最近可尋址數(shù)據(jù)存儲(chǔ)在任何存儲(chǔ)器地址上。
全文摘要
一種門控存儲(chǔ)緩沖器,包含:按照順序暫時(shí)存儲(chǔ)除其它存儲(chǔ)器內(nèi)容以外所有在主處理器將目標(biāo)指令序列翻譯為主指令的翻譯期間產(chǎn)生的存儲(chǔ)器內(nèi)容的裝置;如果執(zhí)行翻譯時(shí)未發(fā)生意外事件則按照順序?qū)⒎g期間產(chǎn)生的存儲(chǔ)器內(nèi)容轉(zhuǎn)移至存儲(chǔ)器的裝置;指示最近的向同一存儲(chǔ)器地址存儲(chǔ)的存儲(chǔ)器內(nèi)容以響應(yīng)對(duì)存儲(chǔ)器地址的訪問的裝置;以及如果執(zhí)行翻譯時(shí)未發(fā)生意外事件則按照順序消除翻譯期間產(chǎn)生的存儲(chǔ)器內(nèi)容的裝置。
文檔編號(hào)G06F9/30GK1242087SQ97180942
公開日2000年1月19日 申請(qǐng)日期1997年12月12日 優(yōu)先權(quán)日1996年12月23日
發(fā)明者M·J·溫, G·P·得索薩 申請(qǐng)人:全斯美達(dá)有限公司