1、进程虚拟地址空间
(1)如图所示
(2)程序运行
- 首先把可执行文件xxx.exe从磁盘加载到内存中
- Linux 系统会给当前进程分配一个2^32大小的空间(4G)
注意:每一个进程都有这样一个虚拟地址空间
(3)各区域的意义
-
受保护的地址段:这一段空间的起始地址是 0X00000000,是不可访问的。
例如:当我们定义一个字符串 char *p = NULL 时,然后访问字符串p 的时候,就会访问到这一个受保护的区域,导致程序崩溃。因为NULL实际上是0,无疑就会取到 0X00000000的地址 -
代码段(.text):这一段存放程序的代码
-
数据段(.data):存放程序中已初始化的全局变量和静态变量的一块内存区域。
-
BSS段(.bss):存放程序未初始化的全局变量和静态变量的一块内存区域。
注意:全局变量和静态变量初始化为0也属于BSS段,因为未初始化的全局变量和静态变量默认初始化为0。 -
堆区:存放程序运行过程中动态开辟的内存。堆从低地址往高地址增长。
-
共享区:存放运行时加载进来的动态链接库。Windows下的.dll文件和Linux下的.so文件。
-
栈区:存放局部变量,函数参数值。栈从高地址往低地址增长。
-
命令行参数和环境变量:就是存放命令行参数和环境变量。
(4)补充
每一个进程的用户空间都是私有的,但是内核空间是共享的。