在具有安全域和次安全域的數(shù)據(jù)處理設(shè)備中的異常處理的制作方法
【專利摘要】提供了一種用于處理異常的數(shù)據(jù)處理設(shè)備和方法,所述數(shù)據(jù)處理設(shè)備具有被配置成響應(yīng)于程序代碼而執(zhí)行數(shù)據(jù)處理操作的處理電路,所述處理電路包括用于控制異常處理的異??刂齐娐?。多個(gè)寄存器被提供來存儲(chǔ)數(shù)據(jù),所述寄存器包括寄存器的第一子集和寄存器的第二子集,并且數(shù)據(jù)存儲(chǔ)裝置同樣被提供來存儲(chǔ)數(shù)據(jù),所述數(shù)據(jù)存儲(chǔ)裝置包括包括安全區(qū)和次安全區(qū)在內(nèi)的多個(gè)區(qū),其中,安全區(qū)用于存儲(chǔ)可由處理電路在安全域中操作時(shí)訪問并且不可由處理電路在次安全域中操作時(shí)訪問的數(shù)據(jù)。響應(yīng)于來自由處理電路所執(zhí)行的后臺(tái)處理的初始異常,異??刂齐娐吩谟|發(fā)處理電路執(zhí)行與異常相對(duì)應(yīng)的異常處理例程之前執(zhí)行對(duì)來自寄存器的第一子集的數(shù)據(jù)的狀態(tài)保存,其中,異常處理例程負(fù)責(zé)執(zhí)行對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存。響應(yīng)于引起從安全域到次安全域的轉(zhuǎn)變的第一異常,在后臺(tái)處理由處理電路在安全域中執(zhí)行的情況下,異??刂齐娐吩谟|發(fā)處理電路在次安全域中執(zhí)行異常處理例程之前執(zhí)行額外的對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存。本發(fā)明的硬件機(jī)制使得能夠?qū)崿F(xiàn)安全異常的有效處理,而無需通過異常處理程序進(jìn)行代理。
【專利說明】在具有安全域和次安全域的數(shù)據(jù)處理設(shè)備中的異常處理
【技術(shù)領(lǐng)域】
[0001] 本【技術(shù)領(lǐng)域】涉及數(shù)據(jù)處理的領(lǐng)域,并且特別地涉及敏感數(shù)據(jù)和代碼的處理。
【背景技術(shù)】
[0002] 許多數(shù)據(jù)處理系統(tǒng)和架構(gòu)提供了隔離并且保護(hù)敏感數(shù)據(jù)和代碼段以免于由未授 權(quán)的人或進(jìn)程訪問的方式。盡管重要的是能夠提供安全性,但是在與這種保護(hù)相關(guān)聯(lián)的性 能和電路面積中存在開銷。
[0003] 在諸如微控制器之類的小型系統(tǒng)中,使這些開銷保持在低值是非常重要的,并且 因此可能需要做出在安全性的級(jí)別與性能之間的某種權(quán)衡。
[0004] 使數(shù)據(jù)和代碼保持安全的一個(gè)方式由英國劍橋的ARM?用其Trustzone架構(gòu)提 供,其中存在安全狀態(tài)和非安全狀態(tài)(也被稱為安全域和非安全域),并且異常指令被用來 在狀態(tài)之間轉(zhuǎn)變,異常處理程序保護(hù)安全側(cè)的安全性。盡管這種方式提供高度的安全性,但 是需要軟件異常處理程序形式的大量的軟件干預(yù)來改變安全性狀態(tài),這既降低了系統(tǒng)的性 能又增加了為安全軟件開發(fā)外部應(yīng)用程序接口 API所需要的努力量,因?yàn)樗姓{(diào)用都必須 通過異常處理程序來代理。類似地,需要在非安全域中處理的在安全域中發(fā)生的異常同樣 需要通過安全異常處理程序來代理,這允許安全狀態(tài)在控制傳遞給非安全異常處理程序之 前得以保護(hù)。
[0005] US7966466和US2008/0250216公開了可替代的安全系統(tǒng),其中數(shù)據(jù)存儲(chǔ)裝置具有 安全側(cè)和非安全側(cè),并且當(dāng)前正被執(zhí)行的代碼在數(shù)據(jù)存儲(chǔ)裝置內(nèi)的位置確定處理器正在操 作的域,以及因此確定被允許訪問的數(shù)據(jù)。
【發(fā)明內(nèi)容】
[0006] 從第一方面看,本發(fā)明提供了一種數(shù)據(jù)處理設(shè)備,其包括:被配置成響應(yīng)于程序代 碼而執(zhí)行數(shù)據(jù)處理操作的處理電路,處理電路包括用于控制異常處理的異常控制電路;被 配置成存儲(chǔ)數(shù)據(jù)的多個(gè)寄存器,寄存器包括寄存器的第一子集和寄存器的第二子集;以及 被配置成存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,數(shù)據(jù)存儲(chǔ)裝置包括包括安全區(qū)和次安全區(qū)在內(nèi)的多個(gè) 區(qū),其中,安全區(qū)用于存儲(chǔ)可由處理電路當(dāng)在安全域中操作時(shí)訪問并且不可由處理電路當(dāng) 在次安全域中操作時(shí)訪問的數(shù)據(jù);其中:響應(yīng)于來自由處理電路所執(zhí)行的后臺(tái)處理的初始 異常,異??刂齐娐繁慌渲贸稍谟|發(fā)處理電路執(zhí)行與異常相對(duì)應(yīng)的異常處理例程之前執(zhí)行 對(duì)來自寄存器的第一子集的數(shù)據(jù)的狀態(tài)保存,其中,異常處理例程負(fù)責(zé)執(zhí)行對(duì)來自寄存器 的第二子集的數(shù)據(jù)的狀態(tài)保存;并且響應(yīng)于引起從安全域到次安全域的轉(zhuǎn)變的第一異常, 在后臺(tái)處理由處理電路在安全域中執(zhí)行的情況下,異??刂齐娐繁慌渲贸稍谟|發(fā)處理電路 在次安全域中執(zhí)行異常處理例程之前執(zhí)行額外的對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài) 保存。
[0007] 當(dāng)在后臺(tái)處理期間發(fā)生異常時(shí),后臺(tái)處理可能已將數(shù)據(jù)值放入寄存器,并且以便 允許這些數(shù)據(jù)值在異常結(jié)束時(shí)被保持和存儲(chǔ),系統(tǒng)可以執(zhí)行數(shù)據(jù)從寄存器到數(shù)據(jù)存儲(chǔ)裝置 (典型地,到在數(shù)據(jù)存儲(chǔ)裝置中提供的堆棧)的狀態(tài)保存。如上面所討論的那樣,對(duì)于一些 系統(tǒng)來說,重要的是實(shí)現(xiàn)在所實(shí)現(xiàn)的安全性級(jí)別與處理性能之間的權(quán)衡。這在響應(yīng)于異常 而執(zhí)行狀態(tài)保存時(shí)同樣成立。
[0008] 由于性能原因,執(zhí)行寄存器的第一子集和第二子集中的數(shù)據(jù)的狀態(tài)保存可能是有 用的。依照本發(fā)明,對(duì)來自第一子集的數(shù)據(jù)的狀態(tài)保存能夠由硬件中的異??刂齐娐吩谟| 發(fā)異常處理例程之前執(zhí)行。相比之下,異常處理例程(即軟件)可以負(fù)責(zé)執(zhí)行對(duì)來自寄存 器的第二子集的數(shù)據(jù)的狀態(tài)保存。
[0009] 然而,從安全性觀點(diǎn)看,在異常處理例程的控制下的寄存器的第二子集的狀態(tài)保 存有時(shí)是有問題的。如果異常引起從安全域到次安全域的轉(zhuǎn)變,則緊跟在安全域中執(zhí)行的 后臺(tái)處理之后,異常處理例程能夠修改在安全域中位于寄存器的第二子集的安全數(shù)據(jù)。 [0010] 為了防止這種安全性漏洞,依照本發(fā)明,如果在后臺(tái)處理是在安全域中的情況下 發(fā)生引起從安全域到次安全(在本文中也被稱為非安全)域的轉(zhuǎn)變的第一異常,則異???制電路在次安全域中觸發(fā)異常處理例程之前,除了第一子集之外,還執(zhí)行額外的對(duì)來自寄 存器的第二子集的數(shù)據(jù)的狀態(tài)保存。通過提供用于在觸發(fā)異常處理例程之前保存寄存器的 第二子集的狀態(tài)的硬件機(jī)制,能夠防止數(shù)據(jù)被次安全域中的軟件修改。
[0011] 因此,本技術(shù)能夠在響應(yīng)于異常而執(zhí)行狀態(tài)保存時(shí)實(shí)現(xiàn)安全性與性能之間的改進(jìn) 的平衡。本發(fā)明的硬件機(jī)制使得能實(shí)現(xiàn)次安全異常的有效處理,而無需通過安全異常處理 程序進(jìn)行代理。
[0012] 響應(yīng)于第一異常,異常控制電路在一個(gè)實(shí)施例中被配置成在觸發(fā)處理電路執(zhí)行異 常處理例程之前清除寄存器的第二子集。這意味著,在次安全域中的異常處理例程不能夠 訪問當(dāng)在安全域中時(shí)放入寄存器的第二子集的任何數(shù)據(jù)。
[0013] 進(jìn)一步地,在一個(gè)實(shí)施例中,響應(yīng)于第一異常,在異??刂齐娐酚|發(fā)處理電路執(zhí)行 異常處理例程之前,數(shù)據(jù)處理設(shè)備被配置成確保寄存器的第一子集不包含安全數(shù)據(jù)。存在 能夠?qū)崿F(xiàn)此情況的許多方式。例如,硬件或軟件都可以確保寄存器的第一子集被清除使得 那些寄存器不包含任何安全數(shù)據(jù)??商娲兀梢允羌拇嫫鞯牡谝蛔蛹軌虮磺擅畹卦O(shè)計(jì) 以便僅在處理電路被觸發(fā)執(zhí)行異常處理例程之前包括非安全數(shù)據(jù),在這種情況下可以沒有 必要清除寄存器的第一子集。
[0014] 在本申請(qǐng)中,術(shù)語"調(diào)用寄存器"和"被調(diào)用寄存器"可以被用來分別指示寄存器 的第一子集和第二子集。
[0015] 雖然異常處理例程負(fù)責(zé)執(zhí)行對(duì)來自寄存器的第二子集(被調(diào)用寄存器)的數(shù)據(jù) 的狀態(tài)保存,但是異常處理例程實(shí)際地執(zhí)行對(duì)來自第二子集的數(shù)據(jù)的狀態(tài)保存不總是必要 的。例如,如果異常控制電路已經(jīng)執(zhí)行額外的對(duì)寄存器的第二子集的狀態(tài)保存,則異常處理 例程能夠省略對(duì)這些寄存器的狀態(tài)保存。
[0016] 可替代地,更簡(jiǎn)單的方式可以是即使額外的狀態(tài)保存已經(jīng)由硬件執(zhí)行了,異常處 理例程也總是執(zhí)行對(duì)來自被調(diào)用寄存器的數(shù)據(jù)的狀態(tài)保存。因?yàn)榧拇嫫骺赡芤呀?jīng)被硬件 清除,所以異常處理例程無論如何都將不能夠訪問在被調(diào)用寄存器中預(yù)先保持的安全數(shù)據(jù) 值,并且與將已清除數(shù)據(jù)值保存到數(shù)據(jù)存儲(chǔ)裝置的次安全區(qū)以及之后(在異常完成時(shí))恢 復(fù)已清除數(shù)據(jù)值相關(guān)聯(lián)的開銷可能小于與提供用于允許異常處理例程檢測(cè)硬件是否已經(jīng) 執(zhí)行了額外的狀態(tài)保存的機(jī)制相關(guān)聯(lián)的開銷。
[0017] 關(guān)于寄存器的第一子集(調(diào)用寄存器)和寄存器的第二子集(被調(diào)用寄存器), 在一個(gè)實(shí)施例中寄存器的第一子集有可包括零個(gè)寄存器,使得需要在異常處理程序附近保 持的全部寄存器都是在第二子集中。在這種情況下,對(duì)于大多數(shù)異常,沒有狀態(tài)保存將由異 ??刂齐娐穪韴?zhí)行,異常處理例程負(fù)責(zé)第二子集中的所有寄存器的保存。然而,響應(yīng)于引起 從安全域到次安全域的轉(zhuǎn)變的第一異常,額外的狀態(tài)保存可以使用異??刂齐娐穼⒌诙?集(需要被保持的所有寄存器)保存在硬件中,以防止通過異常處理例程在次安全域中對(duì) 這種數(shù)據(jù)的訪問。
[0018] 另外的異常有可能在在當(dāng)前異常已完成的時(shí)刻是待決的。在這種情況下,處理電 路可以在返回到在當(dāng)前異常之前正被執(zhí)行的后臺(tái)處理之前向另外的異常提供服務(wù)。這種情 形被稱為"尾鏈",并且另外的異常被稱為"尾鏈化"異常。
[0019] 觸發(fā)額外的狀態(tài)保存的第一異??梢允钱?dāng)處理電路正在執(zhí)行后臺(tái)處理時(shí)發(fā)生的 初始異常??商娲兀谝划惓K旧砜梢允窃诔跏籍惓V蟮诜祷氐胶笈_(tái)處理之前被 處理的尾鏈化異常。
[0020] 在本申請(qǐng)中,術(shù)語"后臺(tái)處理"被用來指示被更高優(yōu)先級(jí)的異常中斷的處理。如果 異常處理例程它本身被更高優(yōu)先級(jí)異常(在本文中被稱為占先異常)中斷,則對(duì)于占先異 常來說,被中斷的異常處理例程它本身可以稱為"后臺(tái)處理",并且占先異常然后可以觸發(fā) 在異常處理例程被中斷之前正由異常處理例程所使用的數(shù)據(jù)的狀態(tài)保存。
[0021] 在使用尾鏈的一個(gè)實(shí)施例中,可以降低與尾鏈化異常有關(guān)地需要的狀態(tài)保存的 量。特別地,在一個(gè)實(shí)施例中,異??刂齐娐繁慌渲贸桑憫?yīng)于比其對(duì)應(yīng)的異常處理例程正 被執(zhí)行的當(dāng)前異常優(yōu)先級(jí)更低的新的異常,在使處理電路返回到后臺(tái)處理之前將新的異常 的處理作為尾鏈化異常控制。進(jìn)一步地,異??刂齐娐繁慌渲贸桑嗽诋?dāng)前異常在安全 域中被執(zhí)行、新的異常指示切換到次安全域、并且后臺(tái)處理在安全域中被執(zhí)行的情況下,在 控制新的異常的處理時(shí)不再執(zhí)行另外的狀態(tài)保存操作,因此異??刂齐娐繁慌渲贸桑诋?dāng) 前異常的異常處理例程的完成之后,執(zhí)行額外的對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保 存,并且確保寄存器的第二子集在觸發(fā)處理電路執(zhí)行與新的異常相對(duì)應(yīng)的異常處理例程之 前被清除。如較早地提到的那樣,寄存器的第一子集的清除取決于實(shí)施方式而可以是必要 的或不是必要的。當(dāng)非安全的尾鏈化異常跟隨它本身在安全后臺(tái)處理中引起中斷的安全異 常時(shí),這樣的方法允許數(shù)據(jù)的安全性被維持。
[0022] 在處理尾鏈化異常時(shí),關(guān)于狀態(tài)恢復(fù)操作,還能夠?qū)崿F(xiàn)另外的效率。例如,在一個(gè) 實(shí)施例中,異常控制電路被配置成,除了在當(dāng)前異常在次安全域中被執(zhí)行、新的異常指示切 換到安全域、并且后臺(tái)處理在安全域中被執(zhí)行的情況下,在控制新的異常的處理時(shí)不執(zhí)行 狀態(tài)恢復(fù)操作,因此異??刂齐娐繁慌渲贸桑卺槍?duì)當(dāng)前異常的異常處理例程的完成之后, 在觸發(fā)處理電路執(zhí)行與新的異常相對(duì)應(yīng)的異常處理例程之前執(zhí)行數(shù)據(jù)到寄存器的第二子 集中的狀態(tài)恢復(fù)操作。
[0023] 如較早地提到的那樣,當(dāng)當(dāng)前異常正被處理時(shí)發(fā)生的更高優(yōu)先級(jí)異常被作為占先 異常處理。如果早些時(shí)候在當(dāng)前異常的處理中發(fā)生這樣的占先異常,并且特別是當(dāng)異常控 制電路在觸發(fā)處理電路執(zhí)行針對(duì)當(dāng)前異常的異常處理例程之前仍然在處理較早地提到的 狀態(tài)保存或額外的狀態(tài)保存操作時(shí),則在一個(gè)實(shí)施例中能夠修改異??刂齐娐返臓顟B(tài)保存 和額外的狀態(tài)保存操作。特別地,在一個(gè)實(shí)施例中,如果當(dāng)執(zhí)行額外的寄存器的第二子集的 狀態(tài)保存時(shí)發(fā)生比第一異常具有更高優(yōu)先級(jí)的占先異常,并且占先異常不需要從安全域到 次安全域的轉(zhuǎn)變,則異常控制電路被配置成在觸發(fā)處理電路處理占先異常的異常處理例程 之前取消額外的狀態(tài)保存。
[0024] 可替代地,或另外地,如果當(dāng)前異常不引起從安全域到次安全域的轉(zhuǎn)變,并且如果 在與當(dāng)前異常相關(guān)聯(lián)的異常處理例程的處理開始之前發(fā)生比當(dāng)前異常具有更高優(yōu)先級(jí)并 且需要從安全域到次安全域的轉(zhuǎn)變的占先異常,則異??刂齐娐房梢员慌渲贸稍谟|發(fā)處理 電路處理占先異常的異常處理例程之前額外地執(zhí)行額外的來自寄存器的第二子集的數(shù)據(jù) 的狀態(tài)保存。
[0025] 如果在異??刂齐娐芬褕?zhí)行了任何需要的關(guān)于當(dāng)前異常的狀態(tài)保存或額外的狀 態(tài)保存并且處理電路已被觸發(fā)來執(zhí)行針對(duì)該當(dāng)前異常的異常處理例程之后但是在該異常 處理例程已完成之前發(fā)生占先異常,則在一個(gè)實(shí)施例中,異??刂齐娐繁慌渲贸桑?dāng)確定寄 存器的第一子集或寄存器的第一和第二子集二者的狀態(tài)保存在觸發(fā)處理電路執(zhí)行占先異 常的異常處理例程之前是需要的時(shí),將當(dāng)前異常視為后臺(tái)處理。
[0026] 在一個(gè)實(shí)施例中,數(shù)據(jù)存儲(chǔ)裝置包括多個(gè)堆棧,所述多個(gè)堆棧包括在安全區(qū)中的 安全堆棧和在次安全區(qū)中的次安全堆棧。在這樣的實(shí)施例中,當(dāng)執(zhí)行來自寄存器的第一子 集的數(shù)據(jù)的狀態(tài)保存和額外的來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存時(shí),異??刂齐娐?被配置成將數(shù)據(jù)保存到與處理電路在執(zhí)行后臺(tái)處理時(shí)正在操作的域的安全性相對(duì)應(yīng)的安 全堆棧和次安全堆棧中的一個(gè)。
[0027] 在一個(gè)實(shí)施例中,數(shù)據(jù)處理設(shè)備進(jìn)一步包括安全配置存儲(chǔ)位置以用于存儲(chǔ)指示多 個(gè)寄存器中的哪些可用于通過當(dāng)前執(zhí)行代碼用于存儲(chǔ)安全數(shù)據(jù)的安全配置值,其中,響應(yīng) 于引起從安全域到次安全域的轉(zhuǎn)變的異常,異常控制電路被配置成將由安全配置值所指示 的寄存器中的一個(gè)或多個(gè)包括在寄存器的第二子集內(nèi)。因此,這允許關(guān)于至少形成寄存器 的第二子集的寄存器的某種可配置性,并且因此允許關(guān)于哪些寄存器經(jīng)受由異??刂齐娐?所執(zhí)行的額外的狀態(tài)保存操作的某種可配置性。
[0028] 在一個(gè)實(shí)施例中,數(shù)據(jù)處理設(shè)備進(jìn)一步包括用于存儲(chǔ)異常返回值的存儲(chǔ)位置,處 理電路被配置成將域值設(shè)置在異常返回值內(nèi)以指示數(shù)據(jù)處理設(shè)備在從后臺(tái)處理取得初始 異常時(shí)操作的域,異??刂齐娐芬揽坑蛑祦泶_定寄存器中的哪些應(yīng)該經(jīng)受狀態(tài)保存或狀態(tài) 恢復(fù)操作。這提供用于在任何特定情形下允許異??刂齐娐反_定狀態(tài)保存和/或額外的狀 態(tài)保存是否是需要的簡(jiǎn)單機(jī)制。
[0029] 從第二方面看,本發(fā)明提供了一種數(shù)據(jù)處理設(shè)備,其包括:用于響應(yīng)于程序代碼而 執(zhí)行數(shù)據(jù)處理操作的數(shù)據(jù)處理電路;多個(gè)寄存器;以及用于存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,數(shù) 據(jù)存儲(chǔ)裝置包括每個(gè)區(qū)都具有安全級(jí)別的多個(gè)區(qū),并包括用于存儲(chǔ)數(shù)據(jù)處理電路在安全域 中操作時(shí)可訪問的而在次安全域中操作時(shí)不可訪問的敏感數(shù)據(jù)的至少一個(gè)安全區(qū)和用于 存儲(chǔ)次安全數(shù)據(jù)的次安全區(qū);數(shù)據(jù)存儲(chǔ)裝置包括至少兩個(gè)堆棧,在安全區(qū)中的安全堆棧和 在次安全區(qū)中的次安全堆棧;其中數(shù)據(jù)處理電路包括異常處理電路,異常處理電路被配置 成在數(shù)據(jù)處理電路正在安全域中執(zhí)行并且異常指示切換到次安全域中執(zhí)行程序代碼以清 除寄存器的寄存器集合時(shí)對(duì)異常的接收做出響應(yīng),在寄存器集合內(nèi)的寄存器取決于執(zhí)行的 域的安全級(jí)別和將發(fā)生異常的域。
[0030] 在一個(gè)這樣的實(shí)施例中,數(shù)據(jù)處理電路被進(jìn)一步配置成在清除一組寄存器之前, 將存儲(chǔ)在該組寄存器中的狀態(tài)保存到數(shù)據(jù)處理電路正在執(zhí)行的域的堆棧。
[0031] 此外,在一個(gè)實(shí)施例中,數(shù)據(jù)處理設(shè)備包括安全配置存儲(chǔ)位置以用于存儲(chǔ)指示多 個(gè)寄存器中的哪些可用于通過當(dāng)前執(zhí)行代碼用于存儲(chǔ)安全狀態(tài)的值,數(shù)據(jù)處理電路被配置 成依靠由安全配置值所指示的多個(gè)寄存器以及執(zhí)行的域的安全級(jí)別和將發(fā)生異常的域來 確定哪些寄存器是在該組寄存器內(nèi)。
[0032] 從第三方面看,本發(fā)明提供了一種在數(shù)據(jù)處理設(shè)備上處理數(shù)據(jù)的方法,數(shù)據(jù)處理 設(shè)備包括:用于響應(yīng)于程序代碼而執(zhí)行數(shù)據(jù)處理操作的處理電路,處理電路包括用于控制 異常處理的異??刂齐娐?;用于存儲(chǔ)數(shù)據(jù)的多個(gè)寄存器,寄存器包括寄存器的第一子集合 和寄存器的第二子集;以及用于存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,數(shù)據(jù)存儲(chǔ)裝置包括包括安全區(qū) 和次安全區(qū)在內(nèi)的多個(gè)區(qū),其中,安全區(qū)用于存儲(chǔ)可由處理電路當(dāng)在安全域中操作時(shí)訪問 并且不可由處理電路在次安全域中操作時(shí)訪問的數(shù)據(jù),方法包括:響應(yīng)于來自由處理電路 所執(zhí)行的后臺(tái)處理的初始異常,采用異??刂齐娐穪碓谟|發(fā)處理電路執(zhí)行與異常相對(duì)應(yīng)的 異常處理例程之前執(zhí)行對(duì)來自寄存器的第一子集的數(shù)據(jù)的狀態(tài)保存,其中,異常處理例程 負(fù)責(zé)執(zhí)行對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存;并且響應(yīng)于引起從安全域到次安全 域的轉(zhuǎn)變的第一異常,在后臺(tái)處理由處理電路在安全域中執(zhí)行的情況下,采用異??刂齐?路來在觸發(fā)處理電路在次安全域中執(zhí)行異常處理例程之前執(zhí)行額外的對(duì)來自寄存器的第 二子集的數(shù)據(jù)的狀態(tài)保存。
[0033] 從第四方面看,本發(fā)明提供了一種數(shù)據(jù)處理設(shè)備,其包括:用于響應(yīng)于程序代碼而 執(zhí)行數(shù)據(jù)處理操作的處理裝置,處理裝置包括用于控制異常處理的異常控制裝置;用于存 儲(chǔ)數(shù)據(jù)的多個(gè)寄存器裝置,包括寄存器裝置的第一子集和寄存器裝置的第二子集;以及用 于存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,包括包括安全區(qū)和次安全區(qū)在內(nèi)的多個(gè)區(qū),其中,安全區(qū)用于 存儲(chǔ)可由處理裝置在安全域中操作時(shí)訪問并且不可由處理裝置在次安全域中操作時(shí)訪問 的數(shù)據(jù);其中:響應(yīng)于來自由處理裝置所執(zhí)行的后臺(tái)處理的初始異常,異??刂蒲b置在觸 發(fā)處理裝置執(zhí)行與異常相對(duì)應(yīng)的異常處理例程之前執(zhí)行對(duì)來自寄存器裝置的第一子集的 數(shù)據(jù)的狀態(tài)保存,其中,異常處理例程負(fù)責(zé)執(zhí)行對(duì)來自寄存器裝置的第二子集的數(shù)據(jù)的狀 態(tài)保存;并且響應(yīng)于引起從安全域到次安全域的轉(zhuǎn)變的第一異常,在后臺(tái)處理由處理裝置 在安全域中執(zhí)行的情況下,異??刂蒲b置在觸發(fā)處理裝置在次安全域中執(zhí)行異常處理例程 之前執(zhí)行額外的對(duì)來自寄存器裝置的第二子集的數(shù)據(jù)的狀態(tài)保存。
【專利附圖】
【附圖說明】
[0034] 本發(fā)明將參考如附圖中所圖示的其實(shí)施例僅通過示例的方式來描述,在附圖中:
[0035] 圖1示出了具有帶安全區(qū)和非安全區(qū)的數(shù)據(jù)存儲(chǔ)裝置的根據(jù)一個(gè)實(shí)施例的數(shù)據(jù) 處理設(shè)備;
[0036] 圖2示意性地圖示了依照一個(gè)實(shí)施例數(shù)據(jù)處理設(shè)備的一組寄存器如何可以被分 割成調(diào)用寄存器和被調(diào)用寄存器;
[0037] 圖3A和3B示意性地圖示了依照實(shí)施例的由異??刂齐娐匪鶊?zhí)行的壓棧和出棧操 作;
[0038] 圖4示意性地示出了在代碼執(zhí)行期間針對(duì)各種不同場(chǎng)景的異常(在這個(gè)示例中為 中斷)的取得;
[0039] 圖5是示出了依照一個(gè)實(shí)施例在初始異常以及然后另外的異常被接收到時(shí)所被 保存的狀態(tài)的表;
[0040] 圖6針對(duì)示例實(shí)施例示出了其狀態(tài)在異常的取得時(shí)取決于為了取得該異常所需 要的域轉(zhuǎn)變而被保存到堆棧的寄存器;
[0041] 圖7A和7B圖示了依照一個(gè)實(shí)施例的兩個(gè)示例尾鏈場(chǎng)景;
[0042] 圖8A和8B圖示了依照一個(gè)實(shí)施例的另外兩個(gè)尾鏈場(chǎng)景;
[0043] 圖9A和9B圖示了依照一個(gè)實(shí)施例的兩個(gè)早期占先場(chǎng)景;
[0044] 圖10示意性地圖示了依照一個(gè)實(shí)施例的能夠在處理占先異常時(shí)使用的分解技 術(shù);
[0045] 圖11示意性地圖示了依照一個(gè)實(shí)施例用來存儲(chǔ)包括安全性位的異常返回值的鏈 路寄存器的使用;
[0046] 圖12是圖示了依照一個(gè)實(shí)施例在接收到異常時(shí)執(zhí)行的壓棧操作的流程圖;以及
[0047] 圖13是圖示了依照一個(gè)實(shí)施例在完成異常時(shí)執(zhí)行的出棧操作的流程圖。
【具體實(shí)施方式】
[0048] 圖1示出了例如可以是微控制器的數(shù)據(jù)處理設(shè)備10。它包括用于處理指令的處理 電路20和數(shù)據(jù)存儲(chǔ)裝置30,該數(shù)據(jù)存儲(chǔ)裝置30用于存儲(chǔ)由處理電路20所處理的數(shù)據(jù)并且 同樣用于存儲(chǔ)處理電路20執(zhí)行的程序代碼。
[0049] 數(shù)據(jù)存儲(chǔ)裝置30具有不同安全性的兩個(gè)區(qū),安全區(qū)32和非安全區(qū)34 (在本文中 也被稱為次安全區(qū))。被存儲(chǔ)在非安全區(qū)34中的代碼在執(zhí)行時(shí)不可訪問在安全區(qū)32中存 儲(chǔ)的數(shù)據(jù)。
[0050] 數(shù)據(jù)處理設(shè)備10還具有控制對(duì)安全32和非安全34區(qū)的訪問的存儲(chǔ)器保護(hù)單元 MPU40。盡管這種控制可以通過存儲(chǔ)器保護(hù)單元來執(zhí)行,但是在其它實(shí)施例中,它可以由在 該處理設(shè)備內(nèi)的電路以更分布式的方式完成,所述電路監(jiān)控當(dāng)前正被執(zhí)行的代碼所被存儲(chǔ) 在里面的區(qū),并且依靠此來控制對(duì)存儲(chǔ)器的不同區(qū)的訪問。
[0051] 在這個(gè)實(shí)施例中,處理電路20正在其中執(zhí)行的域的安全性根據(jù)當(dāng)前正被執(zhí)行的 代碼所被存儲(chǔ)在的區(qū)來確定(用于確定操作的當(dāng)前域的其它技術(shù)也是可能的)。因此,在安 全數(shù)據(jù)存儲(chǔ)裝置32中存儲(chǔ)的安全程序代碼在安全域中被執(zhí)行并且使用安全堆棧36將數(shù)據(jù) 值存儲(chǔ)在里面。類似地,在非安全數(shù)據(jù)存儲(chǔ)裝置34中存儲(chǔ)的非安全代碼在非安全域(在本 文中也被稱為次安全域)中被執(zhí)行,并且使用非安全堆棧38用于在執(zhí)行期間存儲(chǔ)數(shù)據(jù)值。
[0052] 處理電路20具有用于取出要被執(zhí)行的指令的取出電路22。它同樣具有用于對(duì)這 些指令進(jìn)行解碼的解碼電路24和用于執(zhí)行它們的執(zhí)行電路26。要被執(zhí)行的指令由取出電 路22經(jīng)由存儲(chǔ)器保護(hù)單元MPU40從數(shù)據(jù)存儲(chǔ)裝置30取出。指令和數(shù)據(jù)經(jīng)由MPU40來檢索, 所述MPU40控制對(duì)安全區(qū)和非安全區(qū)的訪問并且使安全數(shù)據(jù)與非安全側(cè)隔離。
[0053] 在這個(gè)實(shí)施例中,存在具有在數(shù)據(jù)處理期間使用的通用寄存器的寄存器組60。這 些通用寄存器具有指示哪一個(gè)指令是要被執(zhí)行的下一個(gè)指令的程序計(jì)數(shù)器PC,以及指示當(dāng) 前堆??蚣芪挥谠诙褩V械哪囊粋€(gè)點(diǎn)處的堆棧指針SP。在這個(gè)實(shí)施例中,因?yàn)樵诎踩珎?cè) 中存在堆棧并且在非安全側(cè)中也存在堆棧,所以存在安全堆棧指針SSP和非安全堆棧指針 NSP,但是在任何時(shí)候僅其中一個(gè)對(duì)于正在執(zhí)行的程序而言是直接可見的。應(yīng)該注意的是, 在一些實(shí)施例中,對(duì)于每個(gè)堆棧來說可以存在多個(gè)堆棧指針,但是同樣在任何時(shí)候僅一個(gè) 將是可見的。在寄存器組60中還存在通用寄存器以用于存儲(chǔ)由處理電路20正在處理的數(shù) 據(jù)值。在這個(gè)實(shí)施例中,這些數(shù)據(jù)值被標(biāo)記為R0至R12。
[0054] 寄存器組60還包括鏈路寄存器65,所述鏈路寄存器65可以被用來在異常被取得 或者函數(shù)被調(diào)用時(shí)存儲(chǔ)返回值。返回值允許系統(tǒng)確定返回是異常返回還是函數(shù)返回,并且 確定在從異?;蚝瘮?shù)返回時(shí)需要什么處理??梢允褂貌煌N類的返回值,包括指示異常返 回并且能夠包括信息的異常返回(EXC_RETURN)值,諸如后臺(tái)處理在里面被處理的域的安 全性級(jí)別的指示,所述指示能夠使得處理器能夠確定如何處理異常返回,例如在恢復(fù)狀態(tài) 時(shí)要訪問哪一個(gè)堆棧以及有多少寄存器需要被加載。
[0055] 圖1還示出了具有諸如浮點(diǎn)寄存器之類的額外的專用寄存器的額外的寄存器組 64。在一個(gè)實(shí)施例中,能夠?qū)⒅翟O(shè)置在安全配置寄存器(SCR)62中以標(biāo)識(shí)在額外的寄存器 組64中的寄存器中的任一個(gè)是否能夠存儲(chǔ)安全數(shù)據(jù),并且如果是這樣的話,則那些寄存器 將被認(rèn)為(連同寄存器組60的寄存器一起)形成在控制從安全域到次安全域的轉(zhuǎn)變時(shí)需 要被管理的一組寄存器的一部分,并且反之亦然。
[0056] 依照所描述的實(shí)施例,能夠被用來在安全性域之間轉(zhuǎn)變的一個(gè)機(jī)制是異常機(jī)制。 依照這種機(jī)制,在發(fā)生異常時(shí),將臨時(shí)地暫停當(dāng)前軟件例程的執(zhí)行,并且替代地執(zhí)行將分支 到用來處理該異常的異常處理例程,所使用的異常處理例程取決于異常發(fā)生的類型。一旦 異常處理例程已被執(zhí)行,異常返回然后將被用來返回到作為異常發(fā)生的結(jié)果而被臨時(shí)地暫 停的原始軟件例程。
[0057] 異??刂齐娐?8被提供來控制異常的取得,并且在這些異常導(dǎo)致從更安全到次 安全域的轉(zhuǎn)變的情況下,在異常的取得之前清除可以存儲(chǔ)敏感數(shù)據(jù)的該組寄存器以避免在 這些寄存器中存儲(chǔ)的數(shù)據(jù)可被非安全側(cè)獲得。在這些寄存器中的一些或全部中存儲(chǔ)的狀態(tài) 將在異??刂齐娐?8的控制下被存儲(chǔ)在安全堆棧上,使得在從異常返回時(shí)能夠恢復(fù)該狀 態(tài)。
[0058] 雖然在圖1中數(shù)據(jù)存儲(chǔ)裝置30包含單個(gè)安全區(qū)和單個(gè)非安全區(qū),但是在本文中所 描述的技術(shù)同樣地適用于包括兩個(gè)以上的不同安全性區(qū)的不同實(shí)施方式。
[0059] 并且,雖然圖1將異??刂齐娐?8示出為與諸如執(zhí)行級(jí)26之類的處理電路20的 其它部分分離,但是在實(shí)踐中,異常控制電路28可以至少部分再使用處理電路20的一些元 件來控制異常的處理。
[0060] 在控制從安全域到次安全域的轉(zhuǎn)變并且反之亦然時(shí)需要被管理的寄存器的集合 100在圖2中被示意性地圖示。依照所描述的實(shí)施例,這些寄存器中的一些被定義為調(diào)用寄 存器110,而寄存器中的其它寄存器被定義為被調(diào)用寄存器120。調(diào)用寄存器是異??刂齐?路28將總是負(fù)責(zé)將狀態(tài)保存到堆棧上的那些寄存器,而不管異常處理例程將在其中執(zhí)行 的域如何。在默認(rèn)情況下,異常處理例程則負(fù)責(zé)將對(duì)被調(diào)用寄存器的狀態(tài)保存。特別地,異 常處理例程然后將被調(diào)用寄存器的狀態(tài)保存到與異常處理例程正在其中執(zhí)行的域相關(guān)聯(lián) 的堆棧上。進(jìn)一步地,異常處理例程然后將負(fù)責(zé)在發(fā)出異常返回之前恢復(fù)那些被調(diào)用寄存 器的狀態(tài)(典型地通過將它們從堆棧往回拷貝到有關(guān)寄存器中)。
[0061] 然而,依照所描述的實(shí)施例,在異常將需要從安全域到次安全域的轉(zhuǎn)變、并且后臺(tái) 處理是在安全域中的情形下,異??刂齐娐?8在使處理電路轉(zhuǎn)變到異常處理例程的執(zhí)行 之前額外地負(fù)責(zé)將被調(diào)用寄存器的狀態(tài)保存在安全堆棧36的堆棧幀內(nèi)。
[0062] 如較早地討論的那樣,SCR寄存器62的內(nèi)容將定義哪些寄存器可以被用來存儲(chǔ)安 全數(shù)據(jù),以及因此哪些寄存器需要被包含在寄存器的集合100內(nèi)。在一個(gè)實(shí)施例中,SCR寄 存器62的內(nèi)容將標(biāo)識(shí)額外的專用寄存器64中的任一個(gè)是否同樣將被包括在除通用寄存器 60之外的集合100內(nèi)。
[0063] 圖3A圖示了針對(duì)三個(gè)不同場(chǎng)景的異??刂齐娐穼?duì)異常的發(fā)生和對(duì)該異常的后續(xù) 完成的操作。場(chǎng)景中的第一個(gè)是其中后臺(tái)處理是在安全域中,并且異常將由異常處理例程 在安全域中處理,場(chǎng)景中的第二個(gè)是其中后臺(tái)處理是在非安全域中,并且異常將由異常處 理例程在安全域處理,以及第三場(chǎng)景是其中后臺(tái)處理是在非安全域中,并且異常將由異常 處理例程在非安全域中處理。
[0064] 在這三個(gè)場(chǎng)景中的每一個(gè)中,當(dāng)后臺(tái)處理130被異常中斷時(shí),異??刂齐娐?8被 布置成在觸發(fā)處理電路執(zhí)行所需要的異常處理例程140以便處理異常之前,在點(diǎn)135處將 來自調(diào)用寄存器的數(shù)據(jù)壓棧到與后臺(tái)處理在其中正被執(zhí)行的域相關(guān)聯(lián)的堆棧上。在異常完 成時(shí),異??刂齐娐吩邳c(diǎn)150處恢復(fù)后臺(tái)處理之前同樣在點(diǎn)145處將預(yù)先壓棧的數(shù)據(jù)從有 關(guān)堆棧出棧回到調(diào)用寄存器中。
[0065] 異常處理例程將典型地負(fù)責(zé)在異常處理例程期間在使用這些寄存器之前將來自 被調(diào)用寄存器的數(shù)據(jù)壓棧,并且負(fù)責(zé)稍后在異常處理例程的結(jié)束之前將該數(shù)據(jù)出?;氐奖?調(diào)用寄存器中。
[0066] 在圖3A的示例中,取決于特定實(shí)施方式,調(diào)用存儲(chǔ)器在異常處理例程被執(zhí)行之前 可以被或者不被硬件清除。在一個(gè)實(shí)施例中,將不清除調(diào)用寄存器的內(nèi)容,因?yàn)樗O(shè)想的三 個(gè)場(chǎng)景要么在異常被取得時(shí)不導(dǎo)致域的轉(zhuǎn)變,要么僅導(dǎo)致從非安全域到安全域的轉(zhuǎn)變,并 且在一個(gè)實(shí)施例中,安全域被允許看到非安全數(shù)據(jù)。
[0067] 圖3B圖示了針對(duì)其正在安全域中處理后臺(tái)處理并且異常需要到非安全域的轉(zhuǎn)變 的場(chǎng)景的異常控制電路對(duì)異常的發(fā)生并且對(duì)異常的后續(xù)完成的操作。在這個(gè)示例中,當(dāng)后 臺(tái)處理160被異常中斷時(shí),異常控制電路被配置成在點(diǎn)165處將來自調(diào)用寄存器的數(shù)據(jù)壓 棧到安全堆棧上,并且額外地在點(diǎn)170處被布置成將來自被調(diào)用寄存器的數(shù)據(jù)壓棧到安全 堆棧上。異常控制電路然后還將確保在觸發(fā)處理電路執(zhí)行異常處理例程175之前清除調(diào)用 和被調(diào)用寄存器的內(nèi)容。因此,在這種場(chǎng)景中,非安全異常處理例程不能夠訪問在調(diào)用或被 調(diào)用寄存器中預(yù)先保持的安全數(shù)據(jù)。
[0068] 在完成異常處理例程時(shí),異??刂齐娐啡缓髮⒃邳c(diǎn)180處將預(yù)先壓棧的被調(diào)用數(shù) 據(jù)從安全堆棧出?;氐奖徽{(diào)用寄存器中,并且在點(diǎn)190處恢復(fù)后臺(tái)處理之前,還將在點(diǎn)185 處將預(yù)先壓棧的調(diào)用數(shù)據(jù)從安全堆棧出?;氐秸{(diào)用寄存器中。
[0069] 在一個(gè)特定實(shí)施例中,非安全異常處理例程仍然能夠被布置成照常保存被調(diào)用寄 存器的狀態(tài),但是在這種場(chǎng)景中,那些被調(diào)用寄存器將是空的,并且因此異常處理例程將僅 僅將清除值存儲(chǔ)到它將在發(fā)出異常返回之前稍后恢復(fù)到寄存器中的非安全堆棧上。
[0070] 如上面所說明的那樣,作為架構(gòu)中的默認(rèn)位置,寄存器狀態(tài)的一部分由硬件在異 常(例如中斷)發(fā)生并且完成時(shí)自動(dòng)地保存和恢復(fù)。通過擴(kuò)展這樣的架構(gòu)以保存并且清除 整個(gè)寄存器狀態(tài)或安全域使用的寄存器狀態(tài)中的至少全部,在中斷引起安全到非安全轉(zhuǎn)變 的情況下,硬件能夠在異常附近維持安全性。
[0071] 通過利用上述技術(shù),有可能通過擴(kuò)展自動(dòng)寄存器堆棧系統(tǒng)來去除通過安全狀態(tài)代 理中斷的要求以便使異常控制電路將調(diào)用和被調(diào)用寄存器中的全部壓入到堆棧(代替僅 僅調(diào)用保存的寄存器),以及然后以便在切換到非安全狀態(tài)并且跳轉(zhuǎn)到異常處理例程(在 中斷的示例中為中斷向量)之前清除它們的值。為了使中斷延遲時(shí)間保持盡可能低,額外 的寄存器狀態(tài)在從安全向非安全狀態(tài)轉(zhuǎn)變時(shí)被僅壓入到堆棧上。這在異常處理期間發(fā)生較 高優(yōu)先級(jí)異常(所謂的占先異常)時(shí)或在處理尾鏈異常時(shí)引入很多復(fù)雜性。圖4示出了一 些示例。
[0072] 在第一示例中,在安全狀態(tài)下執(zhí)行后臺(tái)程序代碼并且接收到第一安全中斷。寄存 器(即調(diào)用寄存器)的子集被保存到安全堆棧,并且然后(雖然第一安全中斷仍然正經(jīng)由 適當(dāng)?shù)闹袛嘞蛄刻幚恚┬枰诜前踩蛑刑幚淼牡诙^高優(yōu)先級(jí)中斷被接收到。因?yàn)樗?要在非安全域中處理,所以在安全寄存器中的信息都不應(yīng)該對(duì)于新的中斷向量例程而言是 可見的,并且因此所有安全寄存器(調(diào)用和被調(diào)用寄存器兩者)應(yīng)該被保存到安全堆棧并 且然后在取得這個(gè)中斷之前清除。當(dāng)?shù)诙袛嘁淹瓿蓵r(shí),處理返回到非完成的初始安全中 斷,并且響應(yīng)于第二中斷而被壓入到安全堆棧的寄存器在該點(diǎn)通過彈出安全堆棧來恢復(fù)。 這個(gè)第一安全中斷然后能夠完成,因此在重新開始安全后臺(tái)處理之前,被壓入到堆棧的原 始子集然后能夠通過彈出安全堆棧來恢復(fù)。
[0073] 在第二示例中,第二中斷具有比第一中斷更低的優(yōu)先級(jí),并且因此第一中斷將因 此在取得非安全第二中斷之前完成。一旦第一中斷已完成,然后剩余的寄存器(即被調(diào)用 寄存器)就被壓入到安全堆棧,并且在取得非安全中斷之前清除所有寄存器。雖然重要的 是在該點(diǎn)處清除調(diào)用和被調(diào)用寄存器兩者,但異??刂齐娐穼?shí)際上可以不需要在這個(gè)階段 清除所有寄存器,因?yàn)槔缈赡芤呀?jīng)較早地清除了調(diào)用寄存器。在非安全中斷的末期,已被 壓入到安全堆棧的寄存器中的全部被恢復(fù)。
[0074] 第三示例示出了接收到安全中斷因此存在寄存器(調(diào)用寄存器)到非安全堆棧的 部分保存的非安全后臺(tái)代碼。如果然后接收到具有較高優(yōu)先級(jí)的第二非安全中斷,則安全 寄存器(調(diào)用和被調(diào)用)中的全部都將需要被壓入到安全堆棧并且在它能夠被取得之前清 除。當(dāng)非安全中斷完成時(shí),所有的安全寄存器需要從堆棧彈出,并且然后當(dāng)安全中斷完成 時(shí),非安全寄存器的原始子集被彈出。
[0075] 第四示例示出了接收到使調(diào)用保存的寄存器被壓入到安全堆棧的安全中斷、但是 在這個(gè)過程完成之前發(fā)生第二較高優(yōu)先級(jí)非安全中斷的安全后臺(tái)代碼。這個(gè)第二中斷使剩 余的寄存器(即被調(diào)用寄存器)在調(diào)用寄存器已被壓棧之后被壓入到安全堆棧上,從而導(dǎo) 致所有寄存器的壓入被執(zhí)行。所有寄存器然后在取得非安全中斷之前被清除。在完成這個(gè) 中斷時(shí),被調(diào)用保存的寄存器在取得安全中斷之前被從安全堆棧彈出。當(dāng)安全中斷完成時(shí), 從安全堆棧彈出原始調(diào)用寄存器。
[0076] 圖5示出了指示潛在中斷和需要被執(zhí)行的狀態(tài)保存的表。在這點(diǎn)上,"壓入子集" 是將寄存器的調(diào)用保存的子集壓入到堆棧上,"壓入剩余"是將寄存器的被調(diào)用保存的子集 壓入到堆棧上,以及"壓入所有"是將調(diào)用和被調(diào)用寄存器狀態(tài)兩者壓入到堆棧上。在這點(diǎn) 上,在一些寄存器不可用于存儲(chǔ)敏感數(shù)據(jù)并且這是已知的情況下,然后這些寄存器可以無 需被壓入到堆棧上。
[0077] 在表中,"異常進(jìn)入"列標(biāo)識(shí)如果在分支到初始中斷的異常向量(其將在本文中被 稱為早期占先場(chǎng)景)之前發(fā)生比初始中斷具有更高優(yōu)先級(jí)的另外的中斷則什么狀態(tài)被壓 入到堆棧上。"異常返回"列標(biāo)識(shí)如果發(fā)生具有低于或等于初始中斷的優(yōu)先級(jí)的另外的中斷 并且因此未被取得直到初始中斷完成為止則什么狀態(tài)被壓入、彈出或者清除(這將在本文 中被稱為尾鏈場(chǎng)景)。雖然表中所標(biāo)識(shí)的動(dòng)作典型地是由異??刂齐娐酚布?8所承擔(dān)的動(dòng) 作,但是緊跟安全中斷之后清除與非安全中斷的尾鏈相關(guān)聯(lián)的調(diào)用寄存器("清除子集") 的動(dòng)作在后臺(tái)處理是在非安全域中的情形下事實(shí)上可以由軟件而不是異??刂齐娐酚布?來執(zhí)行。對(duì)于在后臺(tái)處理是在安全域中的情形下緊跟安全中斷之后與非安全中斷的尾鏈相 關(guān)聯(lián)的寄存器清除(形成"壓入剩余并且清除所有"操作的一部分)的至少一部分情況也 可能是這樣的,其中軟件能夠被布置成清除調(diào)用寄存器,可是硬件然后將壓入并且清除被 調(diào)用寄存器。
[0078] 如從圖5的表的回顧顯而易見,當(dāng)從安全向非安全狀態(tài)轉(zhuǎn)變時(shí),需要從寄存器去 除能夠保存安全狀態(tài)的所有寄存器中的值,使得它們不可被非安全側(cè)獲得,并且因此除常 見調(diào)用保存的寄存器狀態(tài)之外,還執(zhí)行額外的保存和清除。
[0079] 圖6示出了一個(gè)實(shí)施例的堆棧幀,并且特別是在從相同狀態(tài)或次安全狀態(tài)取得中 斷時(shí)保存到堆棧的堆棧幀上的寄存器內(nèi)容(圖6的左手側(cè))和在轉(zhuǎn)變?yōu)榇伟踩珷顟B(tài)時(shí)保存 到堆棧幀上的內(nèi)容(圖6的右手側(cè))。在這點(diǎn)上,在后者情況下需要保存并且清除更多寄存 器,因?yàn)楫?dāng)這是必須不可被次安全狀態(tài)獲得的安全狀態(tài)時(shí)不能夠讓寄存器存儲(chǔ)任何狀態(tài)。
[0080] 圖6標(biāo)識(shí)了依照特定實(shí)施例的哪些寄存器被認(rèn)為是調(diào)用寄存器并且哪些寄存器 被認(rèn)為是被調(diào)用寄存器。然而,如較早地討論的那樣,確切地哪些寄存器需要被包括在調(diào)用 和被調(diào)用寄存器內(nèi)可以取決于實(shí)施例而不同,并且能夠由安全配置寄存器62中的值來指 示,使得所需要的狀態(tài)的保存和寄存器的清除能夠通過使用這個(gè)值來確定。這個(gè)值可以由 編譯器針對(duì)特定設(shè)備來設(shè)置,并且這允許特定設(shè)備被以不同的方式使用以及在產(chǎn)品中提供 某種靈活性。在其它實(shí)施例中,它可以由軟件例如在系統(tǒng)正在啟動(dòng)時(shí)設(shè)置。
[0081] 如將從上述描述所指出的那樣,異??刂齐娐吩诎l(fā)生異常時(shí)將寄存器狀態(tài)的調(diào)用 保存的段自動(dòng)地壓入和彈出到堆棧,并且必要時(shí)改變哪一個(gè)堆棧指針以及因此哪一個(gè)堆棧 被使用。這甚至在具有安全和次安全域的系統(tǒng)中也允許以下優(yōu)點(diǎn)被呈現(xiàn):降低的中斷延遲 時(shí)間;降低的中斷抖動(dòng);能夠用C語言代替匯編語言編寫異常處理程序;它使得能實(shí)現(xiàn)像異 常進(jìn)入上的異常和尾鏈這樣的最優(yōu)化。
[0082] 圖7A和7B圖示了一些特定尾鏈?zhǔn)纠龍?chǎng)景。在圖7A的示例中,在點(diǎn)250處正在執(zhí)行 安全后臺(tái)處理,但是在點(diǎn)255處發(fā)生需要異常處理例程在安全域中被執(zhí)行的初始異常。因 此,在點(diǎn)255處,異??刂齐娐穼碜哉{(diào)用寄存器的數(shù)據(jù)壓棧到安全堆棧上,隨后在點(diǎn)260 處執(zhí)行異常處理例程。
[0083] 在點(diǎn)257處,發(fā)生另外的較低優(yōu)先級(jí)異常,并且因此該異常仍然是未決的直到初 始異常在點(diǎn)265處完成為止。在該點(diǎn)處,異??刂齐娐反_定從安全到非安全域的轉(zhuǎn)變是需 要的以便處理另外的異常,并且因此在該點(diǎn)處將被調(diào)用寄存器壓棧。它同樣確保在觸發(fā)處 理電路在非安全域中執(zhí)行所需要的異常處理例程以便在點(diǎn)270處處理另外的異常之前,被 調(diào)用寄存器已被清除(調(diào)用寄存器已例如被軟件較早地清除)。在點(diǎn)275處完成另外的異 常時(shí),異??刂齐娐啡缓笤邳c(diǎn)280處重新開始后臺(tái)處理之前將調(diào)用和被調(diào)用寄存器中的全 部的內(nèi)容出棧。
[0084] 圖7B圖示了類似的示例,但在這個(gè)示例中,后臺(tái)處理在點(diǎn)300處是在非安全域中。 當(dāng)在點(diǎn)305處發(fā)生初始異常時(shí),然后在點(diǎn)310處執(zhí)行針對(duì)初始異常的異常處理例程之前,異 ??刂齐娐废袼趫D7A的示例中所做的那樣將調(diào)用寄存器壓棧。在點(diǎn)307處發(fā)生的另外 的較低優(yōu)先級(jí)異常然后保持未決直到初始異常的處理在點(diǎn)315處結(jié)束為止。然而,在該點(diǎn) 處,因?yàn)楹笈_(tái)處理是非安全的,所以異常控制電路不執(zhí)行壓棧。如參考圖5的表較早地討論 的那樣,可以在這個(gè)階段進(jìn)行的可選步驟是清除調(diào)用寄存器,但是這個(gè)步驟可以替代地由 軟件代替異??刂齐娐酚布韴?zhí)行。其后在點(diǎn)320處,在非安全域中處理針對(duì)另外的異常 的異常處理例程。在點(diǎn)325處完成該另外的異常時(shí),異??刂齐娐吩邳c(diǎn)330處返回到后臺(tái) 處理之前將調(diào)用寄存器出棧。
[0085] 在一個(gè)實(shí)施例中,圖7A的示例是異??刂齐娐凡坏貌辉诹硗獾漠惓>o跟初始異 常的完成之后作為尾鏈化異常被處理時(shí)執(zhí)行某種額外的壓棧、并且因此執(zhí)行壓棧的開銷保 持至最小同時(shí)在處理尾鏈化異常時(shí)保持安全數(shù)據(jù)的安全性的僅有示例。
[0086] 圖8A和8B圖示了兩個(gè)另外的尾鏈?zhǔn)纠?。在圖8A的示例中,在點(diǎn)350處正在執(zhí)行 安全后臺(tái)處理,但是在點(diǎn)355處發(fā)生需要異常處理例程在非安全域中執(zhí)行的初始異常。因 此,在點(diǎn)355處,異??刂齐娐穼碜哉{(diào)用寄存器和被調(diào)用寄存器的數(shù)據(jù)壓棧到安全堆棧 上,隨后在點(diǎn)360處執(zhí)行異常處理例程。
[0087] 在點(diǎn)357處,發(fā)生另外的較低優(yōu)先級(jí)異常,并且因此該異常仍然是未決的直到初 始異常在點(diǎn)365處完成為止。在該點(diǎn)處,異??刂齐娐反_定從非安全到安全域的轉(zhuǎn)變是需 要的以便處理另外的異常,并且因此在該點(diǎn)處在觸發(fā)處理電路在安全域中執(zhí)行所需要的異 常處理例程以便在點(diǎn)370處處理該另外的異常之前將被調(diào)用寄存器出棧。在點(diǎn)375處完成 該另外的異常時(shí),異??刂齐娐啡缓笤邳c(diǎn)380處重新開始后臺(tái)處理之前將調(diào)用寄存器的內(nèi) 容出棧。
[0088] 圖8B圖示了類似的示例,但在這個(gè)示例中,后臺(tái)處理在點(diǎn)400處是在非安全域中。 當(dāng)在點(diǎn)405處發(fā)生初始異常時(shí),然后在點(diǎn)410處執(zhí)行針對(duì)初始異常的異常處理例程之前,異 ??刂齐娐穼⒄{(diào)用寄存器壓棧。在點(diǎn)407處發(fā)生的另外的較低優(yōu)先級(jí)異常然后保持未決直 到初始異常的處理在點(diǎn)415處結(jié)束為止。然而,在該點(diǎn)處,異常控制電路確定不需要堆棧操 作。其后在點(diǎn)420處在安全域中處理針對(duì)該另外的異常的異常處理例程。在點(diǎn)425處完成 該另外的異常時(shí),異常控制電路在點(diǎn)430處返回到后臺(tái)處理之前將調(diào)用寄存器出棧。
[0089] 在一個(gè)實(shí)施例中,圖8A的示例是在異常控制電路不得不在另外的異常緊跟初始 異常的完成之后作為尾鏈化異常被處理時(shí)執(zhí)行出棧操作、并且因此執(zhí)行出棧的開銷保持至 最小同時(shí)在處理尾鏈化異常時(shí)保持安全數(shù)據(jù)的安全性的簡(jiǎn)單尾鏈情形下的僅有示例。
[0090] 圖9A和9B圖示了依照一個(gè)實(shí)施例的兩個(gè)早期占先場(chǎng)景。在圖9A的示例中,在 安全域中在點(diǎn)450處執(zhí)行的后臺(tái)處理具有優(yōu)先等級(jí)1,但是在接收到具有優(yōu)先等級(jí)10并且 需要在安全域中處理的異常時(shí),異??刂齐娐烽_始在點(diǎn)455處將調(diào)用寄存器壓棧以為在點(diǎn) 460處轉(zhuǎn)變到安全異常處理例程作準(zhǔn)備。然而,在完成調(diào)用寄存器的壓棧之前,在點(diǎn)465處 接收到另外的異常,其具有較高的優(yōu)先等級(jí)(在這個(gè)示例中優(yōu)先等級(jí)為12),并且需要轉(zhuǎn)變 到非安全域。如在圖9A的右手側(cè)所示,在該點(diǎn)處,異??刂齐娐返膲簵;顒?dòng)性被修改使得 它將調(diào)用和被調(diào)用寄存器兩者壓棧(見點(diǎn)470),隨后處理電路被觸發(fā)來在點(diǎn)475處執(zhí)行針 對(duì)該另外的異常的異常處理代碼。其后,優(yōu)先等級(jí)10的安全異常然后能夠作為尾鏈化異常 被處理。
[0091] 在圖9B的示例中,在安全域中在點(diǎn)500處執(zhí)行的后臺(tái)處理具有優(yōu)先等級(jí)1,但是在 接收到具有優(yōu)先等級(jí)10并且需要在非安全域中處理的異常時(shí),異??刂齐娐烽_始在點(diǎn)505 處將調(diào)用和被調(diào)用寄存器壓棧以為在點(diǎn)510處轉(zhuǎn)變到非安全異常處理例程作準(zhǔn)備。然而, 在完成寄存器的壓棧之前,在點(diǎn)515處接收到另外的異常,其具有較高的優(yōu)先等級(jí)(在這個(gè) 示例中優(yōu)先等級(jí)為12),并且需要轉(zhuǎn)變到安全域。如在圖9B的右手側(cè)所示,在該點(diǎn)處,異常 控制電路的壓棧活動(dòng)性被修改使得它僅將調(diào)用寄存器壓棧(見點(diǎn)520),并且必要時(shí)這牽涉 取消已經(jīng)發(fā)生的任何被調(diào)用寄存器壓棧的效果(例如,通過將那些受影響被調(diào)用寄存器的 數(shù)據(jù)出棧)。其后,處理電路被觸發(fā)來在點(diǎn)525處在安全域中執(zhí)行針對(duì)該另外的異常的異常 處理代碼。其后,優(yōu)先等級(jí)10的安全異常然后能夠作為尾鏈化異常被處理。
[0092] 圖10示意性地圖示了依照一個(gè)實(shí)施例能夠在處理占先異常時(shí)使用的分解技術(shù)。 不像參考圖9A和9B所討論的較早示例,在圖10的示例中假定了到發(fā)生占先異常的時(shí)刻, 已經(jīng)發(fā)生了與當(dāng)前異常相關(guān)聯(lián)的任何狀態(tài)保存,并且處理電路已被觸發(fā)來執(zhí)行所必要的異 常處理例程。因此,在該點(diǎn)處,然后將需要中斷當(dāng)前異常處理例程的處理以便允許占先異常 被取得。
[0093] 如圖10所示,在這樣的場(chǎng)景中,占先異常的各種層次能夠通過改變什么被視為后 臺(tái)處理來分解。特別地,如由轉(zhuǎn)變550、560所示,這些能夠被分解回為簡(jiǎn)單情況565,并且 因此當(dāng)取得第一異常時(shí),后臺(tái)處理是安全處理Si,以及最終當(dāng)?shù)谝划惓M瓿蓵r(shí),所返回到的 后臺(tái)處理再次是Si。對(duì)于第二異常,在取得占先異常的時(shí)刻,后臺(tái)處理的視圖像由虛線圓 555示意性地圖示的那樣被改變,使得后臺(tái)處理被認(rèn)為是非安全處理N 2,并且因此異??刂?電路將占先異常視為簡(jiǎn)單情況570。因此,出于決定在取得異常S3時(shí)需要什么狀態(tài)保存和 /或恢復(fù)的目的,異??刂齐娐穼⒑笈_(tái)處理視為非安全處理N 2。
[0094] 如圖11所示,在一個(gè)實(shí)施例中,為了讓異??刂齐娐纺軌虼_定在異常返回時(shí)要從 哪一個(gè)堆?;謴?fù)寄存器狀態(tài),以及處理電路應(yīng)該返回到哪一個(gè)域,鏈路寄存器590可以被 設(shè)置為特殊的EXC_RETURN值而不是返回地址。這個(gè)EXC_RETURN值可以包括向處理設(shè)備指 示在取得異常之前處理電路在后臺(tái)處理正被執(zhí)行時(shí)所處于的域的安全性級(jí)別的安全性位。 要返回到的實(shí)際程序計(jì)數(shù)器位置連同另一個(gè)寄存器狀態(tài)一起被存儲(chǔ)在這個(gè)域的堆棧上。在 這種情況下,分支到EXC_RETURN值指示返回地址是在該堆棧上并且這是哪一個(gè)堆棧。
[0095] 在一個(gè)實(shí)施例中,鏈路寄存器590不需要保持EXC_RETURN值長(zhǎng)達(dá)異常處理例程正 被執(zhí)行的整個(gè)時(shí)間,并且替代地它可以在開始被設(shè)置為這個(gè)值,以及然后在之后不久移動(dòng) 到堆棧。當(dāng)異常完成時(shí),軟件分支到由EXC_RETURN值所指示的地址,CPU將此定點(diǎn)為特殊 事件,因?yàn)樗皇怯行У闹噶畹刂贰?br>
[0096] 如果取得占先異常,則用于當(dāng)前異常的EXC_RETURN值可以在針對(duì)新的占先異常 在鏈路寄存器中設(shè)置新的EXC_RETURN值之前被存儲(chǔ)在有關(guān)堆棧上(依照較早地討論的過 程)(其中設(shè)置的安全性位S適當(dāng)?shù)刈⒁馄涮幚碚恢袛嗟漠?dāng)前異常的域)。
[0097] 圖12是圖示了依照一個(gè)實(shí)施例在接收到異常時(shí)執(zhí)行的壓棧操作的流程圖。在步 驟600處,確定是否已接收到異常,并且如果是這樣的話,則過程進(jìn)行到步驟605,其中確定 處理電路是否當(dāng)前正在執(zhí)行后臺(tái)處理,以及因此這種異常是否將是來自該后臺(tái)處理的初始 異常。如果確定了這個(gè)異常是來自后臺(tái)處理的初始異常,則過程進(jìn)行到步驟610,其中確定 在取得異常時(shí)是否將需要安全到非安全轉(zhuǎn)變(即,后臺(tái)處理是否是在安全域中,并且將需 要在非安全域中執(zhí)行所需要的異常處理例程)。如果情況是這樣的,則在步驟615處,調(diào)用 和被調(diào)用寄存器兩者都將使它們的數(shù)據(jù)通過異常控制電路28保存到安全堆棧。如果不是, 則僅調(diào)用寄存器使它們的數(shù)據(jù)在步驟620處通過異??刂齐娐穳簵#@種數(shù)據(jù)被保存到哪 一個(gè)堆棧由后臺(tái)處理正在其中執(zhí)行的域來確定。過程然后返回到步驟600。
[0098] 如果在步驟605處確定了在步驟600處接收到的異常不是來自后臺(tái)處理的初始異 常,則過程進(jìn)行到步驟625,其中確定在步驟600處接收到的這個(gè)新的異常是否是比當(dāng)前正 被處理的現(xiàn)有異常更高的優(yōu)先級(jí)。如果不是,則新的異常將被視為尾鏈化異常,并且在步驟 630處將確定當(dāng)前異常是否已結(jié)束。一旦當(dāng)前異常已結(jié)束,然后就在步驟635處確定S位 595是否在EXC_RETURN值內(nèi)被設(shè)置。如果其沒有被設(shè)置,則過程進(jìn)行到步驟640,其中不執(zhí) 行另外的壓棧,并且過程然后返回到步驟600。
[0099] 然而,如果S位被設(shè)置,指示處理電路在來自后臺(tái)處理的初始異常被取得的時(shí)刻 正在安全域中操作,則在步驟645處確定新的異常是否需要安全到非安全轉(zhuǎn)變以便讓所需 要的異常處理例程被執(zhí)行。如果不是,則再次在步驟640處不執(zhí)行另外的壓棧并且過程返 回到步驟600。然而,如果需要安全到非安全轉(zhuǎn)變,則過程進(jìn)行到步驟650,其中在過程然后 返回到步驟600之前,在被調(diào)用寄存器內(nèi)的數(shù)據(jù)同樣被壓棧在安全堆棧內(nèi)。
[0100] 如果在步驟625處確定了新的異常的確具有比當(dāng)前異常更高的優(yōu)先級(jí),則新的異 常將被視為占先異常。在步驟655處,然后將確定是否仍然針對(duì)當(dāng)前異常執(zhí)行壓棧。如果 是,則在步驟660處,壓棧行為取決于新的異常而被修改,如參考圖9A和9B預(yù)先所討論的 那樣。其后,過程然后返回到步驟600。
[0101] 如果在步驟655處,確定了對(duì)于當(dāng)前異常仍然不在執(zhí)行壓棧,并且替代地處理電 路已開始執(zhí)行針對(duì)該當(dāng)前異常的有關(guān)異常處理例程,則過程進(jìn)行到步驟665,其中當(dāng)前異常 被視為后臺(tái)處理,并且過程然后返回到步驟610。因此,在步驟665處,執(zhí)行參考圖10較早 地討論的分解技術(shù)。
[0102] 圖13是圖示了依照一個(gè)實(shí)施例在完成異常時(shí)執(zhí)行的出棧操作的流程圖。在步驟 700處,確定異常是否已完成,并且如果是這樣的話,則過程進(jìn)行步驟705,其中確定后臺(tái)處 理是否是在安全域中。如較早地提到的那樣,這能夠參考存儲(chǔ)在EXC_RETURN值內(nèi)的S位 595來確定。如果從其返回的異常是占先異常,則像較早地討論的那樣,后臺(tái)處理將被認(rèn)為 是被占先異常中斷的異常處理例程。
[0103] 如果后臺(tái)處理是在安全域中,則在步驟710處,確定作為當(dāng)前異常的完成的結(jié)果 非安全到安全轉(zhuǎn)變是否是需要的。如果是,則在步驟715處被調(diào)用寄存器的內(nèi)容被出棧,隨 后過程進(jìn)行到步驟720。如果在步驟710處確定了非安全到安全轉(zhuǎn)變是不需要的,則過程直 接地進(jìn)行到步驟720。
[0104] 在步驟720處,確定作為異常完成的結(jié)果返回到后臺(tái)處理是否是需要的,并且如 果不是,則過程返回到步驟700以等待下一個(gè)異常完成。然而,如果在步驟720處確定了返 回到后臺(tái)處理是需要的,則過程進(jìn)行到步驟725,其中在過程返回到步驟700之前,調(diào)用寄 存器的內(nèi)容被出棧。
[0105] 上面描述的實(shí)施例的技術(shù)實(shí)現(xiàn)了在響應(yīng)于異常而執(zhí)行狀態(tài)保存時(shí)安全性與性能 之間的平衡的改進(jìn),其中異??刂齐娐返挠布C(jī)制在無需通過異常處理程序進(jìn)行代理的情 況下實(shí)現(xiàn)了安全異常的有效處理。
[0106] 本申請(qǐng)的主題與在共同轉(zhuǎn)讓的共同待決的美國申請(qǐng)?zhí)?3/368, 419和英國專利申 請(qǐng)?zhí)?217531. 1中所討論的主題有關(guān),并且這兩個(gè)文檔的全部?jī)?nèi)容從而通過引用并入。
[0107] 盡管已經(jīng)在本文中對(duì)特定實(shí)施例進(jìn)行了描述,但是將了解的是,本發(fā)明不限于此, 并且可以在本發(fā)明的范圍內(nèi)對(duì)其做出許多修改和添加。例如,在不背離本發(fā)明的范圍的情 況下,能夠用獨(dú)立權(quán)利要求的特征做出以下從屬權(quán)利要求的特征的各種組合。
【權(quán)利要求】
1. 一種數(shù)據(jù)處理設(shè)備,其包括: 被配置成響應(yīng)于程序代碼而執(zhí)行數(shù)據(jù)處理操作的處理電路,所述處理電路包括用于控 制異常處理的異??刂齐娐?; 被配置成存儲(chǔ)數(shù)據(jù)的多個(gè)寄存器,所述寄存器包括寄存器的第一子集和寄存器的第二 子集;以及 被配置成存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,所述數(shù)據(jù)存儲(chǔ)裝置包括包括安全區(qū)和次安全區(qū)在 內(nèi)的多個(gè)區(qū),其中,安全區(qū)用于存儲(chǔ)可由處理電路當(dāng)在安全域中操作時(shí)訪問并且不可由處 理電路當(dāng)在次安全域中操作時(shí)訪問的數(shù)據(jù);其中: 響應(yīng)于來自由處理電路所執(zhí)行的后臺(tái)處理的初始異常,異??刂齐娐繁慌渲贸稍谟|發(fā) 處理電路執(zhí)行與異常相對(duì)應(yīng)的異常處理例程之前執(zhí)行對(duì)來自寄存器的第一子集的數(shù)據(jù)的 狀態(tài)保存,其中,異常處理例程負(fù)責(zé)執(zhí)行對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存;并且 響應(yīng)于引起從安全域到次安全域的轉(zhuǎn)變的第一異常,在后臺(tái)處理由處理電路在安全域 中執(zhí)行的情況下,異??刂齐娐繁慌渲贸稍谟|發(fā)處理電路在次安全域中執(zhí)行異常處理例程 之前執(zhí)行額外的對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存。
2. 根據(jù)權(quán)利要求1所述的數(shù)據(jù)處理設(shè)備,其中,響應(yīng)于所述第一異常,異常控制電路被 配置成在觸發(fā)處理電路執(zhí)行異常處理例程之前清除寄存器的第二子集。
3. 根據(jù)權(quán)利要求2所述的數(shù)據(jù)處理設(shè)備,其中,響應(yīng)于所述第一異常,數(shù)據(jù)處理設(shè)備被 配置成在異??刂齐娐酚|發(fā)處理電路執(zhí)行異常處理例程之前確保寄存器的第一子集不包 含安全數(shù)據(jù)。
4. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中,如果異??刂齐娐芬言谟|發(fā)處 理電路執(zhí)行異常處理例程之前執(zhí)行了額外的狀態(tài)保存,則異常處理例程不執(zhí)行寄存器的第 二子集的狀態(tài)保存。
5. 根據(jù)權(quán)利要求1至3中任一項(xiàng)所述的數(shù)據(jù)處理設(shè)備,其中,如果異??刂齐娐芬言谟| 發(fā)處理電路執(zhí)行異常處理例程之前執(zhí)行了額外的狀態(tài)保存,則異常處理例程同樣執(zhí)行寄存 器的第二子集的狀態(tài)保存。
6. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中,所述第一異常包括在后臺(tái)處理 期間發(fā)生的初始異常。
7. 根據(jù)權(quán)利要求1至5中任一項(xiàng)所述的數(shù)據(jù)處理設(shè)備,其中,所述第一異常包括在初始 異常已被處理之后并且在返回到在初始異常之前正被執(zhí)行的后臺(tái)處理之前所處理的尾鏈 化異常。
8. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中,響應(yīng)于在所述初始異常已被處 理并且在處理電路已返回到在初始異常之前正被執(zhí)行的所述后臺(tái)處理之前為待決的另外 的異常,異常控制電路被配置成在使處理電路返回到后臺(tái)處理之前將另外的異常的處理作 為尾鏈化異??刂?。
9. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中: 所述異??刂齐娐繁慌渲贸桑憫?yīng)于比正在被執(zhí)行的異常處理例程所對(duì)應(yīng)的當(dāng)前異常 更低的優(yōu)先級(jí)的新的異常,在使處理電路返回到后臺(tái)處理之前將新的異常的處理作為尾鏈 化異??刂疲? 異??刂齐娐繁慌渲贸稍诳刂菩碌漠惓5奶幚頃r(shí)不再執(zhí)行狀態(tài)保存操作,除非所述當(dāng) 前異常在所述安全域中被執(zhí)行,所述新的異常指示切換到所述次安全域,并且所述后臺(tái)處 理在所述安全域中被執(zhí)行,在這種情況下,所述異??刂齐娐繁慌渲贸桑谕瓿舍槍?duì)所述當(dāng) 前異常的異常處理例程之后,執(zhí)行所述額外的對(duì)來自寄存器的所述第二子集的數(shù)據(jù)的狀態(tài) 保存,并且確保寄存器的所述第二子集在觸發(fā)處理電路執(zhí)行與新的異常相對(duì)應(yīng)的異常處理 例程之前被清除。
10. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中: 所述異??刂齐娐繁慌渲贸?,響應(yīng)于比正在被執(zhí)行的異常處理例程所對(duì)應(yīng)的當(dāng)前異常 具有更低的優(yōu)先級(jí)的新的異常,在使處理電路返回到后臺(tái)處理之前將新的異常的處理作為 尾鏈化異常控制; 異??刂齐娐繁慌渲贸稍诳刂菩碌漠惓5奶幚頃r(shí)不執(zhí)行狀態(tài)恢復(fù)操作,除非所述當(dāng)前 異常在所述次安全域中被執(zhí)行,所述新的異常指示切換到所述安全域,并且所述后臺(tái)處理 在所述安全域中被執(zhí)行,在這種情況下,所述異??刂齐娐繁慌渲贸?,在完成針對(duì)所述當(dāng)前 異常的異常處理例程之后,在觸發(fā)處理電路執(zhí)行與新的異常相對(duì)應(yīng)的異常處理例程之前執(zhí) 行數(shù)據(jù)到寄存器的所述第二子集中的狀態(tài)恢復(fù)操作。
11. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中,如果當(dāng)執(zhí)行額外的寄存器的第 二子集的狀態(tài)保存時(shí)發(fā)生比所述第一異常具有更高優(yōu)先級(jí)的占先異常,并且該占先異常不 需要從安全域到次安全域的轉(zhuǎn)變,則異常控制電路被配置成在觸發(fā)處理電路處理占先異常 的異常處理例程之前取消額外的狀態(tài)保存。
12. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中,如果當(dāng)前異常未引起從安全域 到次安全域的轉(zhuǎn)變,并且如果在與當(dāng)前異常相關(guān)聯(lián)的異常處理例程的處理開始之前發(fā)生比 當(dāng)前異常具有更高優(yōu)先級(jí)以及需要從安全域到次安全域的轉(zhuǎn)變的占先異常,則異??刂齐?路被配置成在觸發(fā)處理電路處理占先異常的異常處理例程之前額外地執(zhí)行額外的對(duì)來自 寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存。
13. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中,如果在異??刂齐娐芬延|發(fā)處 理電路執(zhí)行與當(dāng)前異常相對(duì)應(yīng)的異常處理例程之后、但是在該異常處理例程已完成之前發(fā) 生占先異常,則異常控制電路被配置成在觸發(fā)處理電路執(zhí)行占先異常的異常處理例程之前 確定是需要對(duì)寄存器的所述第一子集進(jìn)行狀態(tài)保存還是寄存器的所述第一和第二子集均 進(jìn)行狀態(tài)保存時(shí)將當(dāng)前異常視為所述后臺(tái)處理。
14. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,其中,數(shù)據(jù)存儲(chǔ)裝置包括包括在安全 區(qū)中的安全堆棧和在次安全區(qū)中的次安全堆棧在內(nèi)的多個(gè)堆棧。
15. 根據(jù)權(quán)利要求14所述的數(shù)據(jù)處理設(shè)備,其中,在對(duì)來自寄存器的第一子集的數(shù)據(jù) 的狀態(tài)保存和額外的對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存中,異??刂齐娐繁慌渲?成將數(shù)據(jù)保存到與處理電路在執(zhí)行所述后臺(tái)處理時(shí)正在操作的域的安全性相對(duì)應(yīng)的安全 堆棧和次安全堆棧中的一個(gè)。
16. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,進(jìn)一步包括安全配置存儲(chǔ)位置以用 于存儲(chǔ)指示所述多個(gè)寄存器中的哪些可用于通過當(dāng)前執(zhí)行代碼存儲(chǔ)安全數(shù)據(jù)的安全配置 值,其中,響應(yīng)于引起從安全域到次安全域的轉(zhuǎn)變的異常,異??刂齐娐繁慌渲贸蓪⒂伤?安全配置值所指示的寄存器中的一個(gè)或多個(gè)包括在寄存器的所述第二子集內(nèi)。
17. 根據(jù)任何前述權(quán)利要求所述的數(shù)據(jù)處理設(shè)備,進(jìn)一步包括用于存儲(chǔ)異常返回值的 存儲(chǔ)位置,所述處理電路被配置成將域值設(shè)置在所述異常返回值內(nèi)以指示所述數(shù)據(jù)處理設(shè) 備在從所述后臺(tái)處理取得初始異常后正在里面操作的域,所述異常控制電路依靠所述域值 來確定所述寄存器中的哪些應(yīng)該經(jīng)受狀態(tài)保存或狀態(tài)恢復(fù)操作。
18. -種數(shù)據(jù)處理設(shè)備,其包括: 用于響應(yīng)于程序代碼而執(zhí)行數(shù)據(jù)處理操作的數(shù)據(jù)處理電路; 多個(gè)寄存器;以及 用于存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,所述數(shù)據(jù)存儲(chǔ)裝置包括每個(gè)區(qū)都具有安全級(jí)別的多個(gè) 區(qū),并包括用于存儲(chǔ)所述數(shù)據(jù)處理電路在所述安全域中操作時(shí)可訪問的而在次安全域中操 作時(shí)不可訪問的敏感數(shù)據(jù)的至少一個(gè)安全區(qū)和用于存儲(chǔ)次安全數(shù)據(jù)的次安全區(qū); 所述數(shù)據(jù)存儲(chǔ)裝置包括至少兩個(gè)堆棧,在所述安全區(qū)中的安全堆棧和在所述次安全區(qū) 中的次安全堆棧;其中 所述數(shù)據(jù)處理電路包括異常處理電路,所述異常處理電路被配置成在所述數(shù)據(jù)處理電 路正在所述安全域中執(zhí)行并且所述異常指示切換到次安全域中執(zhí)行程序代碼以清除所述 寄存器的寄存器集合時(shí)對(duì)異常的接收做出響應(yīng),在所述寄存器集合內(nèi)的寄存器取決于執(zhí)行 的所述域的安全級(jí)別和將發(fā)生所述異常的所述域。
19. 根據(jù)權(quán)利要求18所述的數(shù)據(jù)處理設(shè)備,其中,所述數(shù)據(jù)處理電路被進(jìn)一步配置成 在清除所述寄存器集合之前,將存儲(chǔ)在所述寄存器集合中的狀態(tài)保存到所述數(shù)據(jù)處理電路 正在里面執(zhí)行的域的所述堆棧。
20. 根據(jù)權(quán)利要求18所述的數(shù)據(jù)處理設(shè)備,其中,所述數(shù)據(jù)處理設(shè)備包括安全配置存 儲(chǔ)位置以用于存儲(chǔ)指示所述多個(gè)寄存器中的哪些可用于由當(dāng)前執(zhí)行代碼用于存儲(chǔ)安全狀 態(tài)的值,所述數(shù)據(jù)處理電路被配置成依靠由所述安全配置值所指示的所述多個(gè)寄存器以及 執(zhí)行的域的安全級(jí)別和將發(fā)生所述異常的域來確定哪些寄存器是在寄存器集合內(nèi)。
21. -種在數(shù)據(jù)處理設(shè)備上處理數(shù)據(jù)的方法,所述數(shù)據(jù)處理設(shè)備包括:用于響應(yīng)于程 序代碼而執(zhí)行數(shù)據(jù)處理操作的處理電路,所述處理電路包括用于控制異常處理的異??刂?電路;用于存儲(chǔ)數(shù)據(jù)的多個(gè)寄存器,所述寄存器包括寄存器的第一子集合和寄存器的第二 子集;以及用于存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,所述數(shù)據(jù)存儲(chǔ)裝置包括包括安全區(qū)和次安全區(qū) 在內(nèi)的多個(gè)區(qū),其中,安全區(qū)用于存儲(chǔ)可由處理電路當(dāng)在安全域中操作時(shí)訪問并且不可由 處理電路在次安全域中操作時(shí)訪問的數(shù)據(jù),所述方法包括: 響應(yīng)于來自由處理電路所執(zhí)行的后臺(tái)處理的初始異常,采用異??刂齐娐穪碓谟|發(fā)處 理電路執(zhí)行與異常相對(duì)應(yīng)的異常處理例程之前執(zhí)行對(duì)來自寄存器的第一子集的數(shù)據(jù)的狀 態(tài)保存,其中,異常處理例程負(fù)責(zé)執(zhí)行對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存;并且 響應(yīng)于引起從安全域到次安全域的轉(zhuǎn)變的第一異常,在后臺(tái)處理由處理電路在安全域 中執(zhí)行的情況下,采用異常控制電路來在觸發(fā)處理電路在次安全域中執(zhí)行異常處理例程之 前執(zhí)行額外的對(duì)來自寄存器的第二子集的數(shù)據(jù)的狀態(tài)保存。
22. -種數(shù)據(jù)處理設(shè)備,其包括: 用于響應(yīng)于程序代碼而執(zhí)行數(shù)據(jù)處理操作的處理裝置,所述處理裝置包括用于控制異 常處理的異??刂蒲b置; 用于存儲(chǔ)數(shù)據(jù)的多個(gè)寄存器裝置,包括寄存器裝置的第一子集和寄存器裝置的第二子 集;以及 用于存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)裝置,包括包括安全區(qū)和次安全區(qū)在內(nèi)的多個(gè)區(qū),其中,安全 區(qū)用于存儲(chǔ)可由處理裝置在安全域中操作時(shí)訪問并且不可由處理裝置在次安全域中操作 時(shí)訪問的數(shù)據(jù);其中: 響應(yīng)于來自由處理裝置所執(zhí)行的后臺(tái)處理的初始異常,異??刂蒲b置在觸發(fā)處理裝置 執(zhí)行與異常相對(duì)應(yīng)的異常處理例程之前執(zhí)行對(duì)來自寄存器裝置的第一子集的數(shù)據(jù)的狀態(tài) 保存,其中,異常處理例程負(fù)責(zé)執(zhí)行對(duì)來自寄存器裝置的第二子集的數(shù)據(jù)的狀態(tài)保存;并且 響應(yīng)于引起從安全域到次安全域的轉(zhuǎn)變的第一異常,在后臺(tái)處理由處理裝置在安全域 中執(zhí)行的情況下,異常控制裝置在觸發(fā)處理裝置在次安全域中執(zhí)行異常處理例程之前執(zhí)行 額外的對(duì)來自寄存器裝置的第二子集的數(shù)據(jù)的狀態(tài)保存。
【文檔編號(hào)】G06F21/52GK104115155SQ201380008455
【公開日】2014年10月22日 申請(qǐng)日期:2013年1月17日 優(yōu)先權(quán)日:2012年2月8日
【發(fā)明者】托馬斯·克里斯托弗·喬洛卡特, 理查德·羅伊·格里森思懷特 申請(qǐng)人:Arm有限公司