在linux中,进程映像可以在/proc/$pid/map看到代码段、堆、共享库、栈等的地址范围
1、程序时报存在磁盘上的可执行文件。
2、运行程序时,需要将可执行文件加载到内存,形成进程。
3、一个程序(文件)可以同时存在多个进程(内存)。
4、进程在内存空间中的布局就是进程映像。
基于intel处理器,从低地址到高地址依次为:
代码区(text):可执行指令(函数)、字面值常量(10,20,3.14)、具有常属性的全局和静态局部变量(带const)。只读。(强行修改会导致段错误)
数据区(data):初始化的全局和静态局部变量。
BSS区 :未经初始化的全局和静态局部变量。进程一经加载此区即被清0.
以上两区统称全局区或静态区。
堆区(heap):动态分配内存。从低地址向高地址扩展。
栈区(stack):非静态局部变量(包括带常属性的局部变量),包括函数和参数的返回值,从高地址向低地址扩展。
栈区和堆区之间存在一块间隙,
一方面为堆和栈增长预留空间,同时共享库、共享内存等亦位于此。
命令行参数与环境区:命令行参数和环境变量。
2.4、进程映像
//map.c
#include <stdio.h>
#include <stdlib.h>
const int const_global = 0; //常全局变量 (代码段)
int init_global = 0; //初始化全局变量 (数据段)
int uninit_global; //未初始化的全局变量 (bss段)
int main(int argc ,char* argv[]){ //mian函数也在代码段
const static init const_static = 0 ; //常静态变量 (代码段)
static int init_static = 0; //初始化静态变量 (数据段)
static int uninit_static; //未初始化的静态变量 (bss段)
const int const_local = 0; //常局部变量 (栈)
int prec_local; //前局部变量,高到低扩展
int next_local; //后局部变量
int* prev_heap = malloc(size_of(int)); //前堆变量,低到高扩展
int* next_heap = malloc(size_of(int)); //后堆变量
const char* literal = "literal"; //字面值常量 (代码段)
extern char ** environ; //环境变量
printf("地址:%p",&environ); //依次打印每个变量的地址
return 0;
}
输出结果图如下(2-5):
2.4、进程映像 2.4、进程映像
网友评论