Mscratch和Mtvec寄存器有什么区别?

时间:2018-06-06 10:17:50

标签: riscv

对于Mscratch:通常,它用于保存指向机器模式哈特本地上下文空间的指针,并在进入M模式陷阱处理程序时与用户寄存器交换。 对于Mtvec:寄存器保存陷阱向量配置,包括向量基地址(BASE)和向量模式(MODE)。

我无法清除两者之间的区别。任何人都可以清除它吗?

2 个答案:

答案 0 :(得分:1)

mtvec寄存器由硬件直接使用:它是处理机器模式陷阱时要提取的第一条指令的地址。假设已启用陷阱,则此操作随时可能发生,因此对于在mtvec中存储任意值的软件来说通常是不安全的。实际上,mtvec通常在机器模式软件初始化期间被写入几次,然后保留该值直到重置。

相比之下,mscratch的值永远不会被硬件直接使用:它只是用作xlen位长的临时暂存空间,可以被机器模式软件使用,受到保护。具有其他特权模式,并且可以在不破坏任何X寄存器内容的情况下(通过CSR交换指令)对其进行访问。

典型的情况是将mtvec设置为一个程序集序列,该程序序列首先将sp交换为mscratch,这将产生一个干净的陷阱处理堆栈,然后可将其用于其余部分。进入C陷阱处理程序之前的寄存器。这样,机器模式软件就可以在不破坏X寄存器内容的情况下处理陷阱,而这对于许多通用系统功能(例如,多程序编程)来说是必需的。

答案 1 :(得分:0)

据我所知,MTVEC将向量保持为有中断时程序将跳转到的位置。 mscratch是一个指针,当在中断函数内部时,可以用作堆栈指针的替代。