Skip to content

Commit

Permalink
Fix ch2-4.
Browse files Browse the repository at this point in the history
  • Loading branch information
wyfcyx committed Jan 23, 2022
1 parent 63ed58f commit 952369e
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions source/chapter2/4trap-handling.rst
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,8 @@ Trap 处理的总体流程如下:首先通过 ``__alltraps`` 将 Trap 上下

RISC-V 中读写 CSR 的指令是一类能不会被打断地完成多个读写操作的指令。这种不会被打断地完成多个操作的指令被称为 **原子指令** (Atomic Instruction)。这里的 **原子** 的含义是“不可分割的最小个体”,也就是说指令的多个操作要么都不完成,要么全部完成,而不会处于某种中间状态。

另外,RISC-V 架构中常规的数据处理和访存类指令只能操作通用寄存器而不能操作 CSR 。因此,当想要对 CSR 进行操作时,需要先使用读取 CSR 的指令将 CSR 读到一个通用寄存器中,而后操作该通用寄存器,最后再使用写入 CSR 的指令将该通用寄存器的值写入到 CSR 中。

当 ``trap_handler`` 返回之后会从调用 ``trap_handler`` 的下一条指令开始执行,也就是从栈上的 Trap 上下文恢复的 ``__restore`` :

.. _code-restore:
Expand Down Expand Up @@ -349,10 +351,10 @@ Trap 处理的总体流程如下:首先通过 ``__alltraps`` 将 Trap 上下
csrrw sp, sscratch, sp
sret
- 第 8 行比较奇怪我们暂且不管,假设它从未发生,那么 sp 仍然指向内核栈的栈顶。
- 第 11~24 行负责从内核栈顶的 Trap 上下文恢复通用寄存器和 CSR 。注意我们要先恢复 CSR 再恢复通用寄存器,这样我们使用的三个临时寄存器才能被正确恢复。
- 在第 26 行之前,sp 指向保存了 Trap 上下文之后的内核栈栈顶, sscratch 指向用户栈栈顶。我们在第 26 行在内核栈上回收 Trap 上下文所占用的内存,回归进入 Trap 之前的内核栈栈顶。第 27 行,再次交换 sscratch 和 sp,现在 sp 重新指向用户栈栈顶,sscratch 也依然保存进入 Trap 之前的状态并指向内核栈栈顶。
- 在应用程序控制流状态被还原之后,第 28 行我们使用 ``sret`` 指令回到 U 特权级继续运行应用程序控制流。
- 第 10 行比较奇怪我们暂且不管,假设它从未发生,那么 sp 仍然指向内核栈的栈顶。
- 第 13~26 行负责从内核栈顶的 Trap 上下文恢复通用寄存器和 CSR 。注意我们要先恢复 CSR 再恢复通用寄存器,这样我们使用的三个临时寄存器才能被正确恢复。
- 在第 28 行之前,sp 指向保存了 Trap 上下文之后的内核栈栈顶, sscratch 指向用户栈栈顶。我们在第 28 行在内核栈上回收 Trap 上下文所占用的内存,回归进入 Trap 之前的内核栈栈顶。第 30 行,再次交换 sscratch 和 sp,现在 sp 重新指向用户栈栈顶,sscratch 也依然保存进入 Trap 之前的状态并指向内核栈栈顶。
- 在应用程序控制流状态被还原之后,第 31 行我们使用 ``sret`` 指令回到 U 特权级继续运行应用程序控制流。

.. note::

Expand Down

0 comments on commit 952369e

Please sign in to comment.