我正在进行一个系统调用,在
mtime
寄存器中提取一个值。
我正在 riscv (xv6) 环境上工作。因为
mtime
寄存器只能在机器模式下读取,与其他仅在超级用户模式下进行的系统调用不同,我想要进行的系统调用应该进入机器模式。
为此,我尝试进行嵌套系统调用。
首先,我调用了我所做的
sys_time
系统调用,在该系统调用中,ecall
被执行,以便模式进入机器模式。
timervec()
写入 mtvec
寄存器中,因此我希望控件转到 timervec()
。timervec()
中,我编写了一个条件分支,这样如果 mcause
寄存器中的值为 9(这意味着从主管模式ecall),它就会跳转到我制作的 mtimevec()
。
然而,它并没有到达
mtimevec()
。似乎在调用 ecall
之后它没有跳转到 timervec()
或者当它跳转到 timervec()
时 mcause
寄存器中的值不是 9。
有谁能告诉我哪一部分的想法是错误的吗?为了我的目的,我将
medeleg
设置为 0xfdff
。
在跳转到 S 模式之前,您可以通过在 M 模式中设置
mtime
将 mcounteren.TM
暴露于 S 模式。