文章目录

  • 前言
  • 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相关推荐

  1. 自己动手写一个操作系统——MBR(2)

    前言 上篇文章<自己动手写一个操作系统--MBR(1)>,我们使用 dd 生成了一个 512 字节的镜像,并用 vim 将其最后两个字节修改成了 55 AA,以此来完成了 MBR 的构建. ...

  2. 自己动手写一个操作系统——MBR(1)

    文章目录 前言 MBR 1) 512 字节镜像 2) 0x55 和 0xAA qemu 运行 参考 前言 上篇<自己动手写一个操作系统--我们能做什么,我们需要做什么>我们介绍到 BIOS ...

  3. 自己动手写一个操作系统——loader(1)

    前言 上篇文章中,我们写了一个简单的 loader 作为被加载的演示对象.我们知道 loader 是用来加载 kernel 的,今天我们就编写 loader 代码完成这件事情. 实模式下的内存地址 我 ...

  4. 自己动手写一个操作系统——我们能做什么,我们需要做什么

    文章目录 计算机启动流程 第一条指令 BIOS MBR loader kernel 总结 计算机启动流程 第一条指令 在开机的一瞬间,也就是上电的一瞬间,CPU 的 CS:IP 寄存器被硬件强制初始化 ...

  5. 写一个操作系统有多难?自制 os 极简教程

    不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了满足程序员们自带的成就感,还是为 ...

  6. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  7. java 同步锁_死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  8. 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合

    自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...

  9. (1)从1开始写一个操作系统

    第一章 前言 偶然间使用到了RTX51-tiny做一些东西,它是keil自带的51操作系统,以小巧占用资源少著称,这里不细谈它是如何实现的,反正是一个真正的基于时间片的多任务系统. 往往我们在使用单片 ...

最新文章

  1. Sass-也许你想和CSS玩耍起来(上篇)
  2. 大四实习有点晚[转载]
  3. 如何让 Hyper-V 和 VMware 虚拟机软件共存?
  4. python3 set_python3.x 基础三:set集合
  5. html5怎么自动生成meta标签,html中meta标签该如何使用
  6. matlab dpsk,2DPSK调制与解调matlab(最新整理)
  7. 云桌面部署_东胜区检察院检察工作网统一业务系统2.0云桌面终端全面部署完成...
  8. 让美团、京东、搜狐都说好的数据仓库,牛在哪?
  9. 标准库举例:sys、copy
  10. 181004有道扇贝每日一句
  11. 1537 学生干部虚基类
  12. 记一次 ORA-600 [12700] 故障案例
  13. Unity粒子特效UI层级问题
  14. YoungTalk-STM32入门100步-通过I/O口点亮LED灯(Proteus仿真电路分析)
  15. 解决:RuntimeError: mat1 and mat2 shapes cannot be multiplied (8x256 and 8x256)维度不匹配问题
  16. Mac系统升级Git
  17. 史上最强HashMap面试教程
  18. 那一夜,上海北京被逼到只能说:卧槽
  19. 酒店市场消费趋势洞察报告
  20. 10 年老程序员教你甩锅必杀技,论【如何优雅的甩锅】

热门文章

  1. ResNet 论文理解含视频
  2. 外呼系统《MRCP协议进行智能外呼》
  3. 狂言50年要拿30个诺奖的日本,如今怎么样了?
  4. java 转换word doc docx 等office文档 为pdf,无需破解 aspose ,无水印
  5. 企业做定制网站建设的必要性
  6. PAT 乙级 1071 小赌怡情 (15分)
  7. Spring事务管理详解
  8. 华硕笔记本系统损坏怎么用U盘重装Win10教学
  9. 搜葫芦(sohulu)网络电视 1.30.05
  10. openframeworks播放mp4,avi的视频格式