一文解析RISC-V SiFive U54內(nèi)核——中斷和異常
上篇一文解析RISC-V SiFive U54內(nèi)核——中斷和異常??說到,SiFive U54內(nèi)核有兩個中斷控制器:CLINT和PLIC。CLINT用于本地中斷(軟件中斷和定時器中斷),PLIC用于全局中斷。
下面對CLINT進(jìn)行詳細(xì)說明。
內(nèi)核本地中斷(CLINT)
下圖為CLINT示意圖,CLINT通過固定的中斷號和優(yōu)先級,可將軟件中斷或定時器中斷直接發(fā)送給指定的hart,該過程沒有仲裁。

CLINT 占地面積小,可直接向 hart 提供軟件、定時器和外部中斷。CLINT 塊還保存與軟件和定時器中斷相關(guān)的內(nèi)存映射控制和狀態(tài)寄存器。
CLINT 優(yōu)先級和搶占
CLINT
?具有固定的優(yōu)先級方案,但不支持給定特權(quán)級別內(nèi)的嵌套中斷(搶占)。然而,較高的特權(quán)級別可能會搶占較低的特權(quán)級別。CLINT
?提供兩種操作模式,直接模式和向量模式。
在直接模式下,所有中斷和異常都會捕獲到?mtvec.BASE
。
在向量模式下,異常trap到?mtvec.BASE
,但中斷將直接跳轉(zhuǎn)到它們的向量表索引。
CLINT向量表
CLINT向量表如下:

CLINT 向量表填充有跳轉(zhuǎn)指令,因?yàn)橛布紫忍D(zhuǎn)到向量表中的索引,然后再跳轉(zhuǎn)到處理程序。所有異常類型都trap到表中的第一個條目是?mtvec.BASE
。
下面是CLINT 向量表的示例:

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?


CLINT 中斷源
下圖是CLINT 中斷 ID:

CLINT中斷屬性
為了幫助提高保存和恢復(fù)上下文的效率,可以將中斷屬性應(yīng)用于用于中斷處理的函數(shù)。

此屬性將保存和恢復(fù)處理程序中使用的寄存器,并在處理程序的末尾插入一條?mret
?指令。
CLINT內(nèi)存映射
下圖是U54 內(nèi)核上 CLINT 的內(nèi)存映射:

注意,在 CLINT 內(nèi)存映射中沒有用于特定中斷的啟用位,因?yàn)檫@些中斷的啟用位于每個中斷的?mie CSR
?和?mstatus.mie
?CSR 位中,它全局啟用所有機(jī)器中斷.
相關(guān)寄存器
MSIP Registers
機(jī)器模式軟件中斷是通過寫入內(nèi)存映射控制寄存器?msip
?來生成的。
msip
?寄存器是一個 32 位寬的 WARL 寄存器,其中高 31 位綁定為 0。最低有效位反映在 mip CSR 的?MSIP
?位中。msip
?寄存器中的其他位被硬連線為零。復(fù)位時,每個?msip
?寄存器都清零。
軟件中斷對于多 hart 系統(tǒng)中的處理器間通信最有用,因?yàn)?harts 可能會寫入彼此的 msip 位以影響處理器間中斷。
軟件中斷其實(shí)更多的用于多核之間,也就是所謂的核間通信。
Timer Registers
與timer有關(guān)的寄存器主要是兩個:mtime
和mtimecmp
mtime
?是一個 64 位讀寫寄存器,包含從?rtc_toggle
?信號計數(shù)的周期數(shù)。
只要?mtime
?大于或等于?mtimecmp
?寄存器中的值,定時器中斷就會掛起。定時器中斷反映在 mip 寄存器的 mtip 位中。
復(fù)位時,mtime
?清零。mtimecmp
?不會重置。
特權(quán)模式委托
默認(rèn)情況下,所有中斷都會陷入機(jī)器模式,包括定時器和軟件中斷。
為了讓定時器和軟件中斷直接進(jìn)入管理員模式,定時器中斷和軟件中斷必須首先委托給管理員模式。
原文作者:嵌入式Linux充電站
