虚拟内存一个虚拟概念,它为每个进程提供一个假象,就是每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。虚拟地址空间在Linux中,地址空间最上面的区域是留给操作系统的代码和数据。这对所有进程来说都是一样的。地址空间的底部区域存放用户进程定义的代码和数据。
每个进程看到的虚拟地址都由大量准确定义的区构成的,每个区都有专门的功能。
程序代码和数据区:对所有进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。代码和数据区直接按照可执行目标文件的内容初始化。
堆:代码和数据区紧随着的是运行时堆。代码和数据区在进程一开始运行时候就被指定了大小,与此不同。当调用了malloc和free这样的C标准库函数时候,堆可以在运行时动态拓展和收缩。
共享库:大约在地址空间的中间部分是一块用来存放C标准库和数学库这样的共享库的代码和数据的区域。共享库的概念非常大,也相当难懂。
栈:位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态拓展和收缩。当我们调用一个函数,栈就会增加;从一个函数返回时候,栈就会收缩。
内核虚拟内存:地址空间顶部是为内核保留的。不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。
虚拟内存的运作需要硬件和操作系统软件之间的精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。基本思想就是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。