当前位置: 代码迷 >> 综合 >> ucore-lab1-ex2
  详细解决方案

ucore-lab1-ex2

热度:15   发布时间:2023-12-15 07:10:31.0

使用 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 modecli                                             # Disable interruptscld                                             # String operations increment# Set up the important data segment registers (DS, ES, SS).xorw %ax, %ax                                   # Segment number zeromovw %ax, %ds                                   # -> Data Segmentmovw %ax, %es                                   # -> Extra Segmentmovw %ax, %ss                                   # -> Stack Segment

在bootblock.asm的部分代码如下:

.globl start
start:
.code16                                             # Assemble for 16-bit modecli                                             # Disable interrupts7c00:	fa                   	cli    cld                                             # String operations increment7c01:	fc                   	cld    # Set up the important data segment registers (DS, ES, SS).xorw %ax, %ax                                   # Segment number zero7c02:	31 c0                	xor    %eax,%eaxmovw %ax, %ds                                   # -> Data Segment7c04:	8e d8                	mov    %eax,%dsmovw %ax, %es                                   # -> Extra Segment7c06:	8e c0                	mov    %eax,%esmovw %ax, %ss                                   # -> Stack Segment7c08:	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

上图表示可以成功调试。