zoukankan      html  css  js  c++  java
  • ucore lab1 练习2

    练习2:使用qemu执行并调试lab1中的软件。(要求在报告中简要写出练习过程)

    为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习:

    1. 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。

    2. 在初始化位置0x7c00设置实地址断点,测试断点正常。

    3. 从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和 bootblock.asm进行比较。

    4. 自己找一个bootloader或内核中的代码位置,设置断点并进行测试。

    1. 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行

    在Makefile中增加以下伪目标:

    my-debug: $(UCOREIMG)
    	$(V)$(QEMU) -S -s -parallel stdio -hda $< -serial null &
    	$(V)sleep 2
    	$(V)$(TERMINAL)  -e "gdb -tui -q -x tools/gdbinit"
    

    其中tools/gdbinit文件内容为:

    set architecture i8086
    target remote :1234
    

    my-debug对应如下两条shell命令:

    qemu-system-i386 -S -s -parallel stdio -hda bin/ucore.img -serial null &
    gnome-terminal -e "gdb -tui -q -x tools/gdbinit"
    

    输入make my-debug命令进行调试

    可以看到第一条指令的cs内容为0xf000,eip内容为0xfff0,此时cpu处于实模式,物理地址=cs * 16 + ip,即当前指令地址为0xffff0

    0xffff0处的指令为ljmp $0x3630,$0xf000e05b ,地址0xffff0为BIOS的入口地址,该地址的指令为跳转指令,跳转到0xf000:0xe05b处执行BIOS代码

    正常在8086 16位模式下该处的指令为ljmp $0xf000,$0xe05b ,图上显示的可能是按照32位模式进行解释的,和预想不太一样

    输入si后执行下一条指令,可见此时pc地址跳转到0xf000:0xe05b处,即0xfe05b,从此处开始执行BIOS代码,BIOS程序读取首扇区MBR上的bootloader代码放到0x7c00处,进而cpu控制权交给bootloader进行执行

    2. 在初始化位置0x7c00设置实地址断点,测试断点正常

    输入b *0x7c00在0x7c00处打断点,输入continue运行到断点处

    3. 从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和 bootblock.asm进行比较

    输入x /5i 0x7c00显示0x7c00地址开始的连续5条指令,可见于bootasm.S中的前五条指令是一致的

    4. 自己找一个bootloader或内核中的代码位置,设置断点并进行测试

    ucore lab0 实验准备

  • 相关阅读:
    Python 多核 多线程 调度
    mysql-select for update
    Python logging模块
    TCP/IP和HTTP协议与Socket的区别联系
    DNS+CDN
    wget命令
    Cannot find module 'webpack-cli/bin/config-yargs
    TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'
    js 创建私有变量
    报错集锦及解决方案
  • 原文地址:https://www.cnblogs.com/whileskies/p/13321459.html
Copyright © 2011-2022 走看看