从逻辑地址到机器地址,GDT的转换不正确

时间:2014-01-17 02:32:51

标签: assembly linux-kernel memory-address

我正在使用bochs来调试MIT的JOS。我对bochs输出的地址感到困惑:

(0) [0x0010002e] 0008:0xf010002e (unk. ctxt): mov ebp, 0x00000000       ; bd00000000

我想弄清0008:0xf010002e如何转移到[0x0010002e]

基于逻辑地址的转移。到线性地址,我想我应该使用GDT第8个条目的基地址加上偏移量0xf010002e

但是,我得到了GDT的内容如下:

<bochs:6> x /16wx 0x0010f000
[bochs]:
0x0010f000 <bogus+       0>:    0x00000000  0x00000000  0x0000ffff  0x10cf9a00
0x0010f010 <bogus+      16>:    0x0000ffff  0x10cf9300  0xf0000017  0x00000010
0x0010f020 <bogus+      32>:    0x32311b00  0x36353433  0x30393837  0x09083d2d
0x0010f030 <bogus+      48>:    0x72657771  0x69757974  0x5d5b706f  0x7361000a

第8个条目是:

0x69757974  0x5d5b706f  

根据Fig 5-3的条目格式,基地址为:0x730a8d5b。但是,0x730a8d5b + 0xf010002e不是0x0010002e!

任何人都可以帮我指出我错在哪里吗?

提前非常感谢你!

1 个答案:

答案 0 :(得分:1)

0008表示第一段,而不是第8段。 因此,0x0000ffff 0x10cf9a00表示段base = 0x10000000,因此0008:0xf010002e重叠到0x0010002e。

修改 :(回答评论)

段选择器的最低位0和1用作权限级别(环)选择器,位2 - 在GDT和LDT之间选择,所有其他位用作相关描述符表的偏移量。因此,0x00080x000b表示GDT中的0x0008偏移,权限级别为0..3

解释指针:Intel Software Developer Manual,第3卷,第3章