printf("%p\n", p);打印出来的地址是一个段偏移地址么?我们程序操作的都是一个段偏移地址,
因为GDT表中的base都是0,所以这个偏移与线性地址相同,
所以linux管理的线性地址实际上是管理段偏移地址,
CPU每次寻址都要经过 以下这个过程么?
段选择符:段偏移--(查GDT表)-->线性地址--(查进程中pgd)-->物理地址
GDT中找到的base是0, 加上offset就是线性地址,所以感觉应该是这个offset与线性地址相等,
有的说linux的线性地址等于逻辑地址,
但是从这个关系逆向推理的话就让人糊涂了,或者这里理解的不对?
我的理解和你稍有不同,我认为打印的是虚拟地址。
在编译链接时才回你用到逻辑地址,在重定位的过程中,逻辑地址会转化为相应的虚拟地址,这个转变可能由编译器完成或者装载器完成。
个人理解是,因为这个段偏移计算之后与线性地址相同,所以操作这个段偏移实际上就是在操作线性地址,
但是说逻辑地址等于线性地址这个理解不上去,
逻辑地址是CPU根据段寄存器中的段选择符和段偏移计算出来的,是运行过程中的地址。
在程序运行前,会有一个装载的过程,每个进程的虚拟内存空间都是4G,装载地址在win下和linux有所不同,装载后从装载地址开始运行,这个地址我觉得就是 虚拟地址,从这里开始所
有变量所用到的地址都是虚拟地址,所以我觉得打印的还是虚拟地址,毕竟打印的时候程序已经在运行了。
对于逻辑地址也就是段内偏移我感觉不是这么回事,
段内偏移只是逻辑地址的一部分,
我感觉逻辑地址应该是段选择符和段内偏移组成的。
intel-protected-mode-memory-management.jpg (48.42 KB, 下载次数: 50)
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |