物理地址、虚拟地址、逻辑地址、线性地址之间的关系
物理地址、虚拟地址、逻辑地址、线性地址之间的关系
什么是物理地址
在计算机中,机械硬盘使用非常广泛。通过机械硬盘的结构,我们可以知道物理地址是如何来的。
机械硬盘将几个磁盘连接在一起,每一个磁盘都可以看作一个个同心圆组成的,每一个同心圆被称之为一个磁道,每一个磁道又被划分为一个个扇区,所以扇区是磁盘上的最小存储单位。扇区常常又被称之为数据块(一个数据块通常大小为512byte)。通过给这些数据块来编号,这就是物理地址。
物理地址的由来
物理地址由内存控制器生成,然后传递给内存中的存储单元。当处理器需要访问内存中的数据时,它将请求发送到内存控制器,内存控制器会根据物理地址找到对应的存储单元,并将其中的数据返回给处理器。
什么是虚拟地址
虚拟地址是CPU保护模式下的一个概念,保护模式是80286系列和之后的x86兼容CPU操作模式,在CPU引导完操作系统内核后,操作系统内核会进入一种CPU保护模式,也叫虚拟内存管理,在这之后的程序在运行时都处于虚拟内存当中。
为什么需要使用虚拟地址
- 安全,不直接使用物理地址。避免了直接将底层暴露出来
- 方便管理,在多进程的计算机中,直接使用物理内存不方便程序员管理。
- 更适合多进程。虚拟地址有远远大于物理地址的容量。
物理地址和虚拟地址之间的转换
从宏观上来看:
从上面可以看到虚拟地址和物理地址之间的转换路径。
首先通过查询TLB(转址旁路缓存,TLB中存储了上次进行地址转换使用过的转换关系),如果没有对应的地址的转换关系的话,就直接进行转换。否则直接访问内存。
如何进行转换的?
通过上面的图,可以看到具体的转换过程。
需要注意的是,如果开启了换页机制则,需要将线性地址转换为物理地址,如果没有开启换页机制则线性地址直接就是物理地址。不需要转换。
程序运行中的各地址转换
在程序中,我们使用的偏移地址,这个偏移地址是相对于段来说的。
那么偏移地址如何转换成为一个物理地址?
偏移地址的组成
通过上面的图可以知道,偏移地址是由段选择符+段内偏移值组成的。
段选择符的组成:
TI标识了使用LDT还是GDT
索引号就是段描述符表中的索引
整体的转换流程如图所示:
- 根据段选择符中的TI位确定使用GDT还是LDT,再根据寄存器获取要使用的段描述符表的地址
- 段选择符的前13位是段描述符表中的索引,据此得到段描述符,这样就取到了段的基地址Base
- 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