002_qemu+gdb调试系统

设置断点

数据断点

b *0x7c00

查看寄存器

查看单个

p $ax

查看所有

i r

查看内存

x/nfu addr
n 表示数量
f 表示格式 x(hex),d(decimal),c(char)
u 表示显示单位,b(byte), h(halfword),w(word),g(giant,8byte)
(gdb) x/8xb 0x7c00

反汇编

disas 0x7c00, +10  ;这个是AT&T语法
set disassembly-flavor intel   ;这样设置为intel格式
反汇编下一条要执行的指令
set disassemble-next-line on

执行下一条指令

si

退出

q

实际执行

编译hello world镜像

代码如下

org 07c00h

mov ax,cs

mov ds,ax

mov es,ax

call Disp

jmp $

Disp:

    mov ax,BootMsg

    mov bp,ax

    mov cx,16

    mov ax,01301h

    mov bx,000ch

    mov dl,0

    int 10h

BootMsg: db "Hello, OS World!"

times 510 - ($-$$) db 0

dw 0xaa55

使用dd命令创建一个虚拟磁盘文件,大小是4M
Pasted image 20230603152855
使用nasm将hello.asm编译为二进制文件
Pasted image 20230603153044
将这个二进制文件装入刚才创建的虚拟硬盘中
Pasted image 20230603153220

运行qemu

在windows终端中键入
qemu-system-i386 boot.img
Pasted image 20230603155534
Pasted image 20230603155636

gdb调试运行qemu

这是正常启动的状态,下面使用gbd调试来启动
加两个参数

-S   表示在cpu启动时就冻结其状态
-s   表示能通过端口1234远程访问该gdb

Pasted image 20230603160448
启动后虚拟机上显示的是还没有初始化显示

在windows上再开一个cmd窗口通过ipconfig命令查看ip地址
Pasted image 20230603162829

然后,到linux上输入gdb命令打开gdb,通过target remote 目标主机IP:端口 的格式远程连接windows上开启的gdb调试
Pasted image 20230603162943

接下来,就使用前面所讲gdb的命令进行执行

  1. 设置断点到0x7c00,并按c让它继续执行到断点位置停止
    Pasted image 20230603163845
    可以看到qemu上显示已经从硬盘中启动,证明他发现了硬盘中第一个扇区是以55aa结束的
    最后再执行一下c,就到了之前没有设置断点调试的状态了
    Pasted image 20230603170023
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值