免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3275 | 回复: 5
打印 上一主题 下一主题

问个bochs调试信息的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-29 15:14 |只看该作者 |倒序浏览
下面这些是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"
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-11-29 18:13 |只看该作者
估计相对应是segment register 的: selector、limit、base 、attributes 这几个域

论坛徽章:
0
3 [报告]
发表于 2007-11-29 20:46 |只看该作者
原帖由 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具体什么意思还没搞清楚。

论坛徽章:
0
4 [报告]
发表于 2007-11-30 01:29 |只看该作者
原帖由 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 有一些类似的分析,值得看一看

论坛徽章:
0
5 [报告]
发表于 2007-11-30 09:12 |只看该作者
原帖由 mik 于 2007-11-30 01:29 发表


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

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

论坛徽章:
0
6 [报告]
发表于 2007-11-30 21:31 |只看该作者
原帖由 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还不知道是干什么的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP