自己动手写一个操作系统——MBR(4)_调试_elf_bin
文章目录
- 前言
- elf 文件
- 指定代码入口地址
- 添加调试信息
- 代码
- 检验
- 调试
- 小结
前言
通过 GDB 我们可以跟踪程序的执行,
并且能够看到寄存器的状态,
但是,上面这种调试方式,没有和代码对应起来,以致于我们无法直观地知道 CPU 当前执行的是哪条指令。
elf 文件
下面我们就让调试和代码对应起来。
在这之前,我们需要做两件事情
- 指定代码入口地址(作用于 elf 文件)
- 添加调试信息(作用于 elf 文件)
指定代码入口地址
ld -Ttext=0x7c00
链接时使用 -Ttext 选项指定代码段的起始地址。
添加调试信息
as -g
汇编时使用 -g 选项,添加调试信息
代码
Makefile
OUTPUT=outputall: cleanas --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 --> bindd if=${OUTPUT}/mbr.bin of=${OUTPUT}/mbr.img conv=notrunc # bin --> imageclean:-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 的区别,我们在后续的文章中单独介绍。
自己动手写一个操作系统——MBR(4)_调试_elf_bin相关推荐
- 自己动手写一个操作系统——MBR(2)
前言 上篇文章<自己动手写一个操作系统--MBR(1)>,我们使用 dd 生成了一个 512 字节的镜像,并用 vim 将其最后两个字节修改成了 55 AA,以此来完成了 MBR 的构建. ...
- 自己动手写一个操作系统——MBR(1)
文章目录 前言 MBR 1) 512 字节镜像 2) 0x55 和 0xAA qemu 运行 参考 前言 上篇<自己动手写一个操作系统--我们能做什么,我们需要做什么>我们介绍到 BIOS ...
- 自己动手写一个操作系统——loader(1)
前言 上篇文章中,我们写了一个简单的 loader 作为被加载的演示对象.我们知道 loader 是用来加载 kernel 的,今天我们就编写 loader 代码完成这件事情. 实模式下的内存地址 我 ...
- 自己动手写一个操作系统——我们能做什么,我们需要做什么
文章目录 计算机启动流程 第一条指令 BIOS MBR loader kernel 总结 计算机启动流程 第一条指令 在开机的一瞬间,也就是上电的一瞬间,CPU 的 CS:IP 寄存器被硬件强制初始化 ...
- 写一个操作系统有多难?自制 os 极简教程
不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了满足程序员们自带的成就感,还是为 ...
- java 手编线程池_死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- java 同步锁_死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合
自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...
- (1)从1开始写一个操作系统
第一章 前言 偶然间使用到了RTX51-tiny做一些东西,它是keil自带的51操作系统,以小巧占用资源少著称,这里不细谈它是如何实现的,反正是一个真正的基于时间片的多任务系统. 往往我们在使用单片 ...
最新文章
- Sass-也许你想和CSS玩耍起来(上篇)
- 大四实习有点晚[转载]
- 如何让 Hyper-V 和 VMware 虚拟机软件共存?
- python3 set_python3.x 基础三:set集合
- html5怎么自动生成meta标签,html中meta标签该如何使用
- matlab dpsk,2DPSK调制与解调matlab(最新整理)
- 云桌面部署_东胜区检察院检察工作网统一业务系统2.0云桌面终端全面部署完成...
- 让美团、京东、搜狐都说好的数据仓库,牛在哪?
- 标准库举例:sys、copy
- 181004有道扇贝每日一句
- 1537 学生干部虚基类
- 记一次 ORA-600 [12700] 故障案例
- Unity粒子特效UI层级问题
- YoungTalk-STM32入门100步-通过I/O口点亮LED灯(Proteus仿真电路分析)
- 解决:RuntimeError: mat1 and mat2 shapes cannot be multiplied (8x256 and 8x256)维度不匹配问题
- Mac系统升级Git
- 史上最强HashMap面试教程
- 那一夜,上海北京被逼到只能说:卧槽
- 酒店市场消费趋势洞察报告
- 10 年老程序员教你甩锅必杀技,论【如何优雅的甩锅】