虽然我们假设有一个单独的页表,将一个虚拟地址空间映射到物理地址空间,实际上,操作系统为每个进程都提供了一 个独立的页表,因而也就是一个独立的虚拟地址空间,下图展示了基本思想,在这个示例中,进程i的页表将VP 1映射到PP 2,VP 2映射到PP 7,相似的,进程j的页表将VP 1映射到PP 7,VP 2映射到PP 10,多个虚拟页面可以映射到同一个共享物理页面上.
独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不用管代码和数据实际存放在物理存储器的何处,Linux系统上的每个进程都使用类似的存储器格式,文本节总是从0x08048000处开始(32位系统),或者从0x400000处开始(对于64位地址空间),数据和bss节紧跟在文本节之后,栈占据进程地址空间最高的部分,并向下生长.
虚拟存储器向用户进程提供一个简单的分配额外存储器的机制,当一个运行在用户进程中的程序要求额外的堆空间时,(如调用malloc的结果) ,操作系统分配一个适当的数字(例如k)个连续的虚拟存储器页面,并且将它们映射到物理存储空间个任意的位置,由于页表的工作方式,操作系统没有必要分配k个连续的物理存储空间,页面可以随机的分配.
虚拟存储器还使得容易向存储器中加载可执行文件和共享文件.Linux 加载器分配虚拟页的一个连续的片,从地址0x08048000处开始( 对于32位地址空间)或者从0x400000处开始(对于64位地址空间),把这些虚拟页记为无效的(即未被缓存的),将页表条目指向目标文件中适当的位置,加载器从来不实际拷贝任何数据从磁盘到存储器,在每个页被引用时,要么是CPU取指令时引用,要么是一条正在执行的指令引用了存储器位置时引用的,虚拟存储器系统会按照需要自动的掉啊如数据页.