在早期的时候,程序的规模很小,虽然那时候的物理内存也很小,但是也可以容纳下当时的程序。然而,随着技术的发展,应用程序的规模愈来愈大,于是就有了一个难题:应用程序太大,以至于物理内存无法容纳下这样的程序了。通常的做法是将程序分割为许多片段,片段0首先在物理内存中执行,当他执行完成时调用下一个片段1,虽然片段在物理内存中的交换是由操作系统完成的,但是程序员必须手动的对程序进行分割,这是一个费时费力的工作。为了解决这一问题,就有了虚拟内存。
在支持虚拟内存的计算机中,一个程序是运行在虚拟存储器空间的,其大小由处理器的位数决定,其中的某一个地址就称为虚拟地址。和虚拟存储器对应的就是物理存储器,它是现实世界中能够直接使用的存储器。其中的某一个地址便称为物理地址。物理存储器的大小不能超过处理器最大可寻址的空间。
由于虚拟地址无法直接访问物理存储器,所以需要先进行地址转换。负责地址转换的部件,一般被称为内存管理单元MMU,如下图所示:
使用虚拟地址的好处,第一个就是用户在编写程序时,不需要考虑地址的限制,每个程序都认为只有自己在处理器中运行,它占有处理器的所有地址空间。
此外,使用虚拟内存还可以实现程序的保护。即使两个程序使用相同的虚拟地址,它们也会对应到不同的物理地址,因此可以保证每个程序的内容不会被其他的程序改写。而且,通过这种方式,还可以实现程序之间的共享,只需要让两个程序的虚拟地址映射到同一个物理地址便可以实现。