sstatus 寄存器是 mstatus 寄存器的子集。 在简单的实现中,读取或写入 sstatus 中的任何字段相当于 读取或写入 mstatus 中的同名字段。
这取自 riscv-privledged-20211203.pdf。 我们有两个寄存器,并且为
status
和 S
模式使用不同的地址空间。另外,将信息存储在两个不同的寄存器中似乎更全面(我猜)。
那么使用 M
作为 sstatus
的子集而不是单独的寄存器的原因是什么?这方面有性能优化吗?如果是优化的方式,为什么规范要分配不同的寄存器地址?
在第2.2节中,您可以看到
mstatus
具有权限SRW,这意味着它可以从主管(S)模式读写。另一方面,
sstatus
是MRW,因此可以从机器模式(M)读取和写入,这显然是更高的特权级别。因此,这意味着 S 模式仅允许访问 mstatus
中的部分位。
实现此目的的另一种方法是使mstatus
在两个级别均可访问,但添加额外的微代码,以便如果从级别 S 访问它,则更敏感的位将被屏蔽。但这会稍微复杂一些。必须已经有一种机制来检查对任何 CSR 寄存器的访问权限级别,因此通过将
mstatus
视为具有自己地址的自己的寄存器,我们可以使用这个现有机制。一旦通过此检查,对 sstatus
的访问就可以简单地视为对 sstatus
的访问,并无条件地屏蔽敏感位。