当前位置: 首页 > news >正文

bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)

我在阅读 Linux0.11 源码时,对一个指令 LDS 感到困惑。

看了下 intel 指令集手册,能猜到 LDS 的功能,但不确定。

于是决定搭建调试环境,看看 LDS 的功能是否真如自己猜测。

首先 make debug 运行 qemu-Linux0.11,命令如下:
在这里插入图片描述

使用 gdb 连接,给 0x7c00 打断点,可以看到汇编指令如图
在这里插入图片描述
跟我们自己看到的 bootsect.s 的汇编指令差别也太大了
在这里插入图片描述

为了验证被加载在程序 0x7c00 的汇编指令到底是不是 bootsect.s 的代码,我决定使用 xxd 看二进制文件的内容

首先根据运行 qemu-Linux0.11 的命令来看,可知它加载了软盘 Image
在这里插入图片描述
xxd Image, 可见第一个 512 字节末尾是 55AA,这确实是启动扇区
在这里插入图片描述
再次运行 gdb-qemu-Linux0.11,使用 x/256x 0x7c00 查看位于 0x7c00 的内存内容,如下
在这里插入图片描述
由于大小端问题,内存内容的排序看起来和 xxd 有点不同,但实际上是一样的。看来 Image 第一个扇区的内容确实被加载到了 0x7c00

阅读 Makefile,发现 Image 的第一个扇区确实是由 bootsect.s 编译出的 bootsect 二进制文件构成的,使用 xxd 查看 bootsect,如下图

在这里插入图片描述

几乎一致,可以确定 bootsect.s 的内容确实被加载到了 0x7c00,那么问题应该出在 gdb 的反汇编上

STFW,在谷歌查到下面这个网页
https://stackoverflow.com/questions/32955887/how-to-disassemble-16-bit-x86-boot-sector-code-in-gdb-with-x-i-pc-it-gets-tr

根据高赞回答,在调试一般的 16 位汇编时,只需要使用 set architecture i8086 命令即可(存疑,已证明不行)

但是 qemu-system-i386 是属于实模式,它会使用段寄存器来进行寻址,gdb 对于这种段寄存器寻址的机制并没有很好的支持,因此在运行 gdb 之前需要先加载一串超长的 gdb.init 脚本

首先使用 wget https://ternet.fr/media/gdb_init_real_mode.txt 下载这个脚本文件,已证明不行

试过了,发现不行。

==============================================

根据前面的探索,使用 qemu+gdb 对 x86 实模式调试非常艰难,我认为我们应该使用 bochs 进行实模式的调试

TODO:here

http://www.lryc.cn/news/188277.html

相关文章:

  • 一文告知HTTP GET是否可以有请求体
  • 防止SQL注入攻击的综合解决方案
  • MapReduce(林子雨慕课课程)
  • PHP聊天系统源码 在线聊天系统网站源码 后台自适应PC与移动端
  • 算法题:买卖股票的最佳时机 II (贪心算法解决股票问题)
  • Redis-持久化机制
  • 【LeetCode热题100】--155.最小栈
  • Allegro 17.2如何直接更新元件封装?
  • 高效数据管理:Java助力实现Excel数据验证
  • Easysearch Chart 0.2.0都有哪些变化
  • RV1126-RV1109-进入uboot的按键和名字显示-HOSTNAME
  • 学习vue-router
  • Python爬虫提高排名
  • SQL获取正数第N个或倒数第N个数据
  • 链表(2)——带头双向循环链表
  • C语言 函数指针
  • F. Vasilije Loves Number Theory
  • electron打包后主进程下载文件崩溃
  • Spring实例化源码解析之Custom Events下集(九)
  • python numpy库关键函数说明
  • 【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)
  • IP协议总结
  • 微信支付v2
  • tcpdump(二)命令行参数讲解(一)
  • 10_8C++
  • JVM篇---第七篇
  • 更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法
  • winform窗体控件太多显示不过来,怎么实现滚动条
  • WebSocket连接异常 Error parsing HTTP request header Connection reset by peer
  • Spring中shutdown hook作用