使用 qemu 执行并调试 lab1 中的软件
(要求在报告中简要写出练习过程)
从CPU加电后执行的第一条指令开始,单步跟踪 BIOS 的执行
在初始化位置 0x7c00 设置实地址断点,测试断点正常
这里按照指导书附录二一步一步操作即可。
从 0x7c00 开始跟踪代码运行,将单步跟踪反汇编得到的代码与 bootasm.S 和 bootblock.asm 进行比较
这里有个小tip,可能高版本的qemu(4.1.1)不会生成一个新的qemu终端,而是在输入make debug的那个终端上开启qemu;同时在退出gdb的时候要先kill掉调试进程,再quit,否则qemu的VNU server会一直占用port:5900。
在bootasm.S中的部分代码如下:
start:
.code16 # Assemble for 16-bit mode
cli # Disable interrupts
cld # String operations increment
# Set up the important data segment registers (DS, ES, SS).
xorw %ax, %ax # Segment number zero
movw %ax, %ds # -> Data Segment
movw %ax, %es # -> Extra Segment
movw %ax, %ss # -> Stack Segment
在bootblock.asm的部分代码如下:
.globl start
start:
.code16 # Assemble for 16-bit mode
cli # Disable interrupts
7c00: fa cli
cld # String operations increment
7c01: fc cld
# Set up the important data segment registers (DS, ES, SS).
xorw %ax, %ax # Segment number zero
7c02: 31 c0 xor %eax,%eax
movw %ax, %ds # -> Data Segment
7c04: 8e d8 mov %eax,%ds
movw %ax, %es # -> Extra Segment
7c06: 8e c0 mov %eax,%es
movw %ax, %ss # -> Stack Segment
7c08: 8e d0 mov %eax,%ss
而我们得到的反汇编结果如下:
我们发现只有寄存器的不同,例如%ax替换为%eax,而%ax为%eax的低16位,因为我是在ubuntu18.04上进行的实验,所以猜测是在64bit系统上为了向下兼容所出现的改变。
自己找一个 bootloader 或内核中的代码位置,设置断点并进行测试。
gdbinit文件如下:
file bin/kernel
target remote :1234
b serial_init
c
define hook-stop
x/i $pc
end
上图表示可以成功调试。