【RISC-V】Trap和Exception
生活随笔
收集整理的這篇文章主要介紹了
【RISC-V】Trap和Exception
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 控制流 (Control Flow)和Trap
- RISC-V Trap處理中涉及的寄存器
- mtvec (Machine Trap-Vector Base-Address)
- mepc (Machine Exception Program Counter)
- mcause (Machine Cause)
- mstatus (Machine Status)
- 中斷與異常含義
- RISC-V Trap處理流程
- Top Half(Trap發(fā)生時,Hart自動執(zhí)行流)
- Bottom Half(軟件需要做的事情)
- 退出 trap:編程調用 MRET 指令
控制流 (Control Flow)和Trap
- 控制流(Control Flow)
- branch(條件分支指令), jump (無條件跳轉指令),由程序正常自主控制的流程
- 異常控制流 (Exceptional Control Flow,簡稱 ECP, 又稱Trap)
- 不在程序的控制范圍之內
- exception
- interrupt
RISC-V Trap處理中涉及的寄存器
八個控制狀態(tài)寄存器(CSR)是機器模式下異常處理的必要部分:
- mtvec(Machine Trap Vector)它保存發(fā)生異常時處理器需要跳轉到的地址。
- mepc(Machine Exception PC)它指向發(fā)生異常的指令。
- mcause(Machine Exception Cause)它指示發(fā)生異常的種類。
- mie(Machine Interrupt Enable)它指出處理器目前能處理和必須忽略的中斷。
- mip(Machine Interrupt Pending)它列出目前正準備處理的中斷。
- mtval(Machine Trap Value)它保存了陷入(trap)的附加信息:地址例外中出錯
- 的地址、發(fā)生非法指令例外的指令本身,對于其他異常,它的值為 0。
- mscratch(Machine Scratch)它暫時存放一個字大小的數(shù)據(jù)。
- mstatus(Machine Status)它保存全局中斷使能,以及許多其他的狀態(tài),如圖
mtvec (Machine Trap-Vector Base-Address)
- BASE: trap入口函數(shù)的及地址,必須保證四字節(jié)對其
- MODE: 進一步用于控制入口函數(shù)的地址配置方式
- Direct: 所有的exception和interrupt發(fā)生后pc都跳轉到BASE指定的地址處。其實就是一個中斷處理函數(shù)。
- Vectored: exception處理方式同Direct;但interrupt的入口地址以數(shù)組方式排列。其實就是多向量指向不同的中斷處理函數(shù)。
mepc (Machine Exception Program Counter)
- 當trap發(fā)生時,pc會被替換為mtvec設定的地址,同時hart會設置mepc為當前指令或者下一條指令的地址(如果是異常則設置當前指令,如果是中斷則設置下一條指令的地址),當我們需要退出trap時可以調用特殊的mret指令,該指令會將mepc中的值恢復到pc中(實現(xiàn)返回的效果)。
- 在處理trap的程序中我們可以修改mepc的值達到改變mret返回地址的目的。
mcause (Machine Cause)
- 當trap發(fā)生時,hart會設置該寄存器通知我們trap發(fā)生的原因。
- 最高位Interrupt為1時標識了當前trap為interrupt,否則是exception。通過此標識能快速分辨發(fā)生了中斷還是異常。
- 剩余的Exception Code用于標識具體的interrupt或者exception的種類。
- WLRL(Write/Read Only Legal Values)
mstatus (Machine Status)
- MIE: 分別用于打開(1)或者關閉(0) M/S/U模式下的全局中斷。當trap發(fā)生時,hart會自動將MIE設置為0。
- MPIE: 當trap發(fā)生時用于保存trap發(fā)生之前的MIE值。
- MPP: 當trap發(fā)生時用于保存trap發(fā)生之前的權限級別值。M/S/U三種模式用兩個bit表示。
中斷與異常含義
RISC-V Trap處理流程
Trap初始化(設置入口地址等)-> Trap的Top Half(硬件處理過程)-> Trap的Bottom Half(軟件邏輯部分)-> 從Trap返回
Top Half(Trap發(fā)生時,Hart自動執(zhí)行流)
- 先把 mstatus 的MIE值復制到MPIE中,清除 mstatus 中的MIE標志位,效果是中斷被禁止。(這就是硬件上不支持中斷嵌套,但可以手動將中斷再次打開實現(xiàn)中斷嵌套)
- 設置 mepc,同時PC被設置為 mtvec。(需要注意的是,對于 exception, mepc 指向導致異常的指令;對于 interrupt,它指向被中斷的指令的下一條指令。)
- 根據(jù) trap 的種類設置 mcausem,并根據(jù)需要為 mtval 設置附加信息。
- 將 trap發(fā)生之前的權限模式保存在 mstatus 的 MPP 域中,再把 hart 權限模式更改為M(也就是說無論在任何 Level 下觸發(fā) trap, hart首先切換到 Machine 模式)
Bottom Half(軟件需要做的事情)
- 保存(save) 當前控制流的上下文信息,是指保存x1~x31寄存器的值。(利用 mscratch)
- 調用C語言的trap handler
- 中斷C程序執(zhí)行完畢之后從trap handler函數(shù)返回,mepc的值可能需要調整。
- 恢復 (restore)上下文的信息。
- 執(zhí)行 MRET指令返回到trap之前的狀態(tài)。
退出 trap:編程調用 MRET 指令
- 針對不同權限級別下有各自退出trap的返回指令xRET (x=M/S/U)
- 以在M模式下指令mret指令為例,會執(zhí)行開中斷(mstatus.MIE = mstatus.MPIE; mstatus.MPIE = 1),然后返回進入trap之前的指令,如果是中斷的話返回進入trap之前的下一條指令。(pc = mepc)
總結
以上是生活随笔為你收集整理的【RISC-V】Trap和Exception的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 放射性衰变类型
- 下一篇: mysql中locate的用法