• ucore-lab1-ex2


    使用 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 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
    

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

    .globl start
    start:
    .code16                                             # Assemble for 16-bit mode
        cli                                             # Disable interrupts
        7c00:	fa                   	cli    
        cld                                             # String operations increment
        7c01:	fc                   	cld    
    
        # Set up the important data segment registers (DS, ES, SS).
        xorw %ax, %ax                                   # Segment number zero
        7c02:	31 c0                	xor    %eax,%eax
        movw %ax, %ds                                   # -> Data Segment
        7c04:	8e d8                	mov    %eax,%ds
        movw %ax, %es                                   # -> Extra Segment
        7c06:	8e c0                	mov    %eax,%es
        movw %ax, %ss                                   # -> Stack Segment
        7c08:	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
    

    上图表示可以成功调试。

  • 相关阅读:
    struts2 类型转化(typeConverter)
    appfuse-maven-plugin(AMP)
    多项式求和,素数判定 HDU2011.2012
    A+B problems
    黑马程序员----java基础笔记中(毕向东)
    2015Web前端攻城之路
    黑马程序员----java基础笔记上(毕向东)
    黑马程序员----2015黑马之路-启程
    乱弹琴20140421
    读Thinking in java 4
  • 原文地址:https://www.cnblogs.com/LuoboLiam/p/13546933.html
Copyright © 2020-2023  润新知