ucore-lab1-ex2

使用 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

上图表示可以成功调试。

原文地址:https://www.cnblogs.com/LuoboLiam/p/13546933.html