特权级架构
特权模式:§
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§
-
对Trap的配置(处理之前)
- stvec/mtvec: 事件发生后对应的处理函数地址(跳转地址)
- 代理中断: eg: ECALL 默认是从U直接跳到M , 但很多事件处理不需要那么高的特权级, 可以预先设置寄存器, 使得ECALL不会直接跳到M态, 而是先到S态, S态视情况再继续ECALL跳到M态.
-
处理trap过程中
-
trap发生的原因:
- scause/mcasue: 用于存储事件发生的原因, 其中最高位1表示这是中断, 最高位=0表示这是异常.
- stval/mtval: 存储用来补充事件的信息, eg 非法地址, 非法操作数.
-
如何从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.