编辑:“qemu timebase riscv mtime”的快速 google 发现了一个 google groups chat,它指出 RDTIME 是自启动以来的纳秒,mtime 是一个模拟的 10Mhz 时钟。
我没有进行搜索以找到您需要的信息,但我想我有一些上下文信息可以帮助您找到它。我建议搜索 QEMU 文档/代码(可能来自 Github 搜索)以了解 mtime 和 mtimecmp 的工作原理。
在规范1的第10.1节(Counter - Base Counter and Timers)中,解释了RDTIME伪指令应该有一些固定的tick rate,可以根据实现来确定2。如特权规范 3 中定义的那样,mtimecmp 和 mtime 也将共享该滴答率。
我假设睡眠系统调用使用的滴答声与规范中的这些滴答声相同。在这种情况下,xv6 只是一个内核,然后不会定义有多少滴答声/秒。似乎 xv6 是在 qemu 之上运行的,因此应该在 qemu 代码的某处定义滴答/秒的定义,并且可能会记录在案。
从old wiki for QEMU-riscv 可以清楚地看出,SiFive CLINT 定义了 xv6 需要工作的功能,但我怀疑它是否指定了如何知道滴答率。 Spike 还支持 CLINT 接口,因此在处理它的 spike 中搜索代码也可能具有指导意义。
1我使用了非特权规范的20191213版本作为参考
2
RDTIME 伪指令读取时间 CSR 的低 XLEN 位,它计算挂钟
从过去的任意开始时间过去的实时时间。 RDTIMEH 是仅 RV32I 的输入
读取同一实时计数器的位 63-32 的结构。底层的 64 位计数器应该
在实践中永远不会溢出。执行环境应该提供一种方法来确定
实时计数器的周期(秒/滴答声)。周期必须是恒定的。实时时钟
单个用户应用程序中的所有 harts 应同步到实时的一个刻度内
钟。环境应该提供一种方法来确定时钟的准确性。
3
3.1.10
机器定时器寄存器(mtime 和 mtimecmp)
平台提供实时计数器,以内存映射机器模式读写方式公开
注册,mtime。 mtime必须以恒定频率运行,平台必须提供机制
用于确定 mtime 的时基。