Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从逻辑地址到机器地址的错误转换,GDT_Assembly_Linux Kernel_Memory Address - Fatal编程技术网

Assembly 从逻辑地址到机器地址的错误转换,GDT

Assembly 从逻辑地址到机器地址的错误转换,GDT,assembly,linux-kernel,memory-address,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

我正在用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
根据处条目的格式,基址为:
0x730a8d5b
。但是,0x730a8d5b+0xf010002e不是0x0010002e

有人能帮我指出哪里错了吗


提前非常感谢

0008
表示第一段,而不是第八段。 因此,
0x0000ffff 0x10cf9a00
表示段基=0x10000000,因此
0008:0xf010002e
与0x0010002e重叠

编辑:(回答评论)

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


解释指针:,第三卷,第三章

Hi@qwm,为什么0008表示第一段?你能解释一下吗?或者给我一个说明的指针?非常感谢你!也许0008意味着8B的偏移量?那么它指的是GDT的第一个条目?非常感谢@qwm!这真的很有帮助!
0x69757974  0x5d5b706f