cugb_cat 发表于 2007-11-29 15:14

问个bochs调试信息的问题

下面这些是bochs的调试命令dump_cpu的输出,意思是显示cpu状态,也就是各寄存器的值,现在针对cs等哪几个段寄存器的显示不太明白,s、dl、dh、valid各表示什么意思?去sf上看了bochs的文档,开发文档中的debugger页竟然没内容,只好来求救了,有知道的给说下啊,不胜感激。
"eax:0x%x\n"
"ebx:0x%x\n"
"ecx:0x%x\n"
"edx:0x%x\n"
"ebp:0x%x\n"
"esi:0x%x\n"
"edi:0x%x\n"
"esp:0x%x\n"
"eflags:0x%x\n"
"eip:0x%x\n"
"cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
"gdtr:base=0x%x, limit=0x%x\n"
"idtr:base=0x%x, limit=0x%x\n"
"dr0:0x%x\n"
"dr1:0x%x\n"
"dr2:0x%x\n"
"dr3:0x%x\n"
"dr4:0x%x\n"
"dr5:0x%x\n"
"dr6:0x%x\n"
"dr7:0x%x\n"
"tr3:0x%x\n"
"tr4:0x%x\n"
"tr5:0x%x\n"
"tr6:0x%x\n"
"tr7:0x%x\n"
"cr0:0x%x\n"
"cr1:0x%x\n"
"cr2:0x%x\n"
"cr3:0x%x\n"
"cr4:0x%x\n"

mik 发表于 2007-11-29 18:13

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

cugb_cat 发表于 2007-11-29 20:46

原帖由 mik 于 2007-11-29 18:13 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
估计相对应是segment register 的: selector、limit、base 、attributes 这几个域
恩,确实是这几个域,我对照反汇编出来的结果仔细的比了一下,确实是

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

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

mik 发表于 2007-11-30 01:29

原帖由 cugb_cat 于 2007-11-29 20:46 发表 http://linux.chinaunix.net/bbs/images/common/back.gif

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 有一些类似的分析,值得看一看

cugb_cat 发表于 2007-11-30 09:12

原帖由 mik 于 2007-11-30 01:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif


不对。
segment limit 是 32 位值。在 descriptor 里是 20 位,当加载进 segment register 时,会自动扩展为 32 位。
这个扩展是根据 descriptor 的 G 位来定,G = 1 时, segment limit = FFFFF (20位li ...
好,我去BSD版看看,晚上回去做实验,谢谢版主了啊。

cugb_cat 发表于 2007-11-30 21:31

原帖由 mik 于 2007-11-30 01:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif


不对。
segment limit 是 32 位值。在 descriptor 里是 20 位,当加载进 segment register 时,会自动扩展为 32 位。
这个扩展是根据 descriptor 的 G 位来定,G = 1 时, segment limit = FFFFF (20位li ...
刚才对照存储段描述符的结构比较了一下,确实如版主所说,dl为描述符的低32位,dh为描述符的高32位,值的对应关系也对,只是那个valid还不知道是干什么的。
页: [1]
查看完整版本: 问个bochs调试信息的问题