Linux进程内存映射
Linux下C程序的生成分为4个阶段:预编译、编译、汇编、链接。编译器gcc经过预编译、编译、汇编3个步骤将源程序文件转换为目标文件。如果程序有多个目标文件或者程序中使用了库函数,编译器还要将所有的目标文件或所需的库链接起来,最后胜出可执行程序。但程序执行时,操作系统将可执行程序复制到内存中。
如上图,从内存的低地址到高地址依次如下:
代码段:也就是.text,a.out的二进制代码。代码段是制度的,可被多个进程共享。如一个进程创建了一个子进程,父子进程共享代码段,此外子进程还获得父进程数据段、堆、栈的复制。
数据段:也就是.data,用于存储已被初始化的变量,包括全局变量和已被初始化的静态变量。
未初始化数据段:也就是.bss,存储违背初始化的静态变量。
堆:用于存放程序运行中动态分配的变量。
栈:用于函数调用,保存函数的返回地址、函数的参数、函数内部定义的局部变量。
此外,高地址还存储了命令行参数和环境变量。
参考文章:C语言中的内存布局
Chrome浏览器修改hosts文件后如何立刻生效 Linux-进程、进程组、作业、会话、控制终端详解(转)