LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1559|回复: 13

保护模式下,EIP寄存器存放的是线性地址还是物理地址(分页已开启)

[复制链接]
发表于 2005-5-1 10:09:37 | 显示全部楼层 |阅读模式
如题,
如果是线性地址,则用EIP内的地址取得指令时,该地址还需要通过分页机制的映射,才能找到
真正的物理地址,从而获得指令。

我想应该时线性地址!

不知道我的想法对不对,请各位指点一下,谢谢!
发表于 2005-5-1 15:03:46 | 显示全部楼层
线性
保护模式下,只有在需要在内存读写的时候才有地址转换,而且基本都是硬件在内核的协助下来完成这个过程
内核的协助有两个主要方面:maintain page table, maintain TLB cache
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-2 10:50:08 | 显示全部楼层
还是不太明白,请各位高手指点;

EIP存放的是下一条指令的地址,如果不考虑预取等一些优化手段,即控制器(CU)直接从内存中通过此地址来获得下一条指令的话,那么,CU具体是如何通过这个地址来获得指令内容的?

我不明白的地方就在于,这个地址如果是线性地址,则CU在取指时仍然需要通过页式转换,才能获得物理地址,从而取得指令,我想,这也是符合分页思想的。

反之,如果在EIP中的就是物理地址,那么根据EIP的连续取指特性(就是只要没有跳转,就一直往下连续取指),就会产生与分页机制矛盾的地方,比如说,程序是放在不连续的分页上的,而EIP取指却是物理上连续的内存中,这显然会出问题。

希望各位高手指点,谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-5-2 22:52:59 | 显示全部楼层
去看Understanding the Linux Kernel第二章
要了解这种东西还是要看书
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 09:45:44 | 显示全部楼层
谢谢zhllg的建议;
同时,我也复习了一下ia32手册,又有了一些新的认识,不知道对不对,希望各位给予指点,谢谢!

EIP寄存器中存放的相对地址(offset),也就是基于基址的偏移值。假设没有其他优化的设施下,在32位保护模式下,x86 cpu取得指令的过程可以理解为:
1. 找到cs寄存器对应的段描述符,取得其中存放的基址(这个基址也是线性地址)
2.把取得的这个基址+EIP存放的偏移值,就得到了一个完整的线性地址,到此为止,完成了段式映射
3.如果此时没有开启页式映射,这个完整的线性地址就作为物理地址放入总线并获得指令;
  如果开启了页式映射,则这个线性地址还要通过目录表,页表映射,获得真实的物理地址。

我仍然有疑虑的地方是:EIP存放偏移,是段式映射是加到基地址上的,还是通过页式映射找到基地址后才加上的。
回复 支持 反对

使用道具 举报

发表于 2005-5-3 20:31:40 | 显示全部楼层
段式映射
回复 支持 反对

使用道具 举报

发表于 2005-5-4 00:03:49 | 显示全部楼层
Post by love-centry
段式映射

definitely
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-4 09:39:24 | 显示全部楼层
谢谢各位指点;

看了一下Understanding the Linux Kernel有关章节,这个问题的答案目前可以比较肯定了,虽然在书中也没有明示。现总结如下,请各位指正,谢谢!

以下总结的前提是:
x86 cpu 32位保护模式下,页式映射已经开启。

一.
地址映射是为了更灵活有效地使用内存资源。

二.
从编程的角度看,所谓的地址就是程序的逻辑地址;而从cpu角度看,段式映射后的地址就是线性地址,页式映射后的地址就是物理地址。所谓地址映射,对cpu来说,也就是从逻辑地址->线性地址->物理地址的过程。

三.
从指令执行的角度看,当执行诸如jmp,call,mov等相关需要内存寻址的指令时,就需要将指令所指向的逻辑地址映射成物理地址,这个过程经过了地址映射。

四.
如果从cpu的指令执行周期来看,在取指过程中,不难想象,同样需要访问内存(不考虑一些指令预取等优化手段,同时这些手段也不会影响到结论)。结合实模式下的IP寄存器相关知识和ia32手册的介绍,不难得出:cpu的取指过程同样需要经过地址映射:

1.EIP寄存器中存放的是相对地址(offset),也就是基于段基址的偏移值。
2.找到cs寄存器对应的段描述符,取得其中存放的段基址(这个基址也是线性地址)
3.把取得的这个基址+EIP存放的偏移值,就得到了一个完整的线性地址,到此为止,完成了段式映射
4.这个线性地址还要通过目录表,页表映射,获得真实的物理地址。
5.完成地址映射,取得指令。
回复 支持 反对

使用道具 举报

发表于 2005-5-7 17:35:12 | 显示全部楼层
事实上,linux没有使用段式机制,它在x86架构中是让段式机制“失效“的。
回复 支持 反对

使用道具 举报

发表于 2005-5-7 20:12:07 | 显示全部楼层
走走过场,段基址为0
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表