在《X86汇编语言从实模式到保护模式》书上318页第三段最后一句:
“唯一没有修改的是0~4GB内存段的描述符,它本身就是为访问整个内存空间而存在的,不需要修改。”
我的问题是为什么不需要修改,开启了分页机制之后不是所有的线性地址都需要现经过分页部件转换后才能得到物理地址吗?
如果是这样的话,那么GDT中的段基地址就是线性地址,也需要经过分页部件。
所以,比如有这样两条指令
mov ebx,0x0008 ;(0~4GB段描述符的选择子是0X0008)
mov ds,ebx
这首先通过选择子,找到0~4GB的段描述符,但是问题是,这里的段描述符中的段基地址正如上面说的那句话,没有把最高位改成1(页目录中的高2GB是映射到内核),
那么自然就是线性地址 0x00000000,经过分页部件,高10为页目录索引是0,中间10位页表索引是0,低10位页表偏移也是0,可是这里对应的不一定是物理地址0x00000000 啊。。。
(因为有一个过程是:load_relocate_program,这里面就是把原来页目录底部的0x0021003清零了,后面还有很多用到0~4GB段描述符的)
希望大家能够解决我这个疑惑。
------------------------------------------------------
下面是我调试的结果:
第一张图是GDT上的内容,我所说的问题是在一号段描述符这里,里面看到线性地址是0x00000000,
下面这张图的是线性地址0x00000000所指向的并没有在页目录和页表上登记,info tab下面可以看到。
这是执行将0~4GB选择子弄进ds后的再一次页目录等表信息。
还可以执行的,但是我上面的分析有什么问题吗。。。实在想不懂,希望大家能帮我解答下