安康创宇网站制作建设软件制作平台免费
web/
2025/9/27 19:21:40/
文章来源:
安康创宇网站制作建设,软件制作平台免费,北京公司网站建设价格,胶州城乡建设局网站我在阅读 Linux0.11 源码时#xff0c;对一个指令 LDS 感到困惑。
看了下 intel 指令集手册#xff0c;能猜到 LDS 的功能#xff0c;但不确定。
于是决定搭建调试环境#xff0c;看看 LDS 的功能是否真如自己猜测。
首先 make debug 运行 qemu-Linux0.11#xff0c;命…我在阅读 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 下载这个脚本文件已证明不行
试过了发现不行。 根据前面的探索使用 qemugdb 对 x86 实模式调试非常艰难我认为我们应该使用 bochs 进行实模式的调试
TODOhere
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82930.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!