Salted的笔记
Tab折叠当前
Shift+Tab全局折叠
/搜索
点击圆点折叠

特权级架构

7 章 · 更新 2026-06-17
特权模式:§
M : Machine 机器模式

S : Supervisor 监管者模式 (OS). 引入了页表机制, 从而能实现虚拟内存.

U : User 用户模式

广义上, M 和 S 都属于"特权态".

在OS实验的语境下, "特权态" 一般指的是 S mode.

更高的特权级可以执行更多指令, 可以修改 CSR control/state register. 某些CSR在不同特权级中有对应不同的版本: mtyec & stvec (发生异常时的跳转位置). 通过 前缀 区分

不同的risc-v处理器配置profile:

Modes
嵌入式(无保护) 只有一种M
嵌入式(有保护) M + U (应用程序)
Unix-like OS M +S + U

OS 实验主要是考虑 M+S+U 这种模式

特定mode下的指令§
  • 各个mode都可以使用的指令(公共指令)

    ECALL : U -> S , S -> M

    SRET: S->U

    EBREAK : 断点异常.

    FENCE.I 读写屏障

  • S mode特定:

    SFENCE.VMA : 主要是用来刷新页表缓存TLB. 仅在当前核心上作用.

  • M mode特定:

    WFI:让当前处理器核心进入睡眠状态.

特定mode下的CSR§
虚拟内存§

最小的页大小是4kb.

地址映射的方式有三种, 即决定了一个应用程序所能使用的最大内存

sv32 4g

sv39 512g

sv48

satp CSR: 存放页表根地址, 页表位宽32/39/48?

异常&中断§

异常:同步事件. 通常是由特定的指令引起的.

中断:异步事件. 不是因为指令执行引发的, eg I/O, timer, SW(来自另一个hart)

但是对这类的处理流程是几乎一样的. 都是通过Trap

和异常处理相关的CSR§
  1. 对Trap的配置(处理之前)

    • stvec/mtvec: 事件发生后对应的处理函数地址(跳转地址)
    • 代理中断: eg: ECALL 默认是从U直接跳到M , 但很多事件处理不需要那么高的特权级, 可以预先设置寄存器, 使得ECALL不会直接跳到M态, 而是先到S态, S态视情况再继续ECALL跳到M态.
  2. 处理trap过程中

    1. trap发生的原因:

      • scause/mcasue: 用于存储事件发生的原因, 其中最高位1表示这是中断, 最高位=0表示这是异常.
      • stval/mtval: 存储用来补充事件的信息, eg 非法地址, 非法操作数.
    2. 如何从trap中返回

      • sepc/mepc: 从高特权级返回低特权级时的返回地址.
      • mstate/sstate: 保存某些标志位, trap返回时要恢复.
发生异常时的行为§

当一个hart发生异常时:

  • 异常指令的PC被存到mepc, pc被置为mtvec. 对同步异常, mepc指向导致异常的指令. 对异步异常, mepc指向中断结束后,应该所处的位置.

这里的差别主要是因为 是否需要重试! 中断通常是不需要重试的. 而对于同步的异常, 通常是需要重试的. eg: 访存指令导致了内存 缺页 异常的发生, 在陷入内核并调整好页表, 返回到U态以后, 需要重新尝试访存.因此返回地址mepc应当指向这条访存指令.

  • 设置 mcause, mtval.

  • 暂时关中断: 将mstatus中的MIE置为0, 将旧的MIE存到MPIE.

  • 将当前所处的权限mode保存到mstatue的MPP中,然后将当前mode改为M.