进程内存印象

 Linux下C程序生成主要由四个步骤组成:预编译、编译、汇编、链接。编译器gcc经过 预编译、编译、汇编3个步骤将源程序文件转换成目标文件。如果程序有多个目标文件或程序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中,程序转为进程通常需要以下步骤:  

  1. *内核将程序读入内存,为程序分配内存空间;
  2. *内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行。程序转化为进程后就可被操作系统的调度程序执行了。

 进程的内存映像是指内核在内存中如何存放可执行程序文件。在将程序转化为进程的过程中,操作系统将可执行程序从硬盘复制⾄至内存中,其布局如下:

                   

我们只需写个小程序打印一下各个地址就可以验证其正确性了:

#include <stdio.h>
#include <stdlib.h>

int g_val1 = 0;
int g_val2;

int main(int argc, char *argv[], char *env[])
{
	printf("code addr: %p\n", main);
	printf("init var addr: %p\n", &g_val1);
	printf("uninit var addr: %p\n", &g_val2);

	char *heap = (char *)malloc(10);
	printf("heap addr: %p~%p\n", heap, heap + 9);

	char stack[10];
	printf("stack addr: %p~%p\n", stack, stack + 9);

	printf("cmd lind para addr: %p\n", argv);
	printf("env addr: %p\n", env);

	free(heap);

	return 0;
}

运行结果:地址依次增长      

  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fireplusplus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值