概述
进程内存布局
操作系统的进程内存分为5个区,代码区、数据区、BSS区、堆区、栈区,更高层就是命令行参数和环境变量表,进程的内核空间与用户空间分别对应不同的内存区。
vmlayout.c
#include <stdio.h>
#include <stdlib.h>
const int const_global = 1; // 全局常量 (代码区)
static const int static_cons_global = 3; //全局静态常量 (代码区)
int init_global = 2; //全局变量 (数据区)
int not_init;//未初始全局变量 (BBS区)
int main(int argc, char *argv[], char *evms[]) { //函数 (代码区)
static const int static_const = 1; //静态局部常量 (代码区)
static int static_ = 2;//静态局部变量 (数据区)
static int static_not_init;//未初始化静态局部变量 (BBS)
const int const_ = 3;//局部常量 (栈区)
int local_ = 4;//局部变量 (栈区)
char *cstr = "abc";//字面量 (代码区)
int *m = malloc(sizeof(int));//动态分配内存 (堆区)
extern char **environ;
printf("------------------命令行、环境变量表------------------n");
printf(" 命令行环境变量表:%16pn", evms);
printf(" 环境变量表:%16pn", environ);
printf("------------------栈区------------------n");
printf(" 局部常量:%16pn", &const_);
printf(" 局部变量:%16pn", &local_);
printf("------------------堆区------------------n");
printf(" 动态分配内存:%16pn", m);
printf("------------------BBS区------------------n");
printf(" 未初始全局变量:%16pn", ¬_init);
printf("未初始化静态局部变量:%16pn", &static_not_init);
printf("------------------数据区------------------n");
printf(" 全局变量:%16pn", &init_global);
printf(" 静态局部变量:%16pn", &static_);
printf("------------------代码区------------------n");
printf(" 全局常量:%16pn", &const_global);
printf(" 全局静态常量:%16pn", &static_cons_global);
printf(" 函数:%16pn", &main);
printf(" 字面量:%16pn", cstr);
return 0;
}
编译执行后如下:
------------------命令行、环境变量表------------------
命令行环境变量表: 0x7ffeeb1f97a8
环境变量表: 0x7ffeeb1f97a8
------------------栈区------------------
局部常量: 0x7ffeeb1f9754
局部变量: 0x7ffeeb1f9750
------------------堆区------------------
动态分配内存: 0x7fbabf604100
------------------BBS区------------------
未初始全局变量: 0x104a08024
未初始化静态局部变量: 0x104a08020
------------------数据区------------------
全局变量: 0x104a08018
静态局部变量: 0x104a0801c
------------------代码区------------------
全局常量: 0x104a06cd8
全局静态常量: 0x104a06ce0
函数: 0x104a06ac0
字面量: 0x104a06ce4
从打印出来的地址可以看出从低到高的变化,代码区的地址是最小的(最底部),命令行参数的地址是最大的(最高的)。从地址来看BBS区距离堆区,以及堆区到栈区的中间隔了好几个数量级,是因为应用程序堆内存的数据动态分配的,数据存储也是最多的,所以从地址上面跨度大能指向足够多的数据。
如果要查看某个执行文件的分区大小可以使用size
命令
Darrius:Tue Sep 01 02:23:04:c_test$ size vmlayout
text data bss dec hex filename
2891 639 28 3558 de6 vmlayout
最后
以上就是霸气诺言为你收集整理的Linux进程映象的内存布局的全部内容,希望文章能够帮你解决Linux进程映象的内存布局所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复