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