M-Mode编程 -- 中断机制 -- 中断分类
RISC-V 的中断: 通过 mcause 寄存器的不同位来表示(mie)
- 软件中断:通过向内存映射寄存器写入数据来触发,一个 hart 中断另外一个hart(处理器间中断)
- 时钟中断:hart 的时间计数器寄存器 mtime 大于时间比较寄存器 mtimecmp
- 外部中断:由中断控制器触发,大部分情况下的外设都会连到这个中断控制器
RISC-V 系统编程:RISC-V 的异常与中断
RISC-V 的中断: 通过 mcause 寄存器的不同位来表示
第一列1代表中断,第2列代表中断ID,第3列中断含义
第二节 从 OS 角度看RISC-V
- M-Mode编程
- 中断机制
- 异常机制
- 异常与中断的硬件响应
- 异常/中断处理的控制权移交
M-Mode编程 -- RISC-V 异常机制
RISC-V 的异常: 通过 mcause 寄存器的不同位来表示
第一列0代表异常,第2列代表异常ID,第3列异常含义
第二节 从 OS 角度看RISC-V
- M-Mode编程
- 中断机制
- 异常机制
- 异常与中断的硬件响应
- 异常/中断处理的控制权移交
M-Mode编程 -- 异常与中断的硬件响应
- 异常/中断的指令的 PC 被保存在 mepc 中, PC 被设置为 mtvec。
- 对于异常,mepc指向导致异常的指令
- 对于中断,mepc指向中断处理后应该恢复执行的位置
- 根据异常/中断来源设置 mcause,并将 mtval 设置为出错的地址或者其它适用于特定异常的信息字。
M-Mode编程 -- 异常与中断的硬件响应
- 把控制状态寄存器 mstatus[MIE位]置零以禁用中断,并把先前的 MIE 值保留到 MPIE 中。
- SIE控制S-Mode下全局中断,MIE控制M-Mode下全局中断;
- SPIE记录的是SIE中断之前的值,MPIE记录的是MIE中断之前的值)
- 发生异常之前的权限模式保留在 mstatus 的 MPP 域中,再把权限模式更改为M
- MPP表示变化之前的特权级别是S、M or U-Mode
- 跳转到mtvec CSR设置的地址继续执行
第二节 从 OS 角度看RISC-V
- M-Mode编程
- 中断机制
- 异常机制
- 异常与中断的硬件响应
- 异常/中断处理的控制权移交
M-Mode编程 -- 异常/中断处理的控制权移交
- 默认情况下,所有的异常/中断都使得控制权移交到 M-Mode的异常/中断处理程序
- M-Mode的异常/中断处理程序可以将异常/中断重新导向 S-Mode,但是这些额外的操作会减慢异常/中断的处理速度
- RISC-V 提供一种异常/中断委托机制,通过该机制可以选择性地将异常/中断交给 S-Mode处理,而完全绕过 M-Mode
M-Mode编程 -- 异常/中断处理的控制权移交
- mideleg/medeleg (Machine Interrupt/Exception Delegation)CSR 控制将哪些中断/异常委托给 S-Mode处理
- mideleg/medeleg 中的每个为对应一个中断/异常
- 如 mideleg[5] 对应于 S-Mode的时钟中断,如果把它置位,S-Mode的时钟中断将会移交 S-Mode的异常/中断处理程序,而不是 M-Mode的异常/中断处理程序
- 委托给 S-Mode的任何中断都可以被 S-Mode的软件屏蔽。sie(Supervisor Interrupt Enable) 和 sip(Supervisor Interrupt Pending)CSR 是 S-Mode的控制状态寄存器
RISC-V 系统编程:异常/中断委托寄存器
- mideleg (Machine Interrupt Delegation)控制将哪些中断委托给 S 模式处理
- mideleg 中的每个为对应一个中断/异常
- mideleg[1]用于控制是否将核间中断交给s模式处理
- mideleg[5]用于控制是否将定时中断交给s模式处理
- mideleg[9]用于控制是否将外部中断交给s模式处理
RISC-V 系统编程:异常/中断委托寄存器
- medeleg (Machine Exception Delegation)控制将哪些异常委托给 S 模式处理
- medeleg 中的每个为对应一个中断/异常
- medeleg[1]用于控制是否将指令获取错误异常交给s模式处理
- medeleg[12]用于控制是否将指令页异常交给s模式处理
- medeleg[9]用于控制是否将数据页异常交给s模式处理
M-Mode编程 -- 异常/中断处理的控制权移交
- 发生异常/中断时,处理器控制权不会移交给权限更低的模式
- 例如 medeleg[15] 会把 store page fault 委托给 S-Mode
- M-Mode下发生的异常总是在 M-Mode下处理
- S-Mode下发生的异常总是在 M-Mode,或者在 S-Mode下处理
- 上述两种模式发生的异常不会由 U-Mode处理
Why?
RISC-V 系统编程:思考题
- 如何通过断点异常来实现调试器的断点调试功能?
- 如何实现单步跟踪?
第二节 从 OS 角度看RISC-V
- 主流CPU比较
- RISC-V 系统模式
- RISC-V 系统编程
- 简述
- U-Mode编程:系统调用
- 特权操作
- M-Mode编程
- S-Mode编程
第二节 从 OS 角度看RISC-V
安全的硬件隔离
- 避免U-Mode的APP执行越权指令、非法地址或长期占用处理器
- 让U-Mode的APP能够得到S-Mode的OS的服务
- S-Mode编程
- 中断/异常机制
- 异常/中断的硬件处理
- 异常/中断的软件处理
- 虚存机制
S-Mode编程 -- 中断/异常机制 -- CSR寄存器
- stvec(SupervisorTrapVector)保存发生异常/中断时要跳转到的地址
- sepc(Supervisor Exception PC)指向发生异常/中断时的指令
- scause(Supervisor Exception Cause)指示发生异常/中断的种类
- sie(Supervisor Interrupt Enable)指出处理器目前能处理的中断
- sip(Supervisor Interrupt Pending)列出目前正准备处理的中断
- stval(Supervisor Trap Value)保存陷入(trap)附加信息
- sscratch(Supervisor Scratch)不同mode交换数据中转站
- sstatus(Supervisor Status)保存全局中断以及其他的状态
S-Mode编程 -- 中断/异常机制 -- CSR寄存器
- sstatus的SIE 和 SPIE 位分别保存了当前的和异常/中断发生之前的中断使能状态
sstatus 寄存器
S-Mode编程 -- 中断/异常机制
sie & sip 寄存器是用于保存待处理的中断和中断使能情况的CSR
- sie (supervisor interrupt-enabled register)
- sip(supervisor interrupt pending)
RISC-V 系统编程:异常/中断 CSR 寄存器
- scause寄存器:当发生异常时,CSR中被写入一个指示导致异常/中断的事件编号,记录在
Exception Code
字段中;如果事件由中断引起,则置Interrupt
位。
scause 寄存器
S-Mode编程 -- 中断/异常机制
异常/中断向量(trap-vector)基地址寄存器stvec CSR用于配置trap_handler地址
- 包括向量基址(BASE)和向量模式(MODE):BASE 域中的值按 4 字节对齐,MODE = 0 表示一个trap_handler处理所有的异常/中断;MODE = 1 表示每个异常/中断有一个对应的trap_handler
mtvec & stvec 寄存器
第二节 从 OS 角度看RISC-V
安全的硬件隔离
- 避免U-Mode的APP执行越权指令、非法地址或长期占用处理器
- 让U-Mode的APP能够得到S-Mode的OS的服务
- S-Mode编程
- 异常/中断机制
- 异常/中断的硬件处理
- 异常/中断的软件处理
- 虚存机制
S-Mode编程 -- 异常/中断的硬件处理
硬件执行内容
hart 接受了异常/中断,并需要委派给 S-Mode,那么硬件会原子性的经历下面的状态转换
- 发生异常/中断的指令 PC 被存入 sepc, 且 PC 被设置为 stvec
- scause 设置异常/中断类型,stval被设置为出错的地址/异常相关信息
- 把 sstatus中的 SIE 位置零,屏蔽中断, SIE 位之前的值被保存在 SPIE 位中
S-Mode编程 -- 异常/中断的硬件处理
硬件执行内容
- 发生例外前的特权模式被保存在 sstatus 的 SPP(previous privilege) 域,然后设置当前特权模式为S-Mode
- 跳转到stvec CSR设置的地址继续执行
S-Mode编程 -- 异常/中断的软件处理
- 初始化
- 编写异常/中断的处理例程(如trap_handler)
- 设置trap_handler地址给stvec
- 软件执行
- 处理器跳转到trap_handler
- trap_handler处理异常/中断/系统调用等
- 返回到之前的指令和之前的特权级继续执行
第二节 从 OS 角度看RISC-V
安全的硬件隔离
- 避免U-Mode的APP执行越权指令、非法地址或长期占用处理器
- 让U-Mode的APP能够得到S-Mode的OS的服务
- S-Mode编程
- 异常/中断机制
- 异常/中断的硬件处理
- 异常/中断的软件处理
- 虚存机制
S-Mode编程 -- 虚存机制
- 通过stap CSR建立页表基址
- 建立OS和APP的页表
- 处理内存访问异常
S-Mode编程 -- 虚存机制
- S、U-Mode中虚拟地址会以从根部遍历页表的方式转换为物理地址:
小结
- 了解 RISC-V 特权级和硬件隔离方式
- 了解 RISC-V 的 M-Mode 和 S-Mode 的基本特征
- 了解OS在 M-Mode 和 S-Mode 下如何访问控制计算机系统
- 了解不同软件如何在 M-Mode<–>S-Mode<–>U-Mode 之间进行切换
- U-Mode系统调用
- RISC-V特权操作
- 异常与中断机制
- S-Mode虚拟内存机制
- S-Mode异常与中断处理
主要说明x86, arm由于兼容性,历史原因,导致设计实现复杂,riscv简洁/灵活/可扩展,便于学习掌握并用于写OS
主要说明x86, arm由于兼容性,历史原因,导致设计实现复杂,riscv简洁/灵活/可扩展,便于学习掌握并用于写OS
https://www.jianshu.com/p/2152708d75f1 RISC-V特权指令和CSR
## RISC-V 系统模式:控制状态寄存器CSR
强制隔离以避免对整个系统的可用性/可靠性/安全影响
## RISC-V 系统模式:控制状态寄存器CSR
- mtvec(MachineTrapVector)保存发生异常时需要跳转到的地址。
- mepc(Machine Exception PC)指向发生异常的指令。
- mcause(Machine Exception Cause)指示发生异常的种类。
- mie(Machine Interrupt Enable)指出处理器目前能处理的中断。
- mip(Machine Interrupt Pending)列出目前正准备处理的中断。
- mtval(Machine Trap Value)保存陷入(trap)附加信息:地址例外中出错的地址、发生非法指令例外的指令本身;对于其他异常,值为0。
- mscratch(Machine Scratch)它暂时存放一个字大小的数据。
- mstatus(Machine Status)保存全局中断以及其他的状态
---
## RISC-V 系统模式:控制状态寄存器CSR
- mcause(Machine Exception Cause)它指示发生异常的种类。
- SIE控制S-Mode下全局中断,MIE控制M-Mode下全局中断。
- SPIE、MPIE记录发生中断之前MIE和SIE的值。
---
## RISC-V 系统模式:控制状态寄存器CSR
- sstatus(supervisor status)保存发生异常时需要跳转到的地址。
- stvec(supervisor trap vector)保存s模式的trap向量基址。stvec总是4字节对齐
- satp(supervisor Address Translation and Protection) S-Mode控制状态寄存器控制了分页系统。
- sscratch (supervisor Scratch Register) 保存指向hart-local supervisor上下文的指针. 在trap处理程序的开头,sscratch与用户寄存器交换,以提供初始工作寄存器。
- sepc(supervisor Exception PC)它指向发生异常的指令。
Zifencei扩展 https://www.cnblogs.com/mikewolf2002/p/11191254.html
在执行 fence.i 指令之前,对于同一个硬件线程(hart), RISC-V 不保证用存储指令写到内存指令区的数据可以被取指令取到。使用fence.i指令后,对同一hart,可以确保指令读取是最近写到内存指令区域的数据。但是,fence.i将不保证别的riscv hart的指令读取也能够满足读写一致性。如果要使写指令内存空间对所有的hart都满足一致性要求,需要执行fence指令。
mtval(Machine Trap Value)保存陷入(trap)附加信息:地址例外中出错的地址、发生非法指令例外的指令本身;对于其他异常,值为0。
,是 mie 和 mip 的子集。这两个寄存器和 M-Mode下有相同的布局。sie 和 sip 中只有与由 mideleg 委托的中断对应的位才能读写,没有委派的中断对应位总是 0
---
## RISC-V 系统编程:S-Mode下的隔离
- S-Mode比 U-Mode权限更高,但是比 M-Mode权限低
- S-Mode下运行的软件不能使用 M-Mode的 CSR 和指令,并受到 PMP 的限制
- 支持基于页面的虚拟内存