原创 Linux应用程序在内存中的地址布局

2015-3-2 17:03 2067 20 20 分类: MCU/ 嵌入式 文集: Linux应用程序开发学习
 在学习Linux应用程序开发中,经常会遇到以下概念:栈(Stack)、堆(heap)、BSS段(Block Started by Symbol,又名未初始化数据段)、数据段、代码段。而这些概念也是构成Linux应用程序的重要组成部分。
 内存布局
  当Linux应用程序在内存中运行时,以上组成部分又是怎样在内存中布局的呢?
  

  
lhtc3duk9prh4ddifac1no3g51_8d5d1353e9858b9d8f8b27776afd88961425286659.819.jpg

1、从低地址到高地址依次为:代码段、数据段、BSS段、堆、栈
2、堆向高内存地址增长
3、栈向低内存地址增长
4、所有的应用程序的代码段的起始地址都为0x0804 8000,此处的0x0804 8000为虚拟地址
 
一、接下来让我们通过程序验证查看程序各段地址。
编译附录中的源码  --->  运行  --->   查看进程PID(命令为:ps aux)  --->  再打开一个终端输入命令(cat /proc/2995(PID号)/maps
lhtc3duk9prh4ddifac1no3g51_d2dd9acdd5f235d0051cf992d9d1ca561425286830.8413.jpg
skitch.jpg
 
二、分析BSS段存放数据内容。通过readelf -S filename 来查看。
(zhaoxi.net).jpg
 
结论:  
          栈:局部变量(初始化的和未初始化的,但不包含局部静态变量)、局部只读变量(const)
          堆:动态分配的区域(如使用malloc函数申请的区域)
          BSS段:存储未初始化的全局变量和静态变量
          数据段:存储初始化的全局变量和静态变量
          代码段:代码、全局const常量、字符常量
附录源码:
#include
#include
int global_init = 1;//全局,初始化  数据段
int global_uninit;//全局,未初始化  数据段

static global_static_init = 1;//全局,静态,初始化  数据段
static global_static_uninit;//全局,静态,未初始化  数据段

const int global_a = 1; //全局,常量,初始化  代码段
const int global_b;//全局,常量,未初始化 数据段
int main( )
{
     int local_init = 1;//局部,初始化 栈
     int local_uninit;//局部,未初始化  栈

     static local_static_init = 1;//局部,静态,初始化  数据段
     static local_static_uninit;//局部,静态,未初始化  数据段

     const int local_a = 1;//局部,常量,初始化 数据段
     const int local_b;//局部,常量,未初始化 数据段
     int* p = (int*)malloc(10);// 动态申请内存 堆

     printf("global_init = %p \n",&global_init );
     printf("global_uninit = %p \n",&global_uninit );
     printf("global_static_init = %p \n",&global_static_init );
     printf("global_static_uninit = %p \n",&global_static_uninit );
     printf("global_a = %p \n",&global_a );
     printf("global_b = %p \n",&global_b );

     printf("local_init = %p \n",&local_init );
     printf("local_uninit = %p \n",&local_uninit );
     printf("local_static_init = %p \n",&local_static_init );
     printf("local_static_uninit = %p \n",&local_static_uninit );
     printf("local_a = %p \n",&local_a );
     printf("local_b = %p \n",&global_b );
     printf("malloc = %p\n",p );
     return 0;
}

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条