Skip to content

Commit

Permalink
book: #215 Fix description about mtime and mtimecmp in ch3-4
Browse files Browse the repository at this point in the history
  • Loading branch information
wyfcyx committed Aug 25, 2024
1 parent c587c4a commit d907e23
Showing 1 changed file with 2 additions and 6 deletions.
8 changes: 2 additions & 6 deletions source/chapter3/4time-sharing-system.rst
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,7 @@ RISC-V 的中断可以分成三类:

.. _link-time-counter:

由于软件(特别是操作系统)需要一种计时机制,RISC-V 架构要求处理器要有一个内置时钟,其频率一般低于 CPU 主频。此外,还有一个计数器用来统计处理器自上电以来经过了多少个内置时钟的时钟周期。在 RISC-V 64 架构上,该计数器保存在一个 64 位的 CSR ``mtime`` 中,我们无需担心它的溢出问题,在内核运行全程可以认为它是一直递增的。

另外一个 64 位的 CSR ``mtimecmp`` 的作用是:一旦计数器 ``mtime`` 的值超过了 ``mtimecmp``,就会触发一次时钟中断。这使得我们可以方便的通过设置 ``mtimecmp`` 的值来决定下一次时钟中断何时触发。

可惜的是,它们都是 M 特权级的 CSR ,而我们的内核处在 S 特权级,是不被允许直接访问它们的。好在运行在 M 特权级的 SEE (这里是RustSBI)已经预留了相应的接口,我们可以调用它们来间接实现计时器的控制:
由于软件(特别是操作系统)需要一种计时机制,RISC-V 架构要求处理器要有一个内置时钟,其频率一般低于 CPU 主频。此外,还有一个计数器用来统计处理器自上电以来经过了多少个内置时钟的时钟周期。在 RISC-V 64 架构上,该计数器保存在一个 64 位的 CSR ``mtime`` 中,我们无需担心它的溢出问题,在内核运行全程可以认为它是一直递增的。这个计数器被设计成在所有的特权级均可以通过一条 ``rdtime`` 的伪指令访问(可以参考 RISC-V 规范的"Zicntr"拓展相关章节)。 ``riscv`` 库已经封装了这个功能,我们直接调用相应接口,在 ``timer`` 子模块的 ``get_time`` 函数中取得计数器的值:

.. code-block:: rust
Expand All @@ -165,7 +161,7 @@ RISC-V 的中断可以分成三类:
time::read()
}
``timer`` 子模块的 ``get_time`` 函数可以取得当前 ``mtime`` 计数器的值;
另外一个 64 位的 CSR ``mtimecmp`` 的作用是:一旦计数器 ``mtime`` 的值超过了 ``mtimecmp``,就会触发一次时钟中断。这使得我们可以方便的通过设置 ``mtimecmp`` 的值来决定下一次时钟中断何时触发。运行在 M 特权级的 SEE (这里是RustSBI)预留了相关接口来实现计时器的控制:

.. code-block:: rust
:linenos:
Expand Down

0 comments on commit d907e23

Please sign in to comment.