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 也是有可能的。