进程的内存映射

3/8/2017来源:ASP.NET技巧人气:456

1.linux下程序转化成进程 linux下C程序的生成分成:预编译–>编译–>汇编–>链接。gcc编译器通过前三步将源文件转换成目标文件。若程序有多个目标文件或者程序中使用了库函数,编译器还需要将所有目标文件或者所需要的库链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中。程序转化成进程需要3步:

(1)内核将程序读入内存,为程序分配内存空间 (2)内存为该程序分配进程标识符PID,和其他资源 (3)内核为该进程保存PID和相应的状态信息,将进程放在运行队列等待执行。程序转化成进程后就可以被操作系统调度执行了。

2.进程的内存映像 进程的内存映像就是在内核中如何存放可执行程序。在程序–>进程,操作系统将程序复制到内存中 linux程序映像一般布局 这里写图片描述 从内存的低地址到高地址依次为:

(1)代码段:二进制机器码,只读,可被多个进程共享。如父子进程共享代码段,子进程获得父进程的数据段,堆,栈的复制 (2)数据段:存储已经初始化的变量(全局变量/已被初始化的静态变量) (3)未初始化数据段:存储未被初始化的静态变量,(BSS段) (4)堆:存放程序运行中动态分配的变量 (5)栈:用于函数调用,保存函数的返回地址/参数/内部定义的局部变量 高地址存储了命令行参数和环境变量。

3.可执行程序和内存映像的区别

(1)位置 可执行程序在硬盘中,内存映像在内存中 (2)有无堆栈 可执行程序没有堆栈,它被加载到内存中才会分配堆栈 (3)变量的储存 可执行程序也有未被初始化的数据段,但是数据段却不被储存在硬盘中的可执行文件中。 (4)静态动态之分 可执行程序是静态的,不变的。内存映像随着程序的执行动态变化。(数据段随着程序的执行要存出新的变量值,栈在函数调用时也在不断变化)