在学习Linux应用程序开发中,经常会遇到以下概念:栈(Stack)、堆(heap)、BSS段(Block Started by Symbol,又名未初始化数据段)、数据段、代码段。而这些概念也是构成Linux应用程序的重要组成部分。
内存布局
当Linux应用程序在内存中运行时,以上组成部分又是怎样在内存中布局的呢?
1、从低地址到高地址依次为:代码段、数据段、BSS段、堆、栈
2、堆向高内存地址增长
3、栈向低内存地址增长
4、所有的应用程序的代码段的起始地址都为0x0804 8000,此处的0x0804 8000为虚拟地址
一、接下来让我们通过程序验证查看程序各段地址。
编译附录中的源码 ---> 运行 ---> 查看进程PID(命令为:ps aux) ---> 再打开一个终端输入命令(cat /proc/2995(PID号)/maps
二、分析BSS段存放数据内容。通过readelf -S filename 来查看。
结论:
栈:局部变量(初始化的和未初始化的,但不包含局部静态变量)、局部只读变量(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条评论)
登录后参与讨论