[英]RISC-V - Software Interrupts
我正在嘗試為我的 RV32I 內核實現一個簡單的中斷控制器。 我相信我理解在 RISC-V 中應該如何處理中斷,以及 CSR 寄存器在這個過程中的作用。
RISC-V 定義了三種中斷源:外部、軟件和定時器。 我了解定時器和外部中斷是如何產生的。 但是,我不明白如何或什么會產生軟件中斷。 指令? 指令序列? 也許實現定義的標志? 我不知道。
任何人都可以舉一個例子和軟件中斷的解釋,最好是相關的匯編代碼嗎?
提前致謝!
您正在尋找的是來自 mip csr 的 SSIP 和 USIP 位。
通過將 1 寫入 sip 寄存器中的主管軟件中斷掛起 (SSIP) 位,在當前 hart 上觸發主管級軟件中斷。 可以通過向 sip 中的 SSIP 位寫入 0 來清除掛起的管理員級軟件中斷。 當 sie 寄存器中的 SSIE 位清零時,禁止管理員級軟件中斷。
通過向 sip 寄存器中的用戶軟件中斷掛起 (USIP) 位寫入 1,在當前 hart 上觸發用戶級軟件中斷。 掛起的用戶級軟件中斷可以通過將 0 寫入 sip 中的 USIP 位來清除。 當 sie 寄存器中的 USIE 位被清除時,用戶級軟件中斷被禁用。
您可以在The RISC-V Instruction Set Manual Volume II: Privileged Architecture
V20190608 中找到此信息。
軟件中斷是由(用戶)程序執行引起的。
軟件中斷可以從ecall
發生——相當於 MIPS 上的syscall
; 這是用戶程序對操作系統服務的請求,它以良好控制的方式跨越權限邊界。
軟件中斷也可能因非法或格式錯誤的內存操作(即lw
、 sw
。
查看表 3.6、4.1 中的異常列表(這里我只展示了第二部分;注意 ecall 出現在第一部分):
第一個是由在程序計數器中放置錯誤值(例如奇數)引起的,這可能是由堆棧損壞的跳轉寄存器或返回引起的。
接下來允許程序計數器引用未映射的地址,即未標記為可執行的頁面。
斷點通常在調試期間由軟件使用。
加載訪問錯誤是指使用加載或存儲到未映射或以其他方式受保護的地址。
原子操作有自己的異常編號(不知道為什么)。
最后,它們可能是由特權模式(U、S、H、M)之間的切換引起的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.