MIT6828-HW1-boot xv6

HumanCore - CP/M-17 Version 1.0, Date: January 08, 1996

准备

作业准备请参考文献2和文献3

启动xv6

编译内核

进入xv6-public文件夹后,修改一些脚本的执行权限,然后make一下,即可编译内核。

设置断点调试

使用nm命令在可执行文件kernel中寻找_start地址。执行下列命令,抓取_start关键字,得到如下结果

1
2
3
4
$ nm kernel | grep _start
8010a48c D _binary_entryother_start
8010a460 D _binary_initcode_start
0010000c T _start

在这个内核中,_start地址为0x0010000c。在该位置设置断点,然后继续执行,程序会在此处停下(但是我的gdb不行,不知道是哪里的问题,程序停不下来,会一直执行)。这里总结一下解决方案:

断点不停止BUG解决

更换GDB版本(没用)

下载该课程指定的GDB版本,点击此处下载gdb-7.3.1

安装指定版本的binutils(没用)

下载该课程指定的binutils版本,点击此处下载binutils-2.21.1

更换GCC版本(没用)

下载该课程指定的GCC版本,点击此处下载GCC4.6.4

更换QEMU

下载该课程指定的QEMU版本

1
git clone https://github.com/mit-pdos/6.828-qemu.git qemu
下载最新版本xv6-public(问题已解决)

粗略看了下好像是链接文件出了问题,导致链接后实际物理地址错误,总之前面的都没用,就下载最新的xv6即可。下载地址为:xv6-public

问题

问题1:栈中有什么?

现在我们处在程序执行的开始阶段,我们需要看一下寄存器和栈中的内容,在gdb界面执行如下命令查看寄存器的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(gdb) info reg
eax 0x0 0
ecx 0x0 0
edx 0x663 1635
ebx 0x0 0
esp 0x0 0x0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0xfff0 0xfff0
eflags 0x2 [ IOPL=0 ]
cs 0xf000 61440
ss 0x0 0
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
fs_base 0x0 0
gs_base 0x0 0
k_gs_base 0x0 0
cr0 0x60000010 [ CD NW ET ]
cr2 0x0 0
cr3 0x0 [ PDBR=0 PCID=0 ]
cr4 0x0 [ ]
cr8 0x0 0
efer 0x0 [ ]

kongzhitai我们得到了各个寄存器中的值。然后执行下列命令查看esp寄存器中的内容:

1
2
3
4
5
6
7
(gdb) x/24x $esp
0x0: 0x00000000 0x00000000 0x00000000 0x00000000
0x10: 0x00000000 0x00000000 0x00000000 0x00000000
0x20: 0x00000000 0x00000000 0x00000000 0x00000000
0x30: 0x00000000 0x00000000 0x00000000 0x00000000
0x40: 0x00000000 0x00000000 0x00000000 0x00000000
0x50: 0x00000000 0x00000000 0x00000000 0x00000000

参考文献

0%