插入一段小广告:
在 RISC-V 架构中,控制和状态寄存器(CSR,Control and Status Registers)用于存储和管理处理器的状态和控制信息。
点评:
- 你可以粗浅的理解为只有2种类型的寄存器, 一种是通用寄存器,一种是系统寄存器。csr相当于访问系统寄存器的入口。
- 系统寄存器比较特殊,它有一个地址,相当于系统的寄存器的ID。
- csr有一个单独的寄存器,高12位是用来检索的系统寄存器。(绰绰有余了吧)
- 这个12位有几个位是特殊的,可以自行去了解
- 比如:ustatus, mstatus,mstatus ,就是通过那12进行区分的那个是M模式,那个是S模式
- 比如:ustatus,uie 等也是通过这12位地址不同进行区分的。
CSR 的种类和数量取决于处理器的特权级别和扩展功能。CSR 通常分为以下几类:
用户模式 CSR
用户模式 CSR 是为用户应用程序提供的寄存器。常见的用户模式 CSR 包括:
ustatus:用户模式状态寄存器
uie:用户模式中断使能寄存器
utvec:用户模式陷阱向量基地址寄存器
超级用户模式 CSR
超级用户模式 CSR 是为操作系统内核提供的寄存器。常见的超级用户模式 CSR 包括:
sstatus:超级用户模式状态寄存器
sie:超级用户模式中断使能寄存器
stvec:超级用户模式陷阱向量基地址寄存器
sscratch:超级用户模式临时寄存器
sepc:超级用户模式异常程序计数器
scause:超级用户模式异常原因寄存器
stval:超级用户模式陷阱值寄存器
机器模式 CSR
机器模式 CSR 是为处理器的最高特权级别提供的寄存器。常见的机器模式 CSR 包括:
mstatus:机器模式状态寄存器
mie:机器模式中断使能寄存器
mtvec:机器模式陷阱向量基地址寄存器
mscratch:机器模式临时寄存器
mepc:机器模式异常程序计数器
mcause:机器模式异常原因寄存器
mtval:机器模式陷阱值寄存器
/**
* 裸机引导程序原理, 进入系统内核 risc-v默认是M, 机器模式
*/
void sbi_main(void) {
unsigned long val;
/** 设置跳转模式为S模式,mret的输入之一*/
val = read_csr(mstatus);
val = INSERT_FIELD(val, MSTATUS_MPP, PRV_S);
val = INSERT_FIELD(val, MSTATUS_MPIE, 0);
write_csr(mstatus, val);
/** 设置M模式的异常程序计数器,mret的输入之一 ,为啥名字称为异常?因为,他还干了几件事情*/
write_csr(mepc, FW_JUMP_ADDR);
/** 即将进入的模式(S模式) 的环境初始化*/
write_csr(stvec, FW_JUMP_ADDR);/**FW_JUMP_ADDR 内核的地址*/
/** 关闭S模式的中断*/
write_csr(sie, 0);
/** 关闭S模式的页表转换 */
write_csr(satp, 0);
/**
* @mret 干了2件事情(这个是灵魂):
* 1 从mepc寄存器中读取返回地址,并将程序计数器(PC)设置为该地址
* 2 从机器模式切换到先前的模式
* @risc-v 有3中模式:用户模式(U), 系统模式(S),机器模式(M),默认是机器模式(M)
* mret:机器模式切到系统模式,sret:系统模式切到用户模式,同理,也有sstatus
*/
asm volatile("mret");
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。