3434
3535``` json
3636{
37- "llvm-target" : " x86_64-unknown-none" ,
38- "data-layout" : " e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" ,
39- "arch" : " x86_64" ,
40- "target-endian" : " little" ,
41- "target-pointer-width" : " 64" ,
42- "target-c-int-width" : " 32" ,
43- "os" : " none" ,
44- "executables" : true ,
45- "linker-flavor" : " ld.lld" ,
46- "linker" : " rust-lld" ,
47- "panic-strategy" : " abort" ,
48- "disable-redzone" : true ,
49- "features" : " -mmx,-sse,+soft-float" ,
50- "rustc-abi" : " x86-softfloat" ,
51- "pre-link-args" : {
52- "ld.lld" : [" -Tcrates/kernel/config/kernel.ld" , " -export-dynamic" ]
53- }
37+ "llvm-target" : " x86_64-unknown-none" ,
38+ "data-layout" : " e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" ,
39+ "arch" : " x86_64" ,
40+ "target-endian" : " little" ,
41+ "target-pointer-width" : " 64" ,
42+ "target-c-int-width" : " 32" ,
43+ "os" : " none" ,
44+ "executables" : true ,
45+ "linker-flavor" : " ld.lld" ,
46+ "linker" : " rust-lld" ,
47+ "panic-strategy" : " abort" ,
48+ "disable-redzone" : true ,
49+ "features" : " -mmx,-sse,+soft-float" ,
50+ "rustc-abi" : " x86-softfloat" ,
51+ "pre-link-args" : {
52+ "ld.lld" : [" -Tcrates/kernel/config/kernel.ld" , " -export-dynamic" ]
53+ }
5454}
5555```
5656
@@ -187,14 +187,14 @@ unsafe {
187187
188188 !!! note "使用 ` .gdbinit ` 方便你的调试过程"
189189
190- 以下是一个 `.gdbinit` 的例子,你可以将其放置在你的工作目录下,这样每次进入 GDB 调试环境时,它都会自动加载。请注意部分指令是 `gef` 所提供的,详情请见调试文档。
190+ 以下是一个 `.gdbinit` 的例子,你可以将其放置在你的工作目录下,这样每次进入 GDB 调试环境时,它都会自动加载。请注意部分指令是 `gef` 所提供的,详情请见调试文档。
191191
192- ```bash
193- file esp/KERNEL.ELF
194- gef-remote localhost 1234
195- tmux-setup
196- b ysos_kernel::init
197- ```
192+ ```bash
193+ file esp/KERNEL.ELF
194+ gef-remote localhost 1234
195+ tmux-setup
196+ b ysos_kernel::init
197+ ```
198198
199199- 使用 ` c ` 命令继续执行,你将会看到 QEMU 窗口中的输出,同时 GDB 将会在断点处停下。
200200- 查看断点处的汇编和符号是否正确,使用 ` vmmap ` 和 ` readelf ` 等指令查看内核的加载情况。
@@ -514,7 +514,6 @@ println!("{}", record.args());
5145143 . 串口驱动是在进入内核后启用的,那么在进入内核之前,显示的内容是如何输出的?
515515
5165164 . 在 QEMU 中,我们通过指定 ` -nographic ` 参数来禁用图形界面,这样 QEMU 会默认将串口输出重定向到主机的标准输出。
517-
518517 - 假如我们将 ` Makefile ` 中取消该选项,QEMU 的输出窗口会发生什么变化?请观察指令 ` make run QEMU_OUTPUT= ` 的输出,结合截图分析对应现象。
519518 - 在移除 ` -nographic ` 的情况下,如何依然将串口重定向到主机的标准输入输出?请尝试自行构造命令行参数,并查阅 QEMU 的文档,进行实验。
520519 - 如果你使用 ` ysos.py ` 来启动 qemu,可以尝试修改 ` -o ` 选项来实现上述功能。
@@ -534,7 +533,6 @@ println!("{}", record.args());
5345333 . 🤔 尝试添加字符串型启动配置变量 ` log_level ` ,并修改 ` logger ` 的初始化函数,使得内核能够根据启动参数进行日志输出。
535534
5365354 . 🤔 尝试使用调试器,在内核初始化之后(` ysos::init ` 调用结束后)下断点,查看、记录并解释如下的信息:
537-
538536 - 内核的栈指针、栈帧指针、指令指针等寄存器的值。
539537 - 内核的代码段、数据段、BSS 段等在内存中的位置。
540538
0 commit comments