我是靠谱客的博主 霸气诺言,最近开发中收集的这篇文章主要介绍Linux进程映象的内存布局,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

进程内存布局

操作系统的进程内存分为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", &not_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进程映象的内存布局所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部