mstatus 和 mie 的关系
mstatus 寄存器:提供全局中断使能控制,通过 MIE 位来启用或禁用所有机器模式的中断。
mie 寄存器:提供具体类型的中断使能控制,通过各个位来启用或禁用特定类型的中断。
mstatus 寄存器位的描述
xIE 开启之后,可以响应中断,比如 M模式下可以响应中断的话,就开启MIE
UIE (User Interrupt Enable) 位: 总开关
位置:位 0
描述:用户模式中断使能位。当设置为 1 时,用户模式的中断是使能的。
SIE (Supervisor Interrupt Enable) 位:
位置:位 1
描述:监督模式中断使能位。当设置为 1 时,监督模式的中断是使能的。
MIE (Machine Interrupt Enable) 位:
位置:位 3
描述:机器模式中断使能位。当设置为 1 时,机器模式的中断是使能的。
切换之前状态之前的状态,用来恢复之前的状态
UPIE (User Previous Interrupt Enable) 位:
位置:位 4
描述:用户模式之前的中断使能位,用于保存进入异常前的中断状态。
SPIE (Supervisor Previous Interrupt Enable) 位:
位置:位 5
描述:监督模式之前的中断使能位,用于保存进入异常前的中断状态。
MPIE (Machine Previous Interrupt Enable) 位:
位置:位 7
描述:机器模式之前的中断使能位,用于保存进入异常前的中断状态。
切换之前状态之前的特权级别,往往用户态切到内核态, 需要提前保护用户态的状态,好方便用内核切回来的时候,知道它是用户态,内核很傻的
SPP (Supervisor Previous Privilege) 位:
位置:位 8
描述:监督模式之前的特权级别位,用于保存进入异常前的特权级别。
下面的代码就是使用spp位,内核态切入到用户态之前的逻辑。 准备好spp.
pub fn app_init_context(entry: usize, sp: usize) -> Self {
let mut sstatus = sstatus::read(); // CSR sstatus
sstatus.set_spp(SPP::User); //previous privilege mode: user mode
let mut cx = Self {
x: [0; 32],
sstatus,
sepc: entry, // entry point of app
};
cx.set_sp(sp); // app's user stack pointer
cx // return initial Trap Context of app
}
MPP (Machine Previous Privilege) 位:
位置:位 11:12
描述:机器模式之前的特权级别位,用于保存进入异常前的特权级别。
取值:
00:用户模式(U-mode)
01:监督模式(S-mode)
11:机器模式(M-mode)
稍微分析
FS (Floating-Point Status) 位:
位置:位 13:14
描述:浮点状态位,用于指示浮点寄存器的状态。
取值:
00:浮点单元未使用
01:浮点单元已使用,保存状态
11:浮点单元已使用,需要保存状态
XS (Extension Status) 位:
位置:位 15:16
描述:扩展状态位,用于指示用户扩展寄存器的状态。
MPRV (Modify Privilege) 位:
位置:位 17
描述:修改特权位,用于指示内存访问的特权级别。
SUM (Supervisor User Memory Access) 位:
位置:位 18
描述:监督模式用户内存访问位,允许监督模式访问用户模式的内存。
MXR (Make eXecutable Readable) 位:
位置:位 19
描述:可执行位,使可执行页也可读。
TVM (Trap Virtual Memory) 位:
位置:位 20
描述:虚拟内存陷阱位,用于指示是否在监督模式下陷入虚拟内存管理指令。
TW (Timeout Wait) 位:
位置:位 21
描述:等待超时位,用于指示在监督模式下是否允许 wfi 指令。
TSR (Trap SRET) 位:
位置:位 22
描述:陷入 SRET 位,用于指示在监督模式下是否允许 sret 指令。
TVM (Trap Virtual Memory) 位
位置:位 20
描述:虚拟内存陷阱位。当设置为 1 时,在监督模式下执行虚拟内存管理指令(如 sfence.vma)会导致非法指令异常。
TW (Timeout Wait) 位
位置:位 21
描述:等待超时位。当设置为 1 时,在监督模式下执行 wfi(等待中断)指令会导致非法指令异常。
TSR (Trap SRET) 位
位置:位 22
描述:陷入 SRET 位。当设置为 1 时,在监督模式下执行 sret 指令会导致非法指令异常。
23-31. 保留位
位置:位 23-31
描述:这些位是保留的,未定义具体用途。
32-33. UXL (User XLEN) 位
位置:位 32-33
描述:用户模式 XLEN 位,用于指示用户模式下的寄存器宽度。
00:32位
01:64位
10:128位(目前未使用)
11:保留
34-35. SXL (Supervisor XLEN) 位
位置:位 34-35
描述:监督模式 XLEN 位,用于指示监督模式下的寄存器宽度。
00:32位
01:64位
10:128位(目前未使用)
11:保留
36-61. 保留位
位置:位 36-61
描述:这些位是保留的,未定义具体用途。
SD (Supervisor Dirty) 位
位置:位 62
描述:监督模式脏位。当设置为 1 时,表示浮点寄存器或扩展寄存器的状态已被修改。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。