物理地址、虚拟地址、逻辑地址、线性地址之间的关系

物理地址、虚拟地址、逻辑地址、线性地址之间的关系

什么是物理地址

在计算机中,机械硬盘使用非常广泛。通过机械硬盘的结构,我们可以知道物理地址是如何来的。

机械硬盘将几个磁盘连接在一起,每一个磁盘都可以看作一个个同心圆组成的,每一个同心圆被称之为一个磁道,每一个磁道又被划分为一个个扇区,所以扇区是磁盘上的最小存储单位。扇区常常又被称之为数据块(一个数据块通常大小为512byte)。通过给这些数据块来编号,这就是物理地址。

物理地址的由来

物理地址由内存控制器生成,然后传递给内存中的存储单元。当处理器需要访问内存中的数据时,它将请求发送到内存控制器,内存控制器会根据物理地址找到对应的存储单元,并将其中的数据返回给处理器。

什么是虚拟地址

虚拟地址是CPU保护模式下的一个概念,保护模式是80286系列和之后的x86兼容CPU操作模式,在CPU引导完操作系统内核后,操作系统内核会进入一种CPU保护模式,也叫虚拟内存管理,在这之后的程序在运行时都处于虚拟内存当中。

为什么需要使用虚拟地址

  1. 安全,不直接使用物理地址。避免了直接将底层暴露出来
  2. 方便管理,在多进程的计算机中,直接使用物理内存不方便程序员管理。
  3. 更适合多进程。虚拟地址有远远大于物理地址的容量。

物理地址和虚拟地址之间的转换

从宏观上来看:

从上面可以看到虚拟地址和物理地址之间的转换路径。

首先通过查询TLB(转址旁路缓存,TLB中存储了上次进行地址转换使用过的转换关系),如果没有对应的地址的转换关系的话,就直接进行转换。否则直接访问内存。

如何进行转换的?


通过上面的图,可以看到具体的转换过程。

需要注意的是,如果开启了换页机制则,需要将线性地址转换为物理地址,如果没有开启换页机制则线性地址直接就是物理地址。不需要转换。

程序运行中的各地址转换

在程序中,我们使用的偏移地址,这个偏移地址是相对于段来说的。
那么偏移地址如何转换成为一个物理地址?

偏移地址的组成

通过上面的图可以知道,偏移地址是由段选择符+段内偏移值组成的。

段选择符的组成:

  • TI标识了使用LDT还是GDT

  • 索引号就是段描述符表中的索引

  • 整体的转换流程如图所示:

    1. 根据段选择符中的TI位确定使用GDT还是LDT,再根据寄存器获取要使用的段描述符表的地址
    2. 段选择符的前13位是段描述符表中的索引,据此得到段描述符,这样就取到了段的基地址Base
    3. Base + offset就是要转换的线性地址了

线性地址

线性地址是逻辑地址转换成物理地址的中间层,CPU的MMU(内存管理单元)负责将线性地址转换成物理地址。

为了节省空间,引入了页目录和页表的概念,每个进程都有自己的页目录,它的地址存储在CPU的寄存器中。
以32位机为例。一个32位的线性地址被分为3部分:

页目录索引(10位)
页表索引(10位)
偏移(12位)

转换的过程:

从CPU寄存器cr3中获取到页目录地址(操作系统在调度进程的时候,负责将页目录地址放入寄存器)
根据线性地址的页目录索引部分,去页目录中找到页表
根据线性地址的页表索引部分,找到页的起始地址
起始地址 + 偏移,就得到了物理地址

总结

虚拟地址是一个宽泛的概念,其可以是偏移地址、也可以是线性地址,总之不是物理地址的地址一般称之为虚拟地址。

程序员编程(逻辑地址)<—通过算法–>操作系统(虚拟地址)<—通过内存管理单元–>物理元件(物理地址)

参考资料

http://blog.timd.cn/virtual-address/

https://www.cnblogs.com/fengxing999/p/11022872.html

https://wiki.osdev.org/GDT_Tutorial

https://blog.csdn.net/bjbz_cxy/article/details/78508795


物理地址、虚拟地址、逻辑地址、线性地址之间的关系
https://ysc2.github.io/ysc2.github.io/2023/11/16/物理地址、虚拟地址、逻辑地址、线性地址之间的关系/
作者
Ysc
发布于
2023年11月16日
许可协议