逻辑地址、线性地址和物理地址

本文详细解释了计算机内存管理系统中逻辑地址、线性地址和物理地址的概念及其相互转换过程。逻辑地址由程序生成,线性地址是逻辑地址转换的第一步,而物理地址则是最终用于访问实际内存的地址。

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

逻辑地址、线性地址和物理地址

逻辑地址(logical addresses)是由程序生成的与段相关的偏移地址的一部分。 例如,你在C语言中进行指针编程,可以读取指针变量本身的值(&操作),实际上,这个值是逻辑地址,也就是相对于你当前进程数据部分的地址,并不对应于绝对物理地址。 只有在Intel实模式下,逻辑地址等于物理地址(因为实模式没有分段或分页机制,CPU没有自动地址转换); 其逻辑是,程序在Intel保护模式下执行代码段长度内的偏移地址(假设代码段、数据段是相同的)。 应用程序程序员只需要处理逻辑地址,而分段和分页机制对您是完全透明的,并且只由系统程序员负责。 虽然应用程序程序员可以直接操作内存,但它只能操作由操作系统分配给你的内存段。 线性地址

线性地址(Linear address)是逻辑地址和物理地址转换之间的中间层。 该代码生成一个逻辑地址或段中的偏移地址,并通过添加相应段的基址生成一个线性地址。 如果启用了分页机制,则可以将线性地址转换为物理地址。 如果没有启用分页机制,则线性地址直接为物理地址。 Intel 80386的线性地址空间容量为4G(2的32倍的地址总线选择,读寻址)。 物理地址

物理地址(物理地址)是一个地址信号,表明在外部地址总线上选择的物理内存,当前CPU读取,是地址转换的最终结果地址。 如果启用了分页机制,则使用页目录和页表中的项将线性地址转换为物理地址。 如果没有启用分页机制,则线性地址直接成为物理地址。

虚拟地址
虚拟内存指的是计算机呈现的比它实际拥有的大得多的内存量。 因此,他允许程序员编译和运行比实际系统大得多的程序。 这使得许多大型项目可以在内存资源有限的系统上实现。 一个非常恰当的类比是:从上海到北京的火车不必经过很长的轨道。 你只需要一个足够长的轨道(比如3公里)来完成任务。 这样做的方法是把后轨立即放在火车前面,只要你的速度足够满足需求,火车就可以像在一个完整的轨道上运行。 这就是虚拟内存管理需要完成的任务。 在Linux0.11内核中,每个程序(进程)被划分为总容量为64MB的虚拟内存空间。 因此,程序的逻辑地址范围是0x0000000到0x4000000。 有时我们也把逻辑地址称为虚拟地址。 因为类似于虚拟内存空间的概念,逻辑地址与实际物理内存容量无关。 逻辑地址和物理地址之间的“差距”是0xc0000000,因为虚拟地址->线性地址->物理地址映射值完全相同。 这个值由操作系统指定。 机制逻辑地址(或虚拟地址)自动转换为线性地址由CPU的段机制。 如果分页管理没有打开,线性地址就是物理地址。 如果分页管理打开,系统程序需要进行参数和线性地址到物理地址的转换过程。 这是通过设置页Catalog表和页表条目来完成的。

### 逻辑地址线性地址、虚拟地址物理地址的区别 #### 逻辑地址 逻辑地址也被称为有效地址或段内偏移地址,在任何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、付费专栏及课程。

余额充值