上次我們講了處理器的中斷和異常,只是從高到低俯視了這一功能。沒有落到實處,沒有具體到細(xì)節(jié)。上一章有一處有問題,在此改正一下,狹義的中斷和狹義的異常一起構(gòu)成了廣義的異常而非廣義的中斷。這一次,我們就來講講RISC-V特權(quán)架構(gòu),順便把RISC-V架構(gòu)中的中斷和異常探索得更加深入。
CPU可以運(yùn)行在好幾種特權(quán)模式下。RISC-V中定義了三種特權(quán)模式,分別是機(jī)器模式(machinemode)、監(jiān)管者模式(supervisor mode)和用戶模式(user mode)。不同的領(lǐng)域和不同的廠家有不同的稱呼。在操作系統(tǒng)中,機(jī)器模式體現(xiàn)為實模式,用戶模式則體現(xiàn)為保護(hù)模式。早期的dos系統(tǒng)就是運(yùn)行在實模式下。
RISC-V中的三種特權(quán)模式的編碼、名稱和縮寫
為什么要劃分這么多種的模式呢?目的是為了保護(hù)電腦運(yùn)行環(huán)境不被破壞。比如說一個病毒線程想要篡改其他線程中的內(nèi)存數(shù)據(jù),甚至是破壞操作系統(tǒng),這種操作肯定是不被允許的。我們必須為每一個線程劃定一個空間,每個線程只能訪問屬于自己的空間。具體操作以后會講。那問題就解決了嗎?沒有。作為操作系統(tǒng),得能夠有效的控制別的線程的運(yùn)行情況,必要的時候?qū)⒆x寫一些線程。因此操作系統(tǒng)必須要被賦予更高級的權(quán)限,或者說要與其他的應(yīng)用線程區(qū)別對待,因此不同特權(quán)模式應(yīng)運(yùn)而生。
其中操作系統(tǒng)的線程代碼就是運(yùn)行在機(jī)器模式下,應(yīng)用程序運(yùn)行在用戶模式下,有些時候比如windows系統(tǒng)里會忽然彈出一個管理員權(quán)限的許可窗口,如果你點(diǎn)了確定,可以理解為應(yīng)用程序的權(quán)限經(jīng)過你的許可提高到了監(jiān)管者模式。注意:機(jī)器模式的權(quán)限是最高的,用戶模式的權(quán)限是最低的。如果用戶的權(quán)限過高,他們可能會弄壞電腦。
那么RISC-V的CPU是怎么做的呢?
首先,RISC-V架構(gòu)中定義了一些控制和狀態(tài)寄存器(control and status register),簡稱CSR,與32個物理寄存器不同(物理寄存器可以認(rèn)為是5位地址尋址的),這些CSR是用12位地址進(jìn)行尋址的,并且地址空間是私有獨(dú)立的,不同于全局地址空間。并且,針對這些CSR寄存器的讀寫有相應(yīng)的特殊指令,這些特殊指令都有被定義在之前講的RISC-V指令集圖卡中。其中某些特權(quán)指令只能在機(jī)器模式中被執(zhí)行(需要等級權(quán)限),如果在用戶模式中遇到這些特權(quán)指令,處理器就會拋出異常,相應(yīng)的線程可能會被殺死,或者由用戶自行決定。其次,CSR的種類有很多,舉幾個機(jī)器模式中要用到的CSR。比如mvendorid寄存器,它在12位的地址空間的地址是0xf11,它的用途是保存廠商標(biāo)識代碼的,所有的電子產(chǎn)品生產(chǎn)廠商可以向美國JEDEC協(xié)會付費(fèi)申請一個廠商標(biāo)識代碼(也可以向我申請,我不收費(fèi),有意聯(lián)系)。再比如misa(指令集寄存器),地址是0x301,用途是指示此CPU支持哪些指令集。類似的CSR有很多,在此不一一贅述,下面重點(diǎn)說說八個和機(jī)器模式中斷與異常有關(guān)的CSR。
它們分別是:mepc(異常PC寄存器)、mtvec(異常向量基地址寄存器)、mcause(異常原因寄存器)、mie(中斷使能寄存器)、mip(中斷等待寄存器)、mtval(異常值寄存器)、mscratch(草稿寄存器)和mstatus(線程狀態(tài)寄存器)。其中每個寄存器命名開頭的m是機(jī)器模式的意思。相應(yīng)的還有其他模式中斷與異常的CSR。
mstatus寄存器的具體字段,僅需注意紅色畫圈部分
機(jī)器模式下,異常發(fā)生時,mepc用于保存當(dāng)前線程的PC值(或者異常的PC值),并將異常服務(wù)程序的入口地址從mtvec寫入PC寄存器中。倘若支持向量中斷并且是狹義中斷發(fā)生時,那么PC值設(shè)置為mtvec-1+異常序號編碼*4(之所以-1,是因為mtvec最低位是硬件是否支持向量中斷的標(biāo)志位,1表示支持向量中斷,在硬件電路中我們大可以直接將最后一位抹掉實現(xiàn)-1),而狹義異常發(fā)生時,PC值仍設(shè)置成mtvec不變。根據(jù)異常或中斷來源,將其來源序號寫入mcause中。將mtval設(shè)置為出錯的地址或其他適用于特定異常的信息字。將mstatus中的MIE字段(注意,是MIE字段,不是mie寄存器,字段是指寄存器中的某一段數(shù)值,MIE字段屬于mstatus寄存器的一部分)寫到MPIE字段中后,再將MIE字段寫0,用以禁止接受狹義中斷,此時狹義中斷如果發(fā)生,硬件將不做響應(yīng)。因此,RISC-V能且只能支持軟件中斷嵌套。狹義異常是不需要嵌套的,異常服務(wù)程序中不會再發(fā)生狹義異常,除非你異常服務(wù)程序?qū)懙糜袉栴}。將發(fā)生中斷前的權(quán)限模式寫到mstatus中的MPP字段內(nèi)。可以想象到,當(dāng)中斷或異常結(jié)束后,這些保存了的東西是要復(fù)原回來的,線程方能繼續(xù)執(zhí)行。
注意:以上過程均是由硬件自己完成,該過程中,沒有指令被執(zhí)行。硬件準(zhǔn)備完成后,PC跳轉(zhuǎn)到mtvec這個統(tǒng)一的地址入口,異常服務(wù)程序才開始處理異常。(以上過程有些繁雜,慢慢看,你會明白設(shè)計者的用意的)
異常服務(wù)程序具體怎么做呢?如果不支持向量中斷,那么異常服務(wù)程序一上來,就先查詢mcause寄存器,看看這個異常是狹義中斷還是狹義異常,具體是哪出了問題。根據(jù)不同的問題再次跳轉(zhuǎn)到不同的地址,對癥下藥解決問題。比如說打3d游戲的時候鼠標(biāo)傳來了一個中斷,CPU跳轉(zhuǎn)到異常服務(wù)程序,經(jīng)查詢mcause得知這是一個鼠標(biāo)傳來的中斷,進(jìn)而訪問鼠標(biāo)的驅(qū)動程序,并將相應(yīng)數(shù)值傳遞給這款3d游戲,從而3d游戲渲染新的一幀畫面,最后畫面完成旋轉(zhuǎn)。
以上便是RISC-V架構(gòu)在機(jī)器模式下對異常的處理。具體細(xì)節(jié)需要參考RISC-V架構(gòu)書。
審核編輯:劉清
-
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41471 -
狀態(tài)寄存器
+關(guān)注
關(guān)注
0文章
39瀏覽量
7083 -
RISC-V
+關(guān)注
關(guān)注
45文章
2270瀏覽量
46131
發(fā)布評論請先 登錄
相關(guān)推薦
評論