进程的内存映射

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值