ucore OS lab: bootloader启动ucore (2)

使用qemu执行并调试lab1中的软件

1.从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。

修改lab/tools/gdbint:

define hook-stop
x/i $pc
end

set architecture i8086
target remote :1234

gdbint 中的命令在gdb指定-x参数启动时就会被自动执行,等效于在terminal中手动输入。

gdb 通过本地的1234端口与qemu连接,进行远程调试。CPU一开始加电后是8086实模式,hook-stop 是 GDB 在每次发生断点事件时调用的特殊定义,在这里自定义为显示当前执行的指令和EIP值.

在lab1目录下执行 make debug,进入 gdb 后,就可以通过si命令进行单步跟踪了。

2.在初始化位置0x7c00设置实地址断点,测试断点正常。

0x7c00是 bootloader 的开始地址。修改gdbint如下:

set architecture i8086
target remote :1234

b *0x7c00
c 
x /10i $pc

在 makefile 的debug中已经定义qemu等待gdb连接且不自动启动CPU,continue后才继续工作. 所以设置断点后,要添加一个continue命令才会执行到0x7c00.

执行 make debug, 可观察到:

Breakpoint 1, 0x00007c00 in ?? ()
=> 0x7c00:      cli
   0x7c01:      cld
---Type <return> to continue, or q <return> to quit---
   0x7c02:      xor    %eax,%eax
   0x7c04:      mov    %eax,%ds
   0x7c06:      mov    %eax,%es
   0x7c08:      mov    %eax,%ss
   0x7c0a:      in     $0x64,%al
   0x7c0c:      test   $0x2,%al
   0x7c0e:      jne    0x7c0a
   0x7c10:      mov    $0xd1,%al

3.从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和 bootblock.asm进行比较。

0x7c00开始反汇编得到的代码即bootasm.S和bootblock.asm的start入口处开始的代码。

发表评论