1.linux下程序转化成进程
linux下C程序的生成分成:预编译–>编译–>汇编–>链接。gcc编译器通过前三步将源文件转换成目标文件。若程序有多个目标文件或者程序中使用了库函数,编译器还需要将所有目标文件或者所需要的库链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中。程序转化成进程需要3步:
(1)内核将程序读入内存,为程序分配内存空间
(2)内存为该程序分配进程标识符PID,和其他资源
(3)内核为该进程保存PID和相应的状态信息,将进程放在运行队列等待执行。程序转化成进程后就可以被操作系统调度执行了。
2.进程的内存映像
进程的内存映像就是在内核中如何存放可执行程序。在程序–>进程,操作系统将程序复制到内存中
linux程序映像一般布局
从内存的低地址到高地址依次为:
(1)代码段:二进制机器码,只读,可被多个进程共享。如父子进程共享代码段,子进程获得父进程的数据段,堆,栈的复制
(2)数据段:存储已经初始化的变量(全局变量/已被初始化的静态变量)
(3)未初始化数据段:存储未被初始化的静态变量,(BSS段)
(4)堆:存放程序运行中动态分配的变量
(5)栈:用于函数调用,保存函数的返回地址/参数/内部定义的局部变量
高地址存储了命令行参数和环境变量。
3.可执行程序和内存映像的区别
(1)位置
可执行程序在硬盘中,内存映像在内存中
(2)有无堆栈
可执行程序没有堆栈,它被加载到内存中才会分配堆栈
(3)变量的储存
可执行程序也有未被初始化的数据段,但是数据段却不被储存在硬盘中的可执行文件中。
(4)静态动态之分
可执行程序是静态的,不变的。内存映像随着程序的执行动态变化。(数据段随着程序的执行要存出新的变量值,栈在函数调用时也在不断变化)