zoukankan      html  css  js  c++  java
  • 《ucore lab1 exercise2》实验报告

    资源

    1. ucore在线实验指导书
    2. 我的ucore实验代码

    题目:使用qemu执行并调试lab1中的软件

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

    1. 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。
    2. 在初始化位置0x7c00设置实地址断点,测试断点正常。
    3. 从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和bootblock.asm进行比较。
    4. 自己找一个bootloader或内核中的代码位置,设置断点并进行测试

    解答

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

    1. tools/gdbinit的内容如下。可见,这里是对内核代码进行调试,并且将断点设置在内核代码的入口地址,即kern_init函数
    file bin/kernel
    target remote :1234
    break kern_init
    continue
    
    1. 为了从CPU加电后执行的第一条指令开始调试,需要修改tools/gdbinit的内容为:
    set architecture i8086
    file bin/bootblock
    target remote :1234
    break start
    continue
    
    1. 执行make debug,这时会弹出一个QEMU窗口和一个Terminal窗口,这是正常的,因为我们在makefile中定义了debug的操作正是启动QEMU、启动Terminal并在其中运行gdb。
    debug: $(UCOREIMG)
    	$(V)$(QEMU) -S -s -parallel stdio -hda $< -serial null &
    	$(V)sleep 2
    	$(V)$(TERMINAL) -e "gdb -q -tui -x tools/gdbinit"
    
    1. Terminal窗口此时停在0x0000fff0的位置,这是eip寄存器的值,而cs寄存器的值为0xf000. (遇到一个问题:此时无法正确反汇编出代码,使用x来查询内存0xfff0处的值时显示全0,不知道什么原因)
    The target architecture is assumed to be i8086
    0x0000fff0 in ?? ()
    Breakpoint 1 at 0x7c00: file boot/bootasm.S, line 16.
    
    1. 输入si,执行1步,程序会跳转到0xe05b的地方。查看寄存器也可以发现eip的值变为0xe05b,而cs的值不变,仍然是0xf000.

    2. 反复输入si,以单步执行。(由于BIOS中全是汇编代码,看不懂其功能)。

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

    1. 我直接在tools/gdbinit中设置了断点break start,由于boot loader的入口为start,其地址为0x7c00,因此这和break *0x7c00效果是相同的。

    2. 设置断点后,输入continue或c,可以看到程序在0x7c00处停了下来,说明断点设置成功。

    问题3:从0x7c00开始, 将反汇编代码与bootasm.S和bootblock.asm进行比较

    1. 反汇编的代码与bootblock.asm基本相同,而与bootasm.S的差别在于:
      • 反汇编的代码中的指令不带指示长度的后缀,而bootasm.S的指令则有。比如,反汇编 的代码是xor %eax, %eax,而bootasm.S的代码为xorw %ax, %ax
      • 反汇编的代码中的通用寄存器是32位(带有e前缀),而bootasm.S的代码中的通用寄存器是16位(不带e前缀)。

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

    这个比较简单,不作记录。

  • 相关阅读:
    myisamchk命令修复表操作
    CentOS下的yum upgrade和yum update区别
    CentOS 6.9/7通过yum安装指定版本的MySQL
    Linux下Shell去除空行的方法
    Linux下环境变量设置技巧
    交互设计师如何做运营需求-以网易严选邀请新人功能设计为例
    对应用启动时间的关注和获取
    快速发现并解决maven依赖传递冲突
    mock测试方法及实践改进
    网易杭研易盾实习心得(4)
  • 原文地址:https://www.cnblogs.com/wuhualong/p/ucore_lab1_exercise2_report.html
Copyright © 2011-2022 走看看