File tree Expand file tree Collapse file tree 1 file changed +2
-6
lines changed Expand file tree Collapse file tree 1 file changed +2
-6
lines changed Original file line number Diff line number Diff line change @@ -149,11 +149,7 @@ RISC-V 的中断可以分成三类:
149149
150150.. _link-time-counter :
151151
152- 由于软件(特别是操作系统)需要一种计时机制,RISC-V 架构要求处理器要有一个内置时钟,其频率一般低于 CPU 主频。此外,还有一个计数器用来统计处理器自上电以来经过了多少个内置时钟的时钟周期。在 RISC-V 64 架构上,该计数器保存在一个 64 位的 CSR ``mtime `` 中,我们无需担心它的溢出问题,在内核运行全程可以认为它是一直递增的。
153-
154- 另外一个 64 位的 CSR ``mtimecmp `` 的作用是:一旦计数器 ``mtime `` 的值超过了 ``mtimecmp ``,就会触发一次时钟中断。这使得我们可以方便的通过设置 ``mtimecmp `` 的值来决定下一次时钟中断何时触发。
155-
156- 可惜的是,它们都是 M 特权级的 CSR ,而我们的内核处在 S 特权级,是不被允许直接访问它们的。好在运行在 M 特权级的 SEE (这里是RustSBI)已经预留了相应的接口,我们可以调用它们来间接实现计时器的控制:
152+ 由于软件(特别是操作系统)需要一种计时机制,RISC-V 架构要求处理器要有一个内置时钟,其频率一般低于 CPU 主频。此外,还有一个计数器用来统计处理器自上电以来经过了多少个内置时钟的时钟周期。在 RISC-V 64 架构上,该计数器保存在一个 64 位的 CSR ``mtime `` 中,我们无需担心它的溢出问题,在内核运行全程可以认为它是一直递增的。这个计数器被设计成在所有的特权级均可以通过一条 ``rdtime `` 的伪指令访问(可以参考 RISC-V 规范的"Zicntr"拓展相关章节)。 ``riscv `` 库已经封装了这个功能,我们直接调用相应接口,在 ``timer `` 子模块的 ``get_time `` 函数中取得计数器的值:
157153
158154.. code-block :: rust
159155
@@ -165,7 +161,7 @@ RISC-V 的中断可以分成三类:
165161 time::read()
166162 }
167163
168- `` timer `` 子模块的 ``get_time `` 函数可以取得当前 ``mtime `` 计数器的值;
164+ 另外一个 64 位的 CSR `` mtimecmp `` 的作用是:一旦计数器 ``mtime `` 的值超过了 ``mtimecmp ``,就会触发一次时钟中断。这使得我们可以方便的通过设置 `` mtimecmp `` 的值来决定下一次时钟中断何时触发。运行在 M 特权级的 SEE (这里是RustSBI)预留了相关接口来实现计时器的控制:
169165
170166.. code-block :: rust
171167 :linenos:
You can’t perform that action at this time.
0 commit comments