【发布时间】:2020-06-02 17:28:22
【问题描述】:
RISC-V 当前的 SW 特权级别未在任何 CSR 中设置。尽管如此,规范声明“尝试在没有适当特权级别的情况下访问 CSR ......引发非法指令”。那么(在硬件中)如何实现?
【问题讨论】:
-
硬件可以(当然确实)具有不通过寄存器暴露给软件的状态。
标签: riscv
RISC-V 当前的 SW 特权级别未在任何 CSR 中设置。尽管如此,规范声明“尝试在没有适当特权级别的情况下访问 CSR ......引发非法指令”。那么(在硬件中)如何实现?
【问题讨论】:
标签: riscv
特权级别反映在 mstatus 寄存器的 MPP 位中。
【讨论】:
好吧,在中断上——“xPP 保持以前的特权模式(x=M,S 或 U)。xPP 字段只能保持最高 x 的特权模式,所以 MPP 是两位宽,SPP 是一位宽,并且 UPP 隐含为零。”
实际上,我现在发现的是 xRET 指令使处理器能够(内部)存储当前模式 - “MRET、SRET 或 URET 指令用于从 M-mode、S-mode 中的陷阱返回, 或 U-mode. 当执行 xRET 指令时, 假设 xPP 保持值 y, x IE 设置为 x PIE; 特权模式更改为 y; x PIE 设置为 1; xPP 设置为 U (如果不支持用户模式,则为 M)。”
【讨论】:
我们有 mstatus.mPP。持有以前的特权模式。当前特权模式对软件不可见。
在中断时 mstatus.mPP 被保存到 mcause.mPP.. 在 mrwt 上,它只是写回 mstatus.mPP。
【讨论】:
当我在寻找相同的问题时,我从五个论坛中发现这个答案很有帮助。
RISC-V 故意不让代码轻松发现什么 模式它正在运行它,因为这是一个虚拟化漏洞。作为一个 一般原则,代码应该被设计并隐含地知道 它将在什么模式下运行。应用程序代码应该假设它在 U 模式。操作系统应该假定它处于 S 模式(它可能在 实际上是虚拟化并在 U 模式下运行,具有 U 模式不能做的事情 由管理程序捕获和模拟)。
https://forums.sifive.com/t/how-to-determine-the-current-execution-privilege-mode/2823
【讨论】: