逻辑地址、线性地址和物理地址
逻辑地址(logical addresses)是由程序生成的与段相关的偏移地址的一部分。 例如,你在C语言中进行指针编程,可以读取指针变量本身的值(&操作),实际上,这个值是逻辑地址,也就是相对于你当前进程数据部分的地址,并不对应于绝对物理地址。 只有在Intel实模式下,逻辑地址等于物理地址(因为实模式没有分段或分页机制,CPU没有自动地址转换); 其逻辑是,程序在Intel保护模式下执行代码段长度内的偏移地址(假设代码段、数据段是相同的)。 应用程序程序员只需要处理逻辑地址,而分段和分页机制对您是完全透明的,并且只由系统程序员负责。 虽然应用程序程序员可以直接操作内存,但它只能操作由操作系统分配给你的内存段。 线性地址
线性地址(Linear address)是逻辑地址和物理地址转换之间的中间层。 该代码生成一个逻辑地址或段中的偏移地址,并通过添加相应段的基址生成一个线性地址。 如果启用了分页机制,则可以将线性地址转换为物理地址。 如果没有启用分页机制,则线性地址直接为物理地址。 Intel 80386的线性地址空间容量为4G(2的32倍的地址总线选择,读寻址)。 物理地址
物理地址(物理地址)是一个地址信号,表明在外部地址总线上选择的物理内存,当前CPU读取,是地址转换的最终结果地址。 如果启用了分页机制,则使用页目录和页表中的项将线性地址转换为物理地址。 如果没有启用分页机制,则线性地址直接成为物理地址。
虚拟地址
虚拟内存指的是计算机呈现的比它实际拥有的大得多的内存量。 因此,他允许程序员编译和运行比实际系统大得多的程序。 这使得许多大型项目可以在内存资源有限的系统上实现。 一个非常恰当的类比是:从上海到北京的火车不必经过很长的轨道。 你只需要一个足够长的轨道(比如3公里)来完成任务。 这样做的方法是把后轨立即放在火车前面,只要你的速度足够满足需求,火车就可以像在一个完整的轨道上运行。 这就是虚拟内存管理需要完成的任务。 在Linux0.11内核中,每个程序(进程)被划分为总容量为64MB的虚拟内存空间。 因此,程序的逻辑地址范围是0x0000000到0x4000000。 有时我们也把逻辑地址称为虚拟地址。 因为类似于虚拟内存空间的概念,逻辑地址与实际物理内存容量无关。 逻辑地址和物理地址之间的“差距”是0xc0000000,因为虚拟地址->线性地址->物理地址映射值完全相同。 这个值由操作系统指定。 机制逻辑地址(或虚拟地址)自动转换为线性地址由CPU的段机制。 如果分页管理没有打开,线性地址就是物理地址。 如果分页管理打开,系统程序需要进行参数和线性地址到物理地址的转换过程。 这是通过设置页Catalog表和页表条目来完成的。