二、linux进程地址空间
由前面可得知,进程有4G的寻址空间,其中第一部分为“用户空间”,用来映射其整个进程空间(0x0000 0000-0xBFFF FFFF)即3G字节的虚拟地址;第二部分为“系统空间”,用来映射(0xC000 0000-0xFFFF FFFF)1G字节的虚拟地址。如下图
将其更加详细地展示如下:
环境变量:类似linux下的PATH,HOME等的环境变量,子进程会继承父进程的环境变量。
命令行参数:类似ls -l 中-l 就是命令行参数,而ls 就是可执行程序。
栈:就是堆栈,程序运行时需要在这里做数据运算,存储临时数据,开辟函数栈等。在Linux下,栈是高地址往低地址增长的。
对于函数栈来说,函数运行完毕就释放内存,举例递归来说,一直开辟向下函数栈,然后由下往上收复,所以递归太多层的话很可能造成栈溢出。
局部变量(不包含静态变量);局部可读变量(const)都分配在栈上。
共享库和mmap内存映射区:比如很多程序都会用到的printf,函数共享库 printf.o 固定在某个物理内存位置上,让许多进程映射共享。mmap是个系统函数,可以将一个文件映射到某个物理内存位置,让许多进程共享。
堆:即malloc申请的内存,使用free释放,如果没有主动释放,在进程运行结束时也会被释放。
Text Segment: 可执行程序(二进制)(.text);全局初始化只读变量(const)(.rodata);字符串常量(.rodata);均在这里分配。
Data Segment: 全局变量(初始化的在.data,未初始化的在.bss);静态变量(全局和局部)(初始化的在.data,未初始化的在.bss);全局未初始化只读变量(.bss);均在这里分配。