uCore-Tutorial-Guide-2023S/source/chapter2/4exercise.rst

83 lines
3.2 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

chapter2练习
=====================================================
.. toctree::
:hidden:
:maxdepth: 4
- 本节难度: **低**
本节任务
-----------------------------------
- 注意 ch2 并不对应一次 lab 提交,本节任务在 ch3 最终提交。
- 运行 ch2 分支的框架代码,确认 ``BASE=1`` 时 os 运行正常。
- 理解目前 os 加载用户程序的整体逻辑。在 ``user`` 目录下执行 ``make CHAPTER=2_bad`` 生成三个会导致错误的程序,运行并描述他们导致的现象。完成问答作业第一题。
- 阅读状态切换相关函数,思考并完成问答作业第二题。
- 完成问答作业第三题。
编程练习
-------------------------------
.. ch2问答作业::
问答作业
-------------------------------
1. 正确进入 U 态后,程序的特征还应有:使用 S 态特权指令,访问 S 态寄存器后会报错。请同学们可以自行测试这些内容(参考 `前三个测例 <https://github.com/DeathWish5/riscvos-c-tests/tree/main/user/src>`_ ,描述程序出错行为,同时注意注明你使用的 sbi 及其版本。
2. 请结合用例理解 `trampoline.S <https://github.com/DeathWish5/uCore-Tutorial-v2/blob/ch2/os/trampoline.S>`_ 中两个函数 `userret``uservec` 的作用,并回答如下几个问题:
1. L79: 刚进入 `userret` 时,`a0``a1` 分别代表了什么值。
2. L87-L88: `sfence` 指令有何作用?为什么要执行该指令,当前章节中,删掉该指令会导致错误吗?
.. code-block:: assembly
csrw satp, a1
sfence.vma zero, zero
3. L96-L125: 为何注释中说要除去 `a0`?哪一个地址代表 `a0`?现在 `a0` 的值存在何处?
.. code-block:: assembly
# restore all but a0 from TRAPFRAME
ld ra, 40(a0)
ld sp, 48(a0)
ld t5, 272(a0)
ld t6, 280(a0)
4. `userret`:中发生状态切换在哪一条指令?为何执行之后会进入用户态?
5. L29 执行之后a0 和 sscratch 中各是什么值,为什么?
.. code-block:: assembly
csrrw a0, sscratch, a0
6. L32-L61: 从 trapframe 第几项开始保存?为什么?是否从该项开始保存了所有的值,如果不是,为什么?
.. code-block:: assembly
sd ra, 40(a0)
sd sp, 48(a0)
...
sd t5, 272(a0)
sd t6, 280(a0)
7. 进入 S 态是哪一条指令发生的?
8. L75-L76: `ld t0, 16(a0)` 执行之后,`t0`中的值是什么,解释该值的由来?
.. code-block:: assembly
ld t0, 16(a0)
jr t0
3. 请依次简要回答如下问题:
- 程序陷入内核的原因有中断和异常(系统调用),请问 RISC-V 64 支持哪些中断 / 异常?
- 如何判断进入内核是由于中断还是异常?请描述陷入内核时的几个重要寄存器及其值。
- 为了方便 os 处理,M 态软件会将 S 态异常/中断委托给 S 态软件,请指出有哪些寄存器记录了委托信息。
- RustSBI 委托了哪些异常/中断?(提示:看看 RustSBI 在启动时输出了什么?)