HumanCore - CP/M-17 Version 1.0, Date: January 08, 1996
准备
启动xv6
编译内核
进入xv6-public
文件夹后,修改一些脚本的执行权限,然后make一下,即可编译内核。
设置断点调试
使用nm命令在可执行文件kernel中寻找_start地址。执行下列命令,抓取_start关键字,得到如下结果
1 | nm kernel | grep _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 | (gdb) info reg |
kongzhitai我们得到了各个寄存器中的值。然后执行下列命令查看esp寄存器中的内容:
1 | (gdb) x/24x $esp |