homework1:boot xv6
Homework 1
-
首先在启动块(bootasm.S)的起始位置0x7c00处设置一个断点。单步执行说明(在gdb提示符下键入si)。在bootasm.S中的哪个地方初始化了堆栈指针?
bootasm.S 在
movl $start, %esp
处设置了堆栈指针,将栈顶指向了0x7c00
。 -
单步执行对bootmain的调用;现在堆栈上有什么?
call bootmain
位于物理地址0x7c48
,调用 bootmian 后,栈内有如下内容:
其中栈顶 0x7bfc
处存放的是 call bootmian
的返回地址,即该指令的下一条指令。
栈底0x7c00
存放的是
-
bootmain的第一条汇编指令对堆栈有什么作用?在bootblock.asm中查找bootmain。
bootmian 的第一条指令是
push %ebp
,用于保存 bootmian 的调用者的基址。 -
继续通过gdb进行跟踪(必要时使用断点,请参见下面的提示),并查找将eip更改为0x10000c的调用。该调用对堆栈有什么作用? (提示:请考虑一下此调用在引导序列中要完成的工作,并尝试在bootmain.c中标识此点,并在bootblock.asm中的bootmain代码中标识相应的指令。这可能有助于您设置合适的断点来加快速度上。)
在 bootlock.asm 上找到了
entry = (void(*)(void))(elf->entry);
对应的地址为0x7dae
,在该点设置断点,然后单步调试,查看 sp 寄存其的变化。该调用将
0x7db4
(调用指令的下一条指令地址)放入了栈顶。
参考