【问题标题】:How to implement sleep utility in RISC-V?如何在 RISC-V 中实现睡眠实用程序?
【发布时间】:2020-11-22 04:53:52
【问题描述】:

我想实现sleep 实用程序,它接收秒数作为输入,并在运行于risc-v 处理器上的教育xv6 操作系统上暂停给定秒数。

操作系统已经有系统调用来获取滴答和暂停的数量:https://github.com/mit-pdos/xv6-riscv/blob/riscv/kernel/sysproc.c#L56

使用定时器向量初始化定时器:https://github.com/mit-pdos/xv6-riscv/blob/riscv/kernel/kernelvec.S#L93 定时器向量使用CLINT_MTIMECMP 函数初始化,该函数告诉定时器控制器何时唤醒下一个中断。

我不明白的是如何知道滴答之间的时间以及在 1 秒内完成了多少滴答。

【问题讨论】:

    标签: riscv xv6


    【解决方案1】:

    编辑:“qemu timebase riscv mtime”的快速 google 发现了一个 google groups chat,它指出 RDTIME 是自启动以来的纳秒,mtime 是一个模拟的 10Mhz 时钟。

    我没有进行搜索以找到您需要的信息,但我想我有一些上下文信息可以帮助您找到它。我建议搜索 QEMU 文档/代码(可能来自 Github 搜索)以了解 mtimemtimecmp 的工作原理。

    在规范1的第10.1节(Counter - Base Counter and Timers)中,解释了RDTIME伪指令应该有一些固定的tick rate,可以根据实现来确定2。如特权规范 3 中定义的那样,mtimecmpmtime 也将共享该滴答率。

    我假设睡眠系统调用使用的滴答声与规范中的这些滴答声相同。在这种情况下,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 的时基。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2023-03-10
      • 2020-09-04
      • 1970-01-01
      • 2017-01-22
      • 2018-05-16
      • 1970-01-01
      相关资源
      最近更新 更多