您当前的位置:首页 > 计算机 > 编程开发 > Other

自己动手写一个操作系统——MBR(4)_调试_elf_bin

时间:11-21来源:作者:点击数:

前言

通过 GDB 我们可以跟踪程序的执行,

在这里插入图片描述

并且能够看到寄存器的状态,

在这里插入图片描述

但是,上面这种调试方式,没有和代码对应起来,以致于我们无法直观地知道 CPU 当前执行的是哪条指令。

elf 文件

下面我们就让调试和代码对应起来。

在这之前,我们需要做两件事情

  • 指定代码入口地址(作用于 elf 文件)
  • 添加调试信息(作用于 elf 文件)
指定代码入口地址
ld -Ttext=0x7c00

链接时使用 -Ttext 选项指定代码段的起始地址。

添加调试信息
as -g

汇编时使用 -g 选项,添加调试信息

代码

Makefile

OUTPUT=output

all: clean
	as --32 -g -o ${OUTPUT}/mbr.o mbr.S										# 汇编
	ld -m elf_i386 -Ttext=0x7c00 ${OUTPUT}/mbr.o -o ${OUTPUT}/mbr.elf		# 链接
	objcopy -O binary ${OUTPUT}/mbr.elf ${OUTPUT}/mbr.bin					# elf --> bin
	dd if=${OUTPUT}/mbr.bin of=${OUTPUT}/mbr.img conv=notrunc				# bin --> image

clean:
	-rm ${OUTPUT}/*

run:
	qemu-system-i386 -daemonize -m 128M -drive file=${OUTPUT}/mbr.img,index=0,media=disk,format=raw \
		-s -S

检验

在这里插入图片描述
在这里插入图片描述

调试

在这里插入图片描述

可以看到,这样调试就和代码关联起来了。

  • 在 0x7c00 处打断点时,就会显示断点处对应的代码位置
    (gdb) b *0x7c00
    Breakpoint 1 at 0x7c00: file mbr.S, line 4.
    
  • 执行到断点位置时,也会显示当前的代码
    Breakpoint 1, _start () at mbr.S:4
    4	    jmp _start=
    

小结

其实,指定代码入口地址 和 添加调试信息 对本工程运行没有任何作用,这两个信息只体现在 elf 文件中,这种格式的文件是给操作系统使用的(在本篇文章中是给 gdb 读取符号信息用的,使之能够将调试和代码对应,即使没有 elf 文件,gdb 照样可以调试程序,如前言中的调试方式)。而我们编写的 MBR 是直接给 CPU 运行的,它是一个 bin 文件。关于 elf 和 bin 的区别,我们在后续的文章中单独介绍。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐