进程地址空间

时间:2022-08-28 21:18:18

本文描述了linux进程中代码段,全局变量,堆栈,环境变量,命令行参数地址在内存中的布局,人非圣贤,孰能无过,请各位大牛多多提出意见,有错误也可指出,作者想进步,想进步..千呐!!

先来看一个小程序,分析一下进程中全局变量(初始化未初始化),堆,栈,代码段地址在内存中布局:

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

int g_val = 100;
int arr[50];

void fun()
{
	printf("address space program\n");
}

int main()
{
	char* heap1 = (char*)malloc(20);
	char* heap2 = (char*)malloc(20);
	char* heap3 = (char*)malloc(20);
	int stack[50];
	printf("code address: %p\n",fun);
	printf("init address: %p\n",&g_val);
	printf("uninit address: %p~%p\n",&arr[0], &arr[50]);
	printf("heap address:%p~%p~%p\n",heap1, heap2, heap3);
	printf("stack address: %p~%p\n",&stack[0], &stack[50]);
	return 0;
}

显示结果:

进程地址空间

上面这个程序就可以分析出来全局变量,堆栈,代码段的内存布局,接下来来看第二个小程序,来分析环境变量和命令行参数地址在内存中布局:

#include <stdio.h>
int main(int argc, char* argv[], char* env[])
{
	int i = 0;
	int stack[50];
	printf("stack[0]:%p\n", &stack[0]);
	printf("stack[50]:%p\n", &stack[50]);
	for(; argv[i] != NULL; ++i)
	{
		printf("argv[%d] = %s:%p\n", i,argv[i],argv[i]);
	}
	for(i = 0; env[i] != NULL; ++i)
	{
		printf("env[%d]:%p\n",i, env[i]);
	}
	return 0;
}
显示结果:

进程地址空间
结合这两个小程序我们就可以知道进程中全局变量,代码段,堆栈,命令行参数,环境变量的在内存中的布局,看下图:

进程地址空间

神奇的里纳克斯,神奇进程地址空间。^_^