操作系统通过虚拟内存的概念,为每个进程提供完全一致的内存视图。该内存视图的地址空间称为虚拟地址空间。从每个进程的角度来看,内存中只有操作系统内核和进程存在,即内存被进程独占。向上看,分为进程代码和数据区、堆数据区、共享库区、栈区、内核内存区。进程代码和数据区中的可执行程序文件的内容被加载到这个区域,这个区域分为两部分。低地址部分包含程序代码和只读数据,为只读部分;另一个区域存储可执行文件的可读部分。写数据,是一个可读写的区域。这个区域不是从地址0开始的,它有一个偏移地址。堆数据区堆数据区就是堆区。在C程序中,这块区域的分配和回收是由malloc和free来完成的。随着区域分配的进行,该区域继续从低地址向高地址扩展。共享库区是共享库的内存映射区。在C字序中,printf等函数所在的库文件的目标代码被加载到这个区域。该区域的起始地址是固定的,并向更高地址扩展。Stackarea堆栈区,当程序运行时,函数调用产生的堆栈就存放在这个区域。该区域的起始地址是固定的(紧挨着内核内存区域),随着函数调用时栈的产生,该区域从高地址向低地址不断扩展。内核内存区。内核虚拟内存区,位于虚拟地址空间最高地址的一个地址空间。用户进程不能访问该区域。
