详细解决方案
面试冲刺:42---虚拟地址、逻辑地址、线性地址、物理地址是什么意思?各个地址之间是如何转换的?
热度:85 发布时间:2024-02-07 03:59:32.0
- Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同
- Linux运行在虚拟存储空间,并负责把系统中实际存在的远小于4GB的物理内存根据不同需求映射到整个4GB的虚拟存储空间中
- Linux主要工作在保护模式下。80X86从逻辑地址到物理地址变换中经过了两个阶段:
- 第一阶段使用分段机制把程序的逻辑地址变换成处理器可寻址内存空间(称为线性地址空间)中的地址
- 第二阶段的分页机制把线性地址转换成物理地址
- 第一阶段的分段变换机制是必须使用的,但是第二阶段的分页机制是可选择的。如果没有开启分页机制,那么分段机制产生的线性地址空间就直接映射到处理器的物理地址空间上。进行研究之前,一定要对概念定义非常清晰,不能混淆
一、虚拟地址
- 指的是由程序产生的由段选择符和段内偏移地址两个部分组成的地址
- 为什么叫它是虚拟的地址呢?因为这两部分组成的地址并没有直接访问物理内存,而是要通过分段地址的变换机构处理或映射后才会对应到相应的物理内存地址
二、逻辑地址
- 指由程序产生的与段相关的偏移地址部分,每一个逻辑地址都由一个段和偏移量组成
- 在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址
- 它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)
三、线性地址
- 是逻辑地址到物理地址变换之间的中间层
- 程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址
- 如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址
四、物理地址
- 指的是现在 CPU 外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果
五、虚拟地址如何转换为物理地址
- 第一步,先将虚拟地址转换为逻辑地址:根据程序中的虚拟地址得出其所在的段,然后加上段偏移,我们就能得到一个逻辑地址
- 第二步,再将逻辑地址转换为线型地址:有了逻辑地址之后,我们需要将逻辑地址转换为线型地址(因为线型地址是逻辑地址转换到物理地址的一个中间层),只需要把逻辑地址加上段的基地址就能生成一个线型地址
- 第三步,再将线型地址再转换为物理地址:
- 如果启用了分页机制,那么就需要将需要找到段中对应页的地址,然后再找到页内偏移地址,最后得到物理地址
- 如果没有启用分页机制,那么线型地址直接就是物理地址了