MIT6.828-HW1-boot xv6
重点感谢大佬博客
以下是
info reg
的结果
1 |
|
以下是从
$esp
开始,向上展示24字
1 |
|
如何理解stack里的内容?
- 这个展示
word
的顺序是往右地址在变大 - 一直记住栈是向小的方向增长的
bootblock.asm
里的mov $0x7c00,%esp
,告诉我们栈从0x7c00
开始增长,所以0x7bfc
那一行的第一个数字就是真正在栈里的第一个数- 需要注意到
bootblock.asm
里,有以下代码,所以我们可以知道0x7bfc
那一行的第一个数字表示的是push进去的bootmain返回地址1
2
3
4
5
6
7call bootmain
7c48: e8 f0 00 00 00 call 7d3d <bootmain>
# If bootmain returns (it shouldn't), trigger a Bochs
# breakpoint if running under Bochs, then loop.
movw $0x8a00, %ax # 0x8a00 -> port 0x8a00
7c4d: 66 b8 00 8a mov $0x8a00,%ax - 接下来看
bootmain
函数的部分内容,可以看到在call bootmain
之后便将ebp
push入栈,相关知识见Lab1
的gcc calling convention for JOS
。故我们可以得知,0x7bec
那一行的最右边的数字0表示的是ebp
的值,相关证据如下(我在0x7c43
的地方打了断点,并展示寄存器的值,可以看到在没有call bootmain
之前,ebp
的值就是0,这与JOS
中的entry.S
里的movl $0x0,%ebp # nuke frame pointer
原理应该是类似的吧?我猜的)1
2
3
4
5
6
7
800007d3d <bootmain>:
{
7d3d: 55 push %ebp
7d3e: 89 e5 mov %esp,%ebp
7d40: 57 push %edi
7d41: 56 push %esi
7d42: 53 push %ebx
7d43: 83 ec 10 sub $0x10,%esp1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Thread 1 hit Breakpoint 1, 0x00007c43 in ?? ()
(gdb) info reg
eax 0x0 0
ecx 0x0 0
edx 0x80 128
ebx 0x0 0
esp 0x6f20 0x6f20
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x7c43 0x7c43
eflags 0x6 [ PF ]
cs 0x8 8
ss 0x10 16
ds 0x10 16
es 0x10 16
fs 0x0 0
gs 0x0 0 - 至于
0x7bdc
那一行的第一个数字0x7d87
,原理和7dfc
类似这样这个HW就算是做完了1
2
3
4entry();
7d81: ff 15 18 00 01 00 call *0x10018
}
7d87: 8d 65 f4 lea -0xc(%ebp),%esp
MIT6.828-HW1-boot xv6
http://bugeater.space/2024/01/27/MIT6-828-HW1/