虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,他为每个进程提供了一个大的、一致的和私有的地址空间。
虚拟存储器提供了三个重要的能力:
1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效的使用了主存。
2)它为每个进程提供了一致的地址空间,从而简化了存储器管理。
3)它保护了每个进程的地址空间不被其他进程破坏。
程序员为什么需要理解虚拟存储器?
虚拟存储器是中心的。虚拟存储器是强大的。虚拟存储器是危险的。
物理和虚拟寻址
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址(Physical Address,PA)。CPU访问存储器的最自然的方式就是使用 物理地址。我们把这种方式称为物理寻址(physical addressing)。
早期的PC机使用物理寻址。现代处理器使用的是一种称为虚拟寻址的寻址形式 。
使用虚拟寻址时,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址再被送到存储器之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译。就像异常处理一样,地址翻译需要CPU硬件和操作系统之间的紧密合作。CPU芯片上叫做存储器管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由 操作系统管理的。
地址空间
地址空间是一个非负整数地址的有序集合:{0,1,2,...}如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间。为了简化讨论,我们总是假设使用的是线性地址空间。在一个带虚拟存储器的系统中,CPU从一个有N=2^n个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间:{0,1,2,...,N-1},一个地址空间的大小是由表示最大地址所需要的位数来描述的。例如,一个包含N=2^n个地址的虚拟地址空间就叫做一个n位地址空间。现代系统典型的支持32位或者64位虚拟地址空间。
一个系统还有一个物理地址空间 ,它与系统中物理存储器的M个字节相对应:{0,1,2,...,M-1},M不要求是2的幂,但是为了简化讨论,我们假设M=2^m。
地址空间的概念是很重要的,因为它清楚地区分了数据对象(字节)和它们的属性(地址)。一旦认识到了这种区别,那么我们就可以将其推广,允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间。这就是虚拟存储器的基本思想。主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
虚拟存储器作为缓存的工具
概念上而言,虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节带下的单元组成的数组。每字节都有一个唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的索引的。磁盘上数组的内容被缓存在主存中。和存储器层次结构中的其他缓存一样,磁盘上的数据被分割成块,这些块作为磁盘和主存之间的传输单元。VM系统通过将虚拟存储器分割为称为虚拟页的大小固定块来处理这个问题。每个虚拟页的大小为P=2^p字节。类似的,物理存储器被分割为物理页,大小也为P字节(物理页也称为页帧)。
DRAM缓存的组织结构
为了有助于清晰的理解存储层次结构中不同的缓存概念,我们将使用术语SRAM缓存来表示位于CPU和主存之间的L1、L2和L3高速缓存,并用术语DRAM缓存来表示虚拟存储器系统的缓存,它在主存中缓存虚拟页。