linux下进程内存布局及变量存储位置检查

Posted ilove-haha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下进程内存布局及变量存储位置检查相关的知识,希望对你有一定的参考价值。

进程的内存布局如下(虚拟内存):

              技术图片

它们分别从低地址向高地址增长

在linux中,存在三个全局符号:etext, edata, end分别指向文本段,初始化数据段,未初始化数据段结尾处的下一字节的地址。

所以我们可以在c程序中声明这些变量,然后定义一些变量再查看其地址是否在对应的地址范围内,可得出其变量被存储在哪个区中。

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

extern char etext, edata, end;

int a = 10;

void func()
{
    int d = 666; //
    printf("func =  %p
", func);  //文本段
    printf("局部变量d, &d =    %p
", &d);
}

int main()
{
    int b = 100;  //栈区
    
    int *p = (int*)&edata;

    int *c = (int*)malloc(sizeof(int));  //

    *c = 99;

    printf("etext = %10p
edata = %10p
end =   %10p
", &etext, &edata, &end);

    printf("全局变量a, &a =    %p
", &a);
    printf("局部变量b, &b =    %p
", &b);
    printf("堆分配的内存, &(*c) = %p
", &(*c));
    printf("main  = %p
", main);

    printf("a = %d
", *(--p));

    func();
    
    return 0;
}

输出如下:

etext =   0x557ed79928ed
edata = 0x557ed7b93014
end =    0x557ed7b93018
全局变量a, &a =  0x557ed7b93010
局部变量b, &b =  0x7fff14f77454
堆分配的内存, &(*c) = 0x557ed7f6e260
main  = 0x557ed799275f
a = 10
func =  0x557ed79926fa
局部变量d, &d = 0x7fff14f77434                                

可以看出:

对于main: 0x557ed799275f

  func:  0x557ed79926fa , 它们的地址都小于

 etext:     0x557ed79928ed

所以可知main和func函数,都存储在文本区中。

全局变量a : 0x557ed7b93010

大于etext  : 0x557ed79928ed

小于edata: 0x557ed7b93014

所以知道初始化的全局变量a在初始化数据区中,

其它以此类推。

 

以上是关于linux下进程内存布局及变量存储位置检查的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程虚拟内存空间布局/ Linux 下虚拟内存的分布

linux进程内存布局

Linux下C程序的存储空间布局

Linux下C程序的存储空间布局

Linux内存体系及文件系统

Linux下C程序的内存布局