进程的内存映像
Linux下C程序生成主要由四个步骤组成:
- 预编译
- 编译
- 汇编
链接
编译器gcc经过预编译,编译,汇编三个步骤将源程序文件转换成目标文件。
如果程序有多个目标文件或程序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。
当程序执行时,操作系统可将可执行程序复制到内存中.
程序转为进程通常需要以下步骤:内核将程序读入内存,为程序分配内存空间
内核为该进程保存PID及相应的状态信息,把进城放到运行队列中等待执行。程序转化为进城后就可被操作系统的调度程序执行了。
进程的内存映像是指内核在内存中如何存放可执行程序文件。
在将程序转化为进程的过程中,操作系统将可执行程序从硬盘复制到内存中,其布局如下:
进程映像的位置依赖于使用的内存管理方案。
可执行程序与进程内存映像的不同之处在于:可执行程序位于磁盘中而内存映像位于内存
- 可执行程序没有堆栈,因为程序被加载到内存中才会分配堆栈
- 可执行程序虽然也有未初始化数据段但他并不被存储在位于硬盘中的可执行文件中。
- 可执行程序是静态的,不变的,而内存映像随着程序的执行是在动态变化的,比如数据段随着程序的执行要存储新的变量值,