lab1 练习2 对bootloader的探索
实验报告 练习2:
实验前的一些探索:
1)对于cpu启动之后做的事情做一个总结:
1.跳转到 FFFFFFF0H到Bios里去
2.Bios自检,并加载bootloader到0x7c00处
3.跳转到0x7c00启动Bootloader,
4.通过Bootloader开启保护模式,初始化操作系统,并跳转到操作系统代码。
这个实验是在第三步 Bootloader。
2)tools/gdbinit
该文件为gdb的脚本,启用gdb的时候会自动启用它,这个文件是待修改的。
file bin/kernel 加载bin/kernel的符号信息 这个实验还没用到 因为只是Bootloader
target remote :1234 通过网络进行远程调试,qemu虚拟化了硬件平台
break kern_init
continue
3)makefile中的debug 当我们输入make debug
时,就会执行makefile里的下列代码段,其中可以看到 去tools/gdbinit
处找debug脚本。
debug: $(UCOREIMG)
$(V)$(QEMU) -S -s -parallel stdio -hda $< -serial null &
$(V)sleep 2
$(V)$(TERMINAL) -e "gdb -q -tui -x tools/gdbinit"
1.从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。
通过改写Makefile文件 ()
debug: $(UCOREIMG)
$(V)$(TERMINAL) -e "$(QEMU) -S -s -d in_asm -D $(BINDIR)/q.log -parallel stdio -hda $< -serial null"
$(V)sleep 2
$(V)$(TERMINAL) -e "gdb -q -tui -x tools/gdbinit"
在调用qemu时增加-d in_asm -D q.log参数
,便可以将运行的汇编指令保存在q.log中。
为防止qemu在gdb连接后立即开始执行,删除了tools/gdbinit中的"continue"行
在调用qemu时增加-d in_asm -D q.log参数,便可以将运行的汇编指令保存在q.log中。
为防止qemu在gdb连接后立即开始执行,删除了tools/gdbinit中的"continue"行。
2.在初始化位置0x7c00设置实地址断点,测试断点正常。
在tools/gdbinit结尾加上
set architecture i8086 //设置当前调试的CPU是8086
b *0x7c00 //在0x7c00处设置断点。此地址是bootloader入口点地址,可看boot/bootasm.S的start地址处
c //continue简称,表示继续执行
x /2i $pc //显示当前指令寄存器(pc寄存器)处的汇编指令 x显示 2i显示两条指令
set architecture i386 //设置当前调试的CPU是80386
运行make debug
,并输入x/10i $pc(
得到接下来的十条指令)便可得到结果:
在boot/bootasm.s里,可以找到这样一段代码
bootloader
.globl start
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
可以看到,与上面gdb代码在同一段位置,且段名称也为bootloader,这就证明了0x7c00是bootloader的第一条指令。在内核执行的时候,确实要跳转到该处执行Bootloader.