逻辑地址,线性地址,物理地址的差别

本文详细解释了段页式内存管理中逻辑地址、线性地址及物理地址的区别与联系。逻辑地址由程序产生,线性地址作为中间层连接逻辑地址与物理地址,而物理地址则是CPU实际访问内存的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

段页式内存管理中,逻辑地址,线性地址,物理地址的差别

 

线性地址是逻辑地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。 

如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。不过,在开启分页功能之后,一个线性地址可能没有相对映的物理地址,因为它所对应的内存可能被交换到硬盘中。32位线性地址可用于定位4GB存储单元。

所谓物理地址,就是指系统内存的真正地址。对于32 位的操作系统,它的范围为0x00000000~0xFFFFFFFF,共有4GB。只有当CPU工作于分页模式时,此种类型的地址才会变得非常“有趣”。本质上,一个物理地址是CPU插脚上可测量的电压。操作系统通过设立页表将线性地址映射为物理地址。Windows 2K/XP所用页表布局的某些属性对于调试软件开发人员非常有用。

分页机制把线性地址空间和物理地址空间分别划分为大小相同的块。这样的块称为页。通过在线性地址空间的页与物理地址空间的页之间建立映射,分页机制可以实现线性地址到物理地址的转换。线性地址空间的页与物理地址空间的页之间的映射可根据需要来确定。线性地址空间的任何一页,可以映射为物理地址空间中的任何一页。

 


 

 

      逻辑地址(Logical Address) 是指由程式产生的和段相关的偏移地址部分。例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程式执行代码段限长内的偏移地址(假定代码段、数据段如果完全相同)。应用程式员仅需和逻辑地址打交道,而分段和分页机制对你来说是完全透明的,仅由系统编程人员涉及。应用程式员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。

 

      线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程式代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80x86的线性地址空间容量为4G2的32次方即32根地址总线寻址)。


      物理地址(Physical Address) 是指出目前CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。


      虚拟内存(Virtual Memory)是指计算机呈现出要比实际拥有的内存大得多的内存量。因此他允许程式员编制并运行比实际系统拥有的内存大得多的程式。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个非常恰当的比喻是:你不必非常长的轨道就能让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就能完成这个任务。采取的方法是把后面的铁轨即时铺到火车的前面,只要你的操作足够快并能满足需求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的任务。在Linux0.11内核中,给每个程式(进程)都划分了总容量为64MB的虚拟内存空间。因此程式的逻辑地址范围是0x0000000到0x4000000。有时我们也把逻辑地址称为虚拟地址。因为和虚拟内存空间的概念类似,逻辑地址也是和实际物理内存容量无关的。逻辑地址和物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。机理 逻辑地址(或称为虚拟地址)到线性地址是由CPU的段机制自动转换的。如果没有开启分页管理,则线性地址就是物理地址。如果开启了分页管理,那么系统程式需要参和线性地址到物理地址的转换过程。具体是通过设置页目录表和页表项进行的。

### 逻辑地址线性地址、虚拟地址和物理地址区别 #### 逻辑地址 逻辑地址也被称为有效地址或段内偏移地址,在任何CPU模式下都存在。它由程序产生的相对某个段寄存器的偏移量构成。例如,在实模式下的汇编指令 `mov ax, [0x7c00]` 中,`0x7c00` 就是一个逻辑地址[^3]。 #### 线性地址 当启用了分页机制时,线性地址作为从逻辑地址转换至物理地址过程中的过渡形式出现;而在未启用分页的情况下,则直接充当物理地址的角色。具体来说,线性地址是由逻辑地址(即段内的偏移地址)加上相应的段基址计算得出的结果。对于支持此特性的处理器架构而言,比如 Intel 80386 处理器家族成员所定义的最大可寻址范围可达4GB (2^32)[^2]。 #### 虚拟地址 在现代操作系统中广泛采用的一种抽象概念——虚拟地址实际上指的是应用程序视角下的线性地址。这意味着每个独立执行单元(如进程)都被赋予了一套统一而连续的地址区间供其自由支配,即使这些区域可能映射到了不相邻甚至散布于整个系统的不同部分的真实存储资源上。因此,借助这种间接层次的设计理念,软件开发者可以更加方便地编写代码而不必关心底层硬件细节[^4]。 #### 物理地址 最终被用来真正定位RAM芯片内部特定字节位置的信息便是所谓的物理地址。它是经过一系列复杂的变换流程之后得到的实际可用数值,用于指示具体的内存单元所在之处。只有在这个阶段,计算机才能确切知道要读取或写入的数据究竟位于哪里[^1]。 ```cpp // 示例:展示如何获取当前平台上的页面大小 #include <unistd.h> longpagesize=getpagesize(); printf("Page size:%ld\n",pagesize); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值