【程序员必备小知识-内存知识19】进程空间的分布

295 阅读2分钟

引言

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

学习完MMU的相关知识之后,我们来深入学习进程的内存分配,我们具体到每一个进程下,看看进程的内存空间具体是怎么划分的。

虚拟内存空间划分

我们知道Linux把虚拟内存空间划分为用户空间和内核空间,x86平台的虚拟地址空间是0x0000 0000~0xffff ffff,那用户空间就是(0x0000 0000~0xbfff ffff)大概是占3个G,剩下的1个G给了内核,用户程序只能访问用户空间的数据,不能访问内核空间的数据,也不能直接跳转到内核代码中执行,这样就保护了内核,如果一个进程访问了非法的地址,顶多这个进程崩溃,而不会影响到内核和其它进程,CPU在产生中断或异常时会切换到内核模式执行内核代码,因为只有内核是进行进程管理的,由内核终止异常进程的执行,内核就是由各种中断和异常处理的程序组成。

用户空间的具体分布

用户空间实际被划分成了许多段,如下图所示:

image.png

  1. 只读段,包括代码和常量等。
  2. 数据段,包括全局变量等。
  3. 堆,包括动态分配的内存,从低地址开始向上增长。
  4. 文件映射段,包括动态库、共享内存等,从高地址开始向下增长。
  5. 栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。