在学习Linux内存管理过程中,会遇到逻辑地址、线性地址和物理地址三个概念。
下面的示例代码分别是在i686和x86_64系统上运行的。那么打印出的变量tmp地址和指针p指向的内存块地址分别是什么地址?物理地址?线性地址?逻辑地址?

-
逻辑地址(Logical address)
在机器语言指令中,来说明操作数或指令的地址。在x86架构中,每个逻辑地址包括两部分:段(Segment)和偏移量(Offset)。 -
线性地址(Linear address)
也称为虚拟地址。在32位CPU中,它是32位的无符号整型,最大可以达到4G。在x86_64 CPU中目前最大可使用40位地址线,即最大可寻址1TB。 -
物理地址(Physical address)
物理内存的实际地址,由BIOS统一编址。
这三种地址关系为,逻辑地址经过段式映射(Segmentation Translation)到线性地址。线性地址经过页面映射(Page Translation)后,得到物理地址。

x86 CPU中段机制(Segmentation)可以将程序的代码(Code)、数据(Data)、栈(Stack)分开,这样多个程序(或进程)就可以在同一个CPU上运行,而相互不会干扰。
页机制(Paging)用来实现传统的以页面为需求的虚拟内存系统,只有程序需要时,才真正给进程分配物理内存。页机制也可以用来隔离多个任务。

网友评论