HW1: boot xv6
查看寄存器内容和堆栈内容,解释堆栈上的内容。
提示:可以查看boot.S、boot.c和boot.asm中的内容,并结合以下问题。
1.在0x7c00设置断点,单步指令调试,查看堆栈指针$esp在哪里被初始化。
2.单步调试,直到调用bootmain函数,观察堆栈内容。
3.在bootmain函数中第1条汇编指令做了什么。
4.在boot.asm中查找使eip变为0x10000c的指令,观察堆栈的变化。
解析:
1.在调用bootmain函数前,被初始化为0x7c00,即boot.s的入口。
boot.asm mov $start, $esp
0x7c40: mov $0x7c00, $esp
2.在调用bootmain函数时,调用者保存调用地址,即下一条指令,并使$esp-4。
boot.asm
0x7c45: call bootmain
spin:
0x7c4a: jmp spin
3.在bootmain函数中,第1条汇编指令为push $ebp,将$ebp压入堆栈,即保存调用者的栈帧。
boot.asm
0x7d0c: push $ebp
4.当eip变为0x10000c时,bootmain函数将调用地址压入堆栈。