chapter1 练习
====================

本节难度:**低**

本节任务
--------------------

.. attention::

    注意 ch1 并不对应一次 lab 提交,本节任务在 ch3 最终提交。

- 运行 ch1 分支的代码。
- 结合实验指导书,掌握代码的基本结构。
- 自学 ``.ld`` ``makefile`` 两个格式文件的基本使用方法。能够基本读懂 ``os/kernel.ld (C)`` ``os/linker.ld (Rust)`` 和 Makefile。
- 运行 ``make debug``, 自学 gdb 调试的方法,完成问答作业(lab1 报告要求)。

编程作业
--------------------

无

.. _ch1问答作业:

问答作业
--------------------

1. 请学习 gdb 调试工具的使用 (这对后续调试可能会很重要),并通过 gdb 简单跟踪从机器加电到跳转到 0x80200000 的简单过程。只需要描述重要的跳转即可,只需要描述在 qemu 上的情况。

.. hint::

    - 事实上进入 rustsbi 之后就不需要使用 gdb 调试了。可以直接阅读代码。 `rustsbi起始代码 <https://github.com/rustsbi/rustsbi-qemu/blob/7d71bfb7b3ad8e36f06f92c2ffe2066bbb0f9254/rustsbi-qemu/src/main.rs#L56>`_ 。
    - 可以使用示例代码 Makefile 中的 ``make debug`` 指令。
    - 一些可能用到的 gdb 指令:
        - ``x/10i 0x80000000`` : 显示 0x80000000 处的10条汇编指令。
        - ``x/10i $pc`` : 显示即将执行的10条汇编指令。
        - ``x/10xw 0x80000000`` : 显示 0x80000000 处的10条数据,格式为16进制32bit。
        - ``info register``: 显示当前所有寄存器信息。
        - ``info r t0``: 显示 t0 寄存器的值。
        - ``break funcname``: 在目标函数第一条指令处设置断点。
        - ``break *0x80200000``: 在 0x80200000 出设置断点。
        - ``continue``: 执行直到碰到断点。
        - ``si``: 单步执行一条汇编指令。
    - 事实上在整个实验中,gdb 的使用次数可能因人而异。如果每次实验都想清楚且运气好,用不到 gdb 也是有可能的。