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.

posted @ 2020-12-31 17:35  lsxkugou  阅读(126)  评论(0编辑  收藏  举报