本文是关于操作系统中逻辑地址和物理地址之间的区别。计算机操作系统中的内存使用两种不同类型的地址。物理地址是内存的实际地址,如RAM
,虚拟地址只是缓存和RAM
之间的逻辑地址映射。
在操作系统中,每当我们谈论代码或其部分的地址或地址空间时,我们指的是该部分代码所在的内存位置。让我们通过一个现实生活中的异常来了解操作系统中的寻址。在现实生活中,我们的房子都有特定的地址,所以如果我们想去某个特定的人的地方,我们会记得他/她的房子的地址。操作系统中的地址也是如此。我们将数据存储在不同位置的内存中,并为它们分配不同的地址,以便我们将来可以使用存储它们的相同地址再次访问它们。在操作系统中,我们使用 32 位体系结构中的 32 位地址空间和0xFFFFFFFF
形式的十六进制数,从 0x00000000
到0xFFFFFFFF
。
在对地址以及为什么需要它们进行了快速讨论之后,我们现在将区分逻辑地址和物理地址。
1、逻辑地址简介
当我们谈论逻辑地址时,我们指的是CPU分配给每个进程的地址。正如我们已经讨论过的,一个进程在内存中所处的实际地址与进程认为它所处的地址是不一样的。这种地址映射基本上是在进程共享内存时所必需的,而不需要让进程知道它们彼此共享相同的内存空间。现在让我们来讨论逻辑地址。
每当 CPU 运行一个进程时,它都会为该进程分配一个特定的内存。下图简要说明了内存段在不同部分的划分,其中程序代码段位于低地址,栈位于高地址。
此分配的内存空间位于 CPU 为进程生成的虚拟地址(虚拟或逻辑地址),指示进程的代码、堆和堆栈部分将驻留的进程的内存空间。这个逻辑地址无疑与内存空间的实际地址不同。虚拟地址也称为指向主存储器中实际或物理地址的引用或指针。
大多数操作系统在其程序中都定义了基地址,在生成逻辑地址时,CPU 生成一个地址,程序将基地址与 CPU 生成的地址相加得到逻辑地址,即
逻辑地址 = 基地址 + CPU 生成地址
一个逻辑地址空间是指CPU产生的所有逻辑地址的集合。
2、物理地址简介
物理地址是进程及其内容放置在主内存或硬盘中的地址。每当我们运行一个进程或将一些数据存储在计算机的主存储设备或辅助存储设备中时,我们总是将其存储起来以备将来随时访问。比如我在电脑的D盘存了一个word文件,我想访问它,以后怎么访问?当然是去D盘打开word文件。但是如果我将一个进程保存在主存中的某个存储单元或内存单元中,并希望将来访问它,该怎么办。就我们在本教程中研究过的地址而言,我们知道每当一个进程被创建时,CPU 都会生成它的虚拟地址,但又是一团糟。虚拟地址与进程实际放置在内存中的地址不同。
然而,内存单元存储在由物理地址(用户未知)访问的主内存中,我们所知道的只是进程的逻辑地址。那么当我们需要访问进程的时候我们将如何访问物理地址呢?到目前为止,这似乎是不可能的,但这当然不是因为我们从计算机诞生到现在一直在访问创建的进程。
因此,我们需要详细讨论这个问题。在进程创建时,CPU 不仅会生成虚拟地址,还会使用一些硬件支持将(先前生成的)虚拟地址映射到实际存储它的物理地址,这在下面的地址映射部分进行了讨论。因此,当我们尝试访问内存中已经保存的进程时,CPU 将虚拟地址返回给硬件,硬件将虚拟/逻辑地址映射到物理地址上,并间接访问进程的内存空间。
2.1、地址映射
现在让我们讨论硬件如何在逻辑地址和物理地址之间执行映射。在CPU和内存管理单元(MMU)的硬件中安装有助于地址的映射。下图很好的解释了。
这个内存管理单元对逻辑地址上的物理地址执行所有必需的映射。由MMU执行的非常基本的映射是由一种称为界限和基址的方案执行的。这是执行映射可以使用的最简单的方法。随着地址的映射变得越来越复杂,我们需要向内存管理单元添加越来越多的硬件。让我们讨论基址寄存器和界限寄存器。
2.2、基址和界限法
在基于界限和基址的方法中,每个 MMU 单元都有两个寄存器,称为基址寄存器和界限寄存器。基址寄存器中包含特定进程(正在运行)的内存部分的起始地址。例如,当硬件需要取一些指令时,首先需要将基址寄存器的值与逻辑地址相加,得到物理地址。因此,基址寄存器与访问内存有关,另一方面,界限寄存器要么存储特定进程的内存部分的结束地址,要么还可能包含内存部分的总大小(包括代码、堆栈和堆)。它仅用于保护,以便进程不超过分配给它的内存区域,并且它可能不会跳入另一个进程的内存区域。下面给出了逻辑地址和物理地址的一般比较。
物理地址 | 逻辑地址 | |
定义 | 物理内存地址 | 虚拟地址 |
空间 | 内存空间所在的实际内存地址 | 引用物理地址/实际地址,称为逻辑地址空间 |
可见性 | 只对开发人员可见,对程序员不可见 | 只对用户可见 |
访问 | 用户在任何情况下都无法访问 | 用户可以轻松访问 |
生成 | 由 CPU 生成 | 由 MMU 生成 |
3、文献引用
[1] Yuvayana. (2020, August 13). What Is Memory Management Unit (MMU)?
https://er.yuvayana.org/what-is-memory-management-unit-mmu/
[2] Colin walls, & Dimitrios serpanos. (2012). Memory Management Unit.
https://www.sciencedirect.com/topics/computer-science/memory-management-unit