插入一段小广告:
在 RISC-V 架构中,控制和状态寄存器(CSR,Control and Status Registers)用于存储和管理处理器的状态和控制信息。


点评:

  1. 你可以粗浅的理解为只有2种类型的寄存器, 一种是通用寄存器,一种是系统寄存器。csr相当于访问系统寄存器的入口。
  2. 系统寄存器比较特殊,它有一个地址,相当于系统的寄存器的ID。
  3. csr有一个单独的寄存器,高12位是用来检索的系统寄存器。(绰绰有余了吧)
    image.png
  4. 这个12位有几个位是特殊的,可以自行去了解
  5. 比如:ustatus, mstatus,mstatus ,就是通过那12进行区分的那个是M模式,那个是S模式
  6. 比如: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");
}

putao
8 声望3 粉丝

推动世界向前发展,改善民生。