逻辑地址、线性地址和物理地址之间的转换

       首先说明一点,本篇的文章是根据自己的理解总结,但是图可能是在已有的博客中截图的,在此对那些对我理解该部分知识提供帮助的博客博主表示感谢!

       在逻辑地址、线性地址和物理地址一节中,已经对逻辑地址、线性地址和物理地址的概念做了详细的讲解。现在在这篇文章中,我们可以详细的对段式、页式、段页式内存管理方式以及三种地址之间的转化做一个详细且深入的说明。

       文章按照由简单到深入的顺序分别对以上三种内存管理方式进行说明。这里以32位系统为例进行举例说明,至于64位系统,其原理是大致类似的。

段式内存管理方式:

       段式内存管理方式就是直接将逻辑地址转换成物理地址,也就是CPU不支持分页机制。其地址的基本组成方式是段号+段内偏移地址。

       在介绍段式内存管理方式之前首先介绍逻辑空间。逻辑空间分为若干个段,其中每一个段都定义了一组具有完整意义的信息,逻辑地址对应于逻辑空间,如(主程序的main())函数,如图1所示。

图 1 逻辑地址空间

       段是对程序逻辑意义上的一种划分,一组完整逻辑意义的程序被划分成一段,所以段的长度是不确定的。

       如图1所示,段式内存管理方式经过段表映射到内存空间。先说明一下段表的概念,可以将段表抽象成一个大的数组集合,数组中的元素是什么呢?就是“段描述符”----用于描述一个段的详细信息的结构。段描述符一般是由8个字节组成,也就是64位。操作系统使用的不同的段描述符如图2所示。


图 2 段描述符

       前面已经说过,将逻辑地址转换成下一个环节的地址(物理地址,不适用分页或者使用分页的线性地址)需要使用段表,而获得段表中一个特定的段描述符需要使用段选择符,这里需要区分的概念就是“段选择符"和“段描述符"。段描述符描述了一个段的详细信息,例如,起始地址(BASE的32位,长度20位),适用于转换下一个环节的地址所需要的详细信息;而段选择符是用于找到对应的段描述符的。

       下面说一下段选择符。段选择符是一个由16位长的字段组成的,其中前13位是一个索引号,后面三位包含一些硬件细节,如图3所示。

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

余额充值