当前位置: 代码迷 >> 汇编语言 >> 高手们初学者问个有关问题进入保护模式的地址
  详细解决方案

高手们初学者问个有关问题进入保护模式的地址

热度:9730   发布时间:2013-02-26 00:00:00.0
高手们菜鸟问个问题进入保护模式的地址
jmp dword SelectorCode32:0 到底是什么? 
可以先看看这条语句在 bochs 中反汇编出来的东西 

jmp far 0008:00000000

如果再调试,可以看看下面的步骤 

(0) [0x00007c74] 0000:00007c74 (unk. ctxt): jmp far 0008:00000000 ; 66ea000000000800
<bochs:36> n
(0) [0x00007c7c] 0008:00000000 (unk. ctxt): mov ax, 0x0010 ; 66b81000
<bochs:37> n
(0) [0x00007c80] 0008:00000004 (unk. ctxt): mov gs, ax ; 8ee8
<bochs:38> n
(0) [0x00007c82] 0008:00000006 (unk. ctxt): mov edi, 0x0000077e ; bf7e070000
<bochs:39> n
(0) [0x00007c87] 0008:0000000b (unk. ctxt): mov ah, 0x0c ; b40c
<bochs:40> n
(0) [0x00007c89] 0008:0000000d (unk. ctxt): mov al, 0x50 ; b050
<bochs:41> n
(0) [0x00007c8b] 0008:0000000f (unk. ctxt): mov word ptr gs:[edi], ax ; 65668907
<bochs:42> n
(0) [0x00007c8f] 0008:00000013 (unk. ctxt): jmp .-5 (0x00007c8f) ; e9fbffffff
<bochs:43> n
(0) [0x00007c8f] 0008:00000013 (unk. ctxt): jmp .-5 (0x00007c8f) ; e9fbffffff

可以看到最后它开始循环了。但要注意的是下面地址的变化 

(0) [0x00007c74] 0000:00007c74 jmp far 0008:00000000
它执行之后下一条执行的是:
(0) [0x00007c7c] 0008:00000000 mov ax, 0x0010

任何时候 [] 中的地址就是我们实际的ip或者eip。再看后面的地址,可以看到在 jmp 之前是 0000:00007c74,跳转掉之后就成了 0008:00000000,但实际上我们的 eip 还是得到了需要的地址:0x00007c7c。 

这段是网上的我的问题是
如果基地址是0 为什么jmp far 0008:000000后 物理地址是0x00007c7c 而不是0x00000000

------解决方案--------------------------------------------------------
很多同学仅仅是通过看别人的代码学会了如何进入保护模式,却没能深入底层,了解保护模式的机制。

jmp far 0008:00000000这条指令,位于物理地址7c74,这个是没有错的。它仅仅是转移到下一条指令,面下一条指令的物理地址是7c7c,这个也是正确无误的。

问题就在于,清空流水线,并串行化处理器后,就进入了保护模式,这时,bochs显示的段地址仅仅是段选择子0008,而真正的32位段基地址位于段高速缓存中,显示不出来的。你拿0008来加上偏移地址,当然和7c7c差异很大。但如果你能取得段基地址的值,那它一定是7c7c。因为,你的程序为保护模式下的代码定义了一个段,它的段基地址就位于jmp far指令之后。
------解决方案--------------------------------------------------------
这个代码似曾相识。

貌似基地址也是0

0008应该是第3个描述符,但第三个是显存首地址,也不对。

代码不全。

建议看杨季文的书,或赵炯的linux剖析。
------解决方案--------------------------------------------------------
0008应该是第3个描述符,但第三个是显存首地址,也不对。
========================

楼上两位,说的是啥?和楼主的问题有关吗?严重建议不能得分!

0008就第三个描述符?没搞错吧?
0000_0000_0000_1000---最低三位分别是特权级和GDT/LDT。
------解决方案--------------------------------------------------------
1、如果基地址是0 为什么jmp far 0008:000000后 物理地址是0x00007c7c 而不是0x00000000

反正基地址是0 偏移也是0 进入保护模式怎么地址不是零

这个描述符的基地址0x00000000是逻辑地址的基地址,而0x00007c7c是物理地址。

2、0008就第三个描述符?没搞错吧?

糊涂了,谢谢指正。