專利名稱:復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先異常處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及到計算機系統(tǒng)領(lǐng)域,具體地說,涉及處理器內(nèi)部異常 處理領(lǐng)域。本發(fā)明提出了一種復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先異常 處理方法。
背景技術(shù):
在復雜指令集的計算機系統(tǒng)中,大部分指令都翻譯為多條微指 令,處理器中的指令流水線處理的是這些微指令,而不是翻譯前的操 作系統(tǒng)可見指令。這些微指令通??梢圆僮鞅葟碗s指令更多的寄存器
資源,比如在復雜指令集中有8個可見的通用寄存器,在微指令集中可 能會有32個或64個以上的可見通用寄存器。以32個可見的通用寄存器 為例,其中的8個可以作為復雜指令集的通用寄存器,而剩下的24個寄 存器則保留給微指令集的譯碼器作為臨時寄存器或用作其它用途。當 然,對于微指令集可見的通用寄存器之間還存在一個數(shù)據(jù)相關(guān)的問題。 這個問題通常通過寄存器重命名來解決。在一條復雜的指令翻譯成的 多條微指令中, 一些微指令在某種情況下會發(fā)生異常,在發(fā)生異常后, 首先會執(zhí)行若干條預(yù)處理微指令,預(yù)處理微指令保存寄存器現(xiàn)場,獲 取跳轉(zhuǎn)的目標地址,然后跳轉(zhuǎn)到操作系統(tǒng)可見的異常處理程序。這種 機制存在一個問題,在發(fā)生異常后的預(yù)處理微指令中又可能發(fā)生異常, 這樣就形成了微指令異常的多層嵌套。這樣就需要一種方法保證這些 異常的順序,正確的修復。另外,對于復雜指令集的指令,它們通常 翻譯為多個微指令,這多個微指令每一個都有可能發(fā)生異常,這些異 常如何得到處理,而又不至于導致指令流程混亂甚至異常的死循環(huán), 本發(fā)明提出了一種在修復所有這些異常后返回到正常指令執(zhí)行流程的 方法。
發(fā)明內(nèi)容
本發(fā)明提供了一種深度優(yōu)先異常處理的方法,可以解決在異常預(yù) 處理過程中又發(fā)生異常的問題,而且可以保證寄存器之間依賴關(guān)系的 恢復,異常的正常修復,從而可以從斷點處繼續(xù)執(zhí)行指令。
為了實現(xiàn)上述目的,根據(jù)本發(fā)明,提出了一種復雜指令集體系結(jié) 構(gòu)中的深度優(yōu)先異常處理方法,包括以下步驟在發(fā)生異常時,l)指 令重排序緩沖器發(fā)出異常信息給各個模塊,各個模塊將自身寄存器置 為無效,從而刷空流水線;2)譯碼部件將所述異常信息轉(zhuǎn)換為預(yù)先定 義的指令;3)譯碼部件根據(jù)所述預(yù)先定義的指令,索引只讀存儲器, 找出與之相應(yīng)的微指令,并將所述微指令送入發(fā)射部件;4)發(fā)射部件 將沒有數(shù)據(jù)相關(guān)的微指令送入執(zhí)行部件執(zhí)行;5)執(zhí)行部件執(zhí)行所述微 指令,并將執(zhí)行結(jié)果寫入指令重排序緩沖器;6)檢査指令重排序緩沖 器中的第一條微指令是否異常;7)如果指令重排序緩沖器中的第一條 微指令異常,則返回l)流水線刷空步驟;8)如果指令重排序緩沖器 中的第一條微指令未發(fā)生異常,則指令重排序緩沖器將已經(jīng)寫回的第 一條微指令提交,完成處理。
優(yōu)選地,所述3)微指令査找步驟還包括對所述預(yù)先定義的指 令進行解碼,并根據(jù)解碼結(jié)果,索引只讀存儲器。
優(yōu)選地,所述3)微指令査找步驟還包括將所述微指令按序存 放在指令重排序緩沖器中。
優(yōu)選地,所述執(zhí)行部件包括多個執(zhí)行部件。
優(yōu)選地,在所述6)異常檢查步驟中,檢査指令重排序緩沖器中 排序靠前的多條微指令是否異常。
優(yōu)選地,指令重排序緩沖器中排序靠前的多條微指令是指令重排 序緩沖器中的第一條和第二條微指令。
優(yōu)選地,指令重排序緩沖器中排序靠前的多條微指令是指令重排 序緩沖器中的第一條到第四條微指令。
優(yōu)選地,對于數(shù)據(jù)相關(guān)微指令,等待相關(guān)數(shù)據(jù)的產(chǎn)生,當已經(jīng)產(chǎn) 生所有相關(guān)數(shù)據(jù)時,將該數(shù)據(jù)相關(guān)微指令標記為沒有數(shù)據(jù)相關(guān)的微指
令。
下面將參照附圖,對本發(fā)明的優(yōu)選實施例進行詳細的描述,其中 圖1示出了應(yīng)用本發(fā)明的微處理器的基本框圖。 圖2是預(yù)處理微指令異常嵌套時的處理流程圖。
圖3是R0Q的內(nèi)部結(jié)構(gòu)圖,它是一個循環(huán)隊列。 圖4是未發(fā)生異常預(yù)處理的嵌套時指令的執(zhí)行過程。 圖5是發(fā)生異常預(yù)處理的嵌套時指令的執(zhí)行過程。 圖6描述了重命名模塊中微指令對應(yīng)的目標邏輯寄存器和物理寄 存器之間的依賴關(guān)系。
圖7是實現(xiàn)本發(fā)明的譯碼器的結(jié)構(gòu)框圖。
具體實施例方式
下面結(jié)合
本發(fā)明的具體實施方式
。應(yīng)該指出,所描述的 實施例僅是為了說明的目的,而不是對本發(fā)明范圍的限制。所描述的 各種數(shù)值并非用于限定本發(fā)明,這些數(shù)值可以根據(jù)本領(lǐng)域普通技術(shù)人 員的需要進行任何適當?shù)男薷摹?br>
圖1是基于本發(fā)明的一種CPU結(jié)構(gòu)框圖。這類CPU的指令執(zhí)行過 程如下取指部件101包括指令寄存器、指令高速緩存(cache)、指 令旁路緩沖器、分支預(yù)測器等,可隨實現(xiàn)系統(tǒng)的復雜度不同作相應(yīng)的 調(diào)節(jié)。取指部件101負責從指令高速緩存中取出相應(yīng)的指令給譯碼部 件102,譯碼部件102獲得指令后從ROM 103中取微指令進行譯碼, 譯碼后的微指令送到發(fā)射部件104和指令重排序緩沖器(ROQ) 106, 發(fā)射部件104含有重命名邏輯或積分板電路等,用來消除寄存器之間 的寫寫相關(guān)和讀寫相關(guān),發(fā)射部件104還負責將己經(jīng)準備好數(shù)據(jù)的指 令發(fā)送到執(zhí)行部件105去執(zhí)行,執(zhí)行部件105將執(zhí)行的結(jié)果信息寫回 到R0Q106, ROQ106中含有流水線中每條指令的狀態(tài)信息,例如,是 否執(zhí)行完畢,是否提交等。對于分支指令還有分支寫回、分支觸發(fā)等 狀態(tài)。
圖2示出的是異常預(yù)處理微指令發(fā)生多層嵌套時圖1所示CPU的
執(zhí)行流程。在發(fā)生異常后,R0Q 106輸出異常信息(步驟S202)給各 個模塊,各個模塊將自身寄存器置無效,從而刷空流水線。異常信息 被緩沖在譯碼部件102中的一個緩沖器中。這個異常信息在譯碼部件 102中被編碼為一條預(yù)先定義的指令(步驟S203),在下一拍對這個預(yù) 先定義的指令進行解碼,產(chǎn)生一個urom_pc去索引ROM 103,并將從 ROM 103中取得的微指令發(fā)射給發(fā)射部件104(步驟S204),同時在ROQ 106中也會按序存放相應(yīng)的微指令,發(fā)射部件104將沒有數(shù)據(jù)相關(guān)的 微指令送入執(zhí)行部件105執(zhí)行(步驟S205),執(zhí)行部件105可以不止 一個,隨具體設(shè)計而定。微指令在執(zhí)行部件105中需要1拍或多拍, 然后把產(chǎn)生的結(jié)果信息發(fā)給ROQ 106 (步驟S206),在步驟S207中, R0Q 106在每一拍檢查微指令頭索引寄存器Roq—head所指向的微指 令,可以檢査頭4條,頭2條或只檢查1條,隨設(shè)計而定。如果這條 微指令已經(jīng)寫回,并且沒有異常產(chǎn)生,則這條指令可以提交(步驟 S208),如果再次觸發(fā)異常的話,流水線又被刷空,譯碼器102重新緩 沖這個異常信息,并再次發(fā)出異常處理微指令,重現(xiàn)了上述的處理流 程,這樣就形成了一個深度優(yōu)先遍歷,在最深層的異常被處理完畢后, 這種處理器結(jié)構(gòu)會觸發(fā)次深層次的異常,直到所有異常都被處理完畢 后,復雜指令會得到執(zhí)行。另外,對于數(shù)據(jù)相關(guān)微指令,等待相關(guān)數(shù) 據(jù)的產(chǎn)生,當已經(jīng)產(chǎn)生所有相關(guān)數(shù)據(jù)時,將該數(shù)據(jù)相關(guān)微指令標記為 沒有數(shù)據(jù)相關(guān)的微指令。
圖3所示的是R0Q 106的結(jié)構(gòu),R0Q 106中的微指令是按順序存 放的。微指令頭索引寄存器Roq—head指向R0Q 106隊列頭的指令,微 指令尾索引寄存器Roq一tail指向隊列尾的下一項。ROQ 106是用來保 證指令的精確異常,當其中一條微指令發(fā)生異常時其后所有的微指令 的執(zhí)行結(jié)果都會被取消。當R0Q 106中的一條微指令發(fā)生異常后,這 個異常的信息會發(fā)給取指部件101、譯碼部件102、發(fā)射部件104等。
圖4是異常預(yù)處理在沒有嵌套的情況下復雜指令的執(zhí)行過程,當 一條復雜指令發(fā)生異常后,首先安排一段預(yù)處理微指令進行壓棧、權(quán)
限檢查等操作,最后通過遠跳(far jump)指令,跳轉(zhuǎn)到復雜指令的 異常處理程序。
圖5是在發(fā)生異常預(yù)處理的三層嵌套時復雜指令的執(zhí)行過程,從 圖中可以看出首先處理的是第三層的異常,這個第三層的異常是由第 二層異常的預(yù)處理微指令產(chǎn)生的,在處理完后處理器返回到斷點重新 執(zhí)行這條指令,結(jié)果再次發(fā)生異常,此時最多只會觸發(fā)第二層的異常, 第三層的異常在第一次觸發(fā)時已經(jīng)被修復了,在第二層的異常返回后 處理器會再次執(zhí)行這條發(fā)生異常的指令,結(jié)果導致第三次觸發(fā)異常, 此時第三層和第二層的異常都已經(jīng)得到修復了,所以只會觸發(fā)第一層 的異常,同樣,首先是一段預(yù)處理,進行壓棧、權(quán)限檢査等操作,然 后跳到異常處理程序,異常處理程序處理完成后返回到這條指令執(zhí)行, 此時這條指令就能通過執(zhí)行了。
為了在異常觸發(fā)后取消己經(jīng)建立的寄存器依賴關(guān)系,需要為每個 寄存器依賴指定微指令編號。圖6示出的是重命名模塊中為寄存器建 立依賴和取消依賴關(guān)系的一種方法。如圖6所示,在遇到指令2時, 邏輯寄存器編號1被映射到物理寄存器編號3,在遇到指令6時,邏 輯寄存器編號2被映射到物理寄存器編號1,在遇到指令8時,邏輯 寄存器編號3被映射到物理寄存器編號5,指令3, 4, 5和7沒有和 寄存器建立對應(yīng)關(guān)系,這是因為這些指令沒有對應(yīng)的目標寄存器,即 這些指令只執(zhí)行而不寫回。最后在遇到指令9時,邏輯寄存器編號l 被映射到物理寄存器編號7,此時同樣的邏輯寄存器號1映射了兩個 物理寄存器號3和7,它們的區(qū)別在于對應(yīng)的指令編號不同,分別為2 和9。如果指令8發(fā)生了一個異常的話,重命名模塊收到這個異常, 將每一個依賴關(guān)系與這個異常的指令編號進行比較,如果依賴關(guān)系所 在的指令在發(fā)生異常的指令之后,則這個依賴關(guān)系需要取消掉。因此, 圖6中的邏輯寄存器號1到物理寄存器號7的依賴關(guān)系被取消,其它 的依賴關(guān)系保留。
圖7是為實現(xiàn)這種異常嵌套處理的譯碼器102的內(nèi)部結(jié)構(gòu)框圖。 執(zhí)行部件105在執(zhí)行過程中發(fā)現(xiàn)異常,它把異常通過結(jié)果總線711送 給R0Q 106, R0Q 106在適當?shù)臅r機發(fā)出例外總線710給譯碼部件712,
譯碼部件712收到這個信號后將ir 703置無效,并把這個異常緩沖在 例外緩沖器702中。在下一拍,ronupc生成器705選擇例外緩沖器702 的異常信息進行譯碼,生成urom—pc701,并索引uR0M 704,產(chǎn)生的微 指令通過微指令選擇器707送給微指令生成器708進行進一步譯碼并 輸出到解碼總線上。如果發(fā)生異常嵌套的話,異常信息又會緩沖到指 令緩沖器703中。這樣又一次異常處理開始了。其中rom—pc生成器 705是一個二路選擇器,負責從例外緩沖器702和指令緩沖器703中 取相應(yīng)的信息進行譯碼,其中例外緩沖器702的信息優(yōu)先處理。微指 令選擇器707也是一個二路選擇器,負責從iiROM 704和簡單解碼器 706中選擇微指令進行送給微指令生成器708。同樣,uROM 704比簡 單解碼器706的優(yōu)先級要高。這是因為異常信息需要得到及時處理。 按照這種譯碼器結(jié)構(gòu)設(shè)計就可以處理復雜指令異常預(yù)處理時發(fā)生的異 常嵌套。
以x86的處理器為例,在x86系列的處理器中有很多復雜指令, 常見的如串拷貝指令,軟中斷int n指令,間接跳轉(zhuǎn)指令等。這些指 令所對應(yīng)的微指令被存放在一塊rom (如圖l所示的ROM103)中。譯 碼部件從存儲器中取得復雜指令后,會按照這種指令的操作碼域和其 它的相關(guān)域去索引這個roni,取出微指令給后端。后端包括重命名邏 輯和發(fā)射部件。X86可見的通用寄存器有8個,即eax、 ebx、 ecx、 edx、 esi、 edi、 ebp、 esp,對應(yīng)于微指令的8個普通寄存器。另外,還為 微指令集分配了 24個臨時寄存器。這24個寄存器用來緩沖各執(zhí)行部 件的運算結(jié)果,包括加法部件、乘法部件、除法部件、訪存部件等。 由于微指令執(zhí)行時會對這32個寄存器產(chǎn)生數(shù)據(jù)相關(guān),這種相關(guān)通過后 端的重命名邏輯進行重命名,從而消除了假相關(guān)。重命名后的微指令 被按序存放到指令重排序緩沖器中。指令重排序中的微指令有3種狀 態(tài),空狀態(tài)、映射狀態(tài)、寫回狀態(tài)。當指令重排序中的某一項的狀態(tài) 為空時,表示這項可以存放一條微指令,只是目前沒有被使用。映射 狀態(tài)表示當前的表項已經(jīng)存放了一條微指令,這個微指令是從重命名 部件發(fā)射過來,而且這條指令正在執(zhí)行部件執(zhí)行或正在記分板中等待
發(fā)射,還沒有運算結(jié)果產(chǎn)生。寫回狀態(tài)表示當前的指令在執(zhí)行部件已 經(jīng)執(zhí)行完畢,并且執(zhí)行結(jié)果己經(jīng)寫到寄存器堆中,只等待處理器做最 后的確認。
重排序緩沖器中微指令的提交是按序進行的,首先提交隊列頭的 已經(jīng)寫回的微指令,提交的信息會發(fā)給重命名部件,重命名部件根據(jù) 得到的提交信息去修改相應(yīng)目標寄存器的狀態(tài)信息。如果隊列頭的微 指令附帶了異常的話,提交信息無效,異常信息會送到譯碼部件和重 命名部件,重命名部件對異常信息進行分析,然后取消所有曾經(jīng)建立 的依賴關(guān)系,譯碼部件則獲取其中的異常矢量,把這個異常編碼為一
個特殊的指令,并記錄發(fā)生的異常所在的指令地址,然后從rom中取 相應(yīng)的微指令執(zhí)行,通過微指令得到跳轉(zhuǎn)到的異常處理程序地址,在 進行壓棧、保存關(guān)鍵現(xiàn)場等預(yù)處理操作后,轉(zhuǎn)入正式的異常處理程序。 在異常處理程序執(zhí)行完成后重新執(zhí)行這條指令,此時第一個異常己經(jīng) 得到修復,不會再觸發(fā)了,只可能觸發(fā)下一個異常。如果再壓棧,保 存關(guān)鍵現(xiàn)場的過程中又發(fā)生了異常,譯碼部件緩沖獲得的新矢量,繼 續(xù)緩沖此異常所在的指令地址,重新發(fā)出同樣的微指令,此時唯一的 區(qū)別是異常的編號變了,這個異常編號會作為一個微指令常量送到相 應(yīng)的微指令域中。此時,指令重排序緩沖區(qū)被清空,其它各種功能部 件也都作了清除工作。同樣,在第二層的異常預(yù)處理微指令中也要進 行壓棧、保存現(xiàn)場等操作,最后通過一條特殊的跳轉(zhuǎn)指令跳到操作系 統(tǒng)可見的例外處理程序。在例外處理程序返回后,從被中斷的指令繼 續(xù)執(zhí)行,這樣由于在例外處理程序中己經(jīng)對故障進行了修復,在遇到 那個故障點就不會再發(fā)生異常了,而只會處理最頂層的那個異常。處 理完畢后,頂層異常所對應(yīng)的故障也得到修復,處理器繼續(xù)往下執(zhí)行。 處理器是以如下的順序執(zhí)行異常處理的在最深層次的異常處理程序 執(zhí)行完后,重新執(zhí)行次深層次的異常處理程序,在次深層次的異常處 理程序執(zhí)行完后,重新執(zhí)行再次深層次的異常處理程序,依此類推, 最后執(zhí)行最頂層次的異常處理程序。這種方法類似于排序算法中的深 度優(yōu)先遍歷。
最后所應(yīng)說明的是以上實施例僅僅用以說明而非限制本發(fā)明的 技術(shù)方案,盡管參照上述實施例對本發(fā)明進行了詳細說明,本領(lǐng)域的 普通技術(shù)人員應(yīng)當理解依然可以對本發(fā)明進行修改或者等同替換, 而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應(yīng)涵蓋在 本發(fā)明的權(quán)利要求范圍當中。
權(quán)利要求
1. 一種復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先異常處理方法,包括以下步驟在發(fā)生異常時,1)指令重排序緩沖器發(fā)出異常信息給各個模塊,各個模塊將自身寄存器置為無效,從而刷空流水線;2)譯碼部件將所述異常信息轉(zhuǎn)換為預(yù)先定義的指令;3)譯碼部件根據(jù)所述預(yù)先定義的指令,索引只讀存儲器,找出與之相應(yīng)的微指令,并將所述微指令送入發(fā)射部件;4)發(fā)射部件將沒有數(shù)據(jù)相關(guān)的微指令送入執(zhí)行部件執(zhí)行;5)執(zhí)行部件執(zhí)行所述微指令,并將執(zhí)行結(jié)果寫入指令重排序緩沖器;6)檢查指令重排序緩沖器中的第一條微指令是否異常;7)如果指令重排序緩沖器中的第一條微指令異常,則返回1)流水線刷空步驟;8)如果指令重排序緩沖器中的第一條微指令未發(fā)生異常,則指令重排序緩沖器將已經(jīng)寫回的第一條微指令提交,完成處理。
2. 根據(jù)權(quán)利要求1所述的復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先 異常處理方法,其特征在于所述3)微指令查找步驟還包括對所述 預(yù)先定義的指令進行解碼,并根據(jù)解碼結(jié)果,索引只讀存儲器。
3. 根據(jù)權(quán)利要求1所述的復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先 異常處理方法,其特征在于所述3)微指令查找步驟還包括將所述 微指令按序存放在指令重排序緩沖器中。
4. 根據(jù)權(quán)利要求1所述的復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先異常處理方法,其特征在于所述執(zhí)行部件包括多個執(zhí)行部件。
5. 根據(jù)權(quán)利要求1所述的復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先 異常處理方法,其特征在于在所述6)異常檢査步驟中,檢査指令重排序緩沖器中排序靠前的多條微指令是否異常。
6. 根據(jù)權(quán)利要求5所述的復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先異常處理方法,其特征在于指令重排序緩沖器中排序靠前的多條微指 令是指令重排序緩沖器中的第一條和第二條微指令。
7. 根據(jù)權(quán)利要求5所述的復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先 異常處理方法,其特征在于指令重排序緩沖器中排序靠前的多條微指 令是指令重排序緩沖器中的第一條到第四條微指令。
8. 根據(jù)權(quán)利要求1 7所述的復雜指令集體系結(jié)構(gòu)中的深度優(yōu) 先異常處理方法,其特征在于對于數(shù)據(jù)相關(guān)微指令,等待相關(guān)數(shù)據(jù)的 產(chǎn)生,當已經(jīng)產(chǎn)生所有相關(guān)數(shù)據(jù)時,將該數(shù)據(jù)相關(guān)微指令標記為沒有 數(shù)據(jù)相關(guān)的微指令。
全文摘要
本發(fā)明提出了一種復雜指令集體系結(jié)構(gòu)中的深度優(yōu)先異常處理方法,包括以下步驟在發(fā)生異常時,1)指令重排序緩沖器發(fā)出異常信息給各個模塊,各個模塊將自身寄存器置為無效,從而刷空流水線;2)譯碼部件將所述異常信息轉(zhuǎn)換為預(yù)先定義的指令;3)譯碼部件根據(jù)所述預(yù)先定義的指令,索引只讀存儲器,找出與之相應(yīng)的微指令,并將所述微指令送入發(fā)射部件;4)發(fā)射部件將沒有數(shù)據(jù)相關(guān)的微指令送入執(zhí)行部件執(zhí)行;5)執(zhí)行部件執(zhí)行所述微指令,并將執(zhí)行結(jié)果寫入指令重排序緩沖器;6)檢查指令重排序緩沖器中的第一條微指令是否異常;7)如果指令重排序緩沖器中的第一條微指令異常,則返回1)流水線刷空步驟;8)如果指令重排序緩沖器中的第一條微指令未發(fā)生異常,則指令重排序緩沖器將已經(jīng)寫回的第一條微指令提交,完成處理。
文檔編號G06F9/38GK101114218SQ200610088939
公開日2008年1月30日 申請日期2006年7月27日 優(yōu)先權(quán)日2006年7月27日
發(fā)明者段振中, 范東睿 申請人:中國科學院計算技術(shù)研究所