前段时间把《程序员的自我修养–链接、装载与库》这本书看完了,期间有些地方不是太明白,当时网络搜索了下,今天把当时看到的东西摘抄下,基本文中大部分内容都是拷贝下面提到的参考链接里的东西,自己在组织下,以备以后需要时查看。
地址分为三类,逻辑地址,线性地址和物理地址。
在《深入理解linux内核》中其把地址分为三类:逻辑地址(汇编语言中操作数地址或指令的地址,对于80x86的CPU,逻辑地址是段+段内偏移地址)、线性地址(也叫虚拟地址)和物理地址。但在Stott Maxwell的《Linux Core Kernel Commentrary》中确是这样分的:逻辑地址(也叫虚拟地址)、线性地址和物理地址。按照386CPU总设计师John Crowford的解释,虚拟地址是保护模式下段和段内偏移量组成的地址,而逻辑地址就是代码段内偏移量,或称进程的逻辑地址。其实对于linux来说,这三种说法都没错,由于linux下并不主张将程序分段,而是主张分页,所以即使是在80x86的体系结构下,段的基地址也是0。因此逻辑地址、线性地址、虚拟地址在linux中其实是相同的。所以对于linux下的ELF可执行文件来说,代码段的起始地址0x08048000既是逻辑地址,也是线性地址也是虚拟地址。
1.X86的物理地址空间布局
以x86_32,4G RAM为例: