问个bochs调试信息的问题

发布于 2022-09-26 12:13:19 字数 1706 浏览 13 评论 0

下面这些是bochs的调试命令dump_cpu的输出,意思是显示cpu状态,也就是各寄存器的值,现在针对cs等哪几个段寄存器的显示不太明白,s、dl、dh、valid  各表示什么意思?去sf上看了bochs的文档,开发文档中的debugger页竟然没内容,只好来求救了,有知道的给说下啊,不胜感激。

  1. "eax:0x%x\n"
  2. "ebx:0x%x\n"
  3. "ecx:0x%x\n"
  4. "edx:0x%x\n"
  5. "ebp:0x%x\n"
  6. "esi:0x%x\n"
  7. "edi:0x%x\n"
  8. "esp:0x%x\n"
  9. "eflags:0x%x\n"
  10. "eip:0x%x\n"
  11. "cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  12. "ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  13. "ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  14. "es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  15. "fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  16. "gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  17. "ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  18. "tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
  19. "gdtr:base=0x%x, limit=0x%x\n"
  20. "idtr:base=0x%x, limit=0x%x\n"
  21. "dr0:0x%x\n"
  22. "dr1:0x%x\n"
  23. "dr2:0x%x\n"
  24. "dr3:0x%x\n"
  25. "dr4:0x%x\n"
  26. "dr5:0x%x\n"
  27. "dr6:0x%x\n"
  28. "dr7:0x%x\n"
  29. "tr3:0x%x\n"
  30. "tr4:0x%x\n"
  31. "tr5:0x%x\n"
  32. "tr6:0x%x\n"
  33. "tr7:0x%x\n"
  34. "cr0:0x%x\n"
  35. "cr1:0x%x\n"
  36. "cr2:0x%x\n"
  37. "cr3:0x%x\n"
  38. "cr4:0x%x\n"

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

墟烟 2022-10-03 12:13:19

估计相对应是segment register 的: selector、limit、base 、attributes 这几个域

我三岁 2022-10-03 12:13:19

原帖由 mik 于 2007-11-29 18:13 发表
估计相对应是segment register 的: selector、limit、base 、attributes 这几个域

恩,确实是这几个域,我对照反汇编出来的结果仔细的比了一下,确实是

  1. cs:s=0x0010, dl=0x7d5c0049, dh=0x00409800, valid=1

复制代码
s是选择子,dl是段基址和段界限(7d5c是段基址,0049是段界限,不过,基址应该是32位,界限应该是20位才对啊,怎么这儿显示全是16位的?),dh为属性
valid具体什么意思还没搞清楚。

朦胧时间 2022-10-03 12:13:19

原帖由 cugb_cat 于 2007-11-29 20:46 发表

s是选择子,dl是段基址和段界限(7d5c是段基址,0049是段界限,不过,基址应该是32位,界限应该是20位才对啊,怎么这儿显示全是16位的?),dh为属性
valid具体什么意思还没搞清楚。 ...

不对。
segment limit 是 32 位值。在 descriptor 里是 20 位,当加载进 segment register 时,会自动扩展为 32 位。
这个扩展是根据 descriptor 的 G 位来定,G = 1 时, segment limit = FFFFF (20位limit) × FFFF (4K) = FFFFFFFF (总 32 位)

所以: dl 估计是 descriptor lowest ,dh 是 descriptor hight,合成一起是 64 位值。推断这个值是整个 descriptor 值。
valid 是个附加的标志吧。根据这个 64 位值很容易得出 base,limit 及 attributes

为什么这个结构不直接定义为 base,limit 及 attribute, 是 bochs 设计人员的想法了。

是不是这样,做实验吧,BSD 版里 qiuhanty 有一些类似的分析,值得看一看

长亭外,古道边 2022-10-03 12:13:19

原帖由 mik 于 2007-11-30 01:29 发表

不对。
segment limit 是 32 位值。在 descriptor 里是 20 位,当加载进 segment register 时,会自动扩展为 32 位。
这个扩展是根据 descriptor 的 G 位来定,G = 1 时, segment limit = FFFFF (20位li ...

好,我去BSD版看看,晚上回去做实验,谢谢版主了啊。

烟沫凡尘 2022-10-03 12:13:19

原帖由 mik 于 2007-11-30 01:29 发表

不对。
segment limit 是 32 位值。在 descriptor 里是 20 位,当加载进 segment register 时,会自动扩展为 32 位。
这个扩展是根据 descriptor 的 G 位来定,G = 1 时, segment limit = FFFFF (20位li ...

刚才对照存储段描述符的结构比较了一下,确实如版主所说,dl为描述符的低32位,dh为描述符的高32位,值的对应关系也对,只是那个valid还不知道是干什么的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文