Linux_1.4_应用程序地址布局
2015-06-16 10:55
411 查看
(1)内存组成
(2)内存布局
linux所有应用程序都是从0x80480000开始,
其中0x80480000是一个虚拟地址
1)下面来测试一下应用程序的地址分布
#include <stdio.h>
#include <stdlib.h>
int global_init_a=1; //全局的,初始化的变量 : 数据段
int global_uninit_a; //全局的,没有初始化的变量 : 数据段
static int static_global_init_a = 1; //全局的,静态的,初始化的变量 : 数据段
static int static_global_uninit_a; //全局的,静态的,未初始化的变量 : 数据段
const int const_global_a = 1; //全局的,常量 : 代码段
int global_init_b=1; //全局的,初始化的变量 : 数据段
int global_uninit_b; //全局的,没有初始化的变量 : 数据段
static int static_global_init_b = 1; //全局的,静态的,初始化的变量 : 数据段
static int static_global_uninit_b; //全局的,静态的,未初始化的变量 : 数据段
const int const_global_b = 1; //全局的,常量 : 代码段
int main(void)
{
int local_init_a=1;//局部的,初始化的变量 : 栈
int local_uninit_a;//局部的,没有初始化的变量 : 栈
static int static_local_init_a = 1; //局部的,静态的,初始化的变量 : 数据段
static int static_local_uninit_a; //局部的,静态的,未初始化的变量 : 数据段
const int const_local_a = 1; //局部的,常量 : 栈
int local_init_b=1;//局部的,初始化的变量 : 栈
int local_uninit_b;//局部的,没有初始化的变量 : 栈
static int static_local_init_b = 1; //局部的,静态的,初始化的变量 : 数据段
static int static_local_uninit_b; //局部的,静态的,未初始化的变量 : 数据段
const int const_local_b = 1; //局部的,常量 : 栈
int * malloc_p_a;//局部的,指针
malloc_p_a=malloc(sizeof(int)); //通过malloc分配得到的,局部 : 堆
printf("&global_init_a=%p, global_init_a=%d\n",&global_init_a,global_init_a);
printf("&global_uninit_a=%p, global_uninit_a=%d\n",&global_uninit_a,global_uninit_a);
printf("&static_global_init_a=%p, static_global_init_a=%d\n",&static_global_init_a,static_global_init_a);
printf("&static_global_uninit_a=%p, static_global_uninit_a=%d\n",&static_global_uninit_a,static_global_uninit_a);
printf("&const_global_a=%p, const_global_a=%d\n",&const_global_a,const_global_a);
printf("&global_init_b=%p, global_init_b=%d\n",&global_init_b,global_init_b);
printf("&global_uninit_b=%p, global_uninit_b=%d\n",&global_uninit_b,global_uninit_b);
printf("&static_global_init_b=%p, static_global_init_b=%d\n",&static_global_init_b,static_global_init_b);
printf("&static_global_uninit_b=%p, static_global_uninit_b=%d\n",&static_global_uninit_b,static_global_uninit_b);
printf("&const_global_b=%p, const_global_b=%d\n",&const_global_b,const_global_b);
printf("&local_init_a=%p, local_init_a=%d\n",&local_init_a,local_init_a);
printf("&local_uninit_a=%p, local_uninit_a=%d\n",&local_uninit_a,local_uninit_a);
printf("&static_local_init_a=%p, static_local_init_a=%d\n",&static_local_init_a,static_local_init_a);
printf("&static_local_uninit_a=%p, static_local_uninit_a=%d\n",&static_local_uninit_a,static_local_uninit_a);
printf("&const_local_a=%p, const_local_a=%d\n",&const_local_a,const_local_a);
printf("&local_init_b=%p, local_init_b=%d\n",&local_init_b,local_init_b);
printf("&local_uninit_b=%p, local_uninit_b=%d\n",&local_uninit_b,local_uninit_b);
printf("&static_local_init_b=%p, static_local_init_b=%d\n",&static_local_init_b,static_local_init_b);
printf("&static_local_uninit_b=%p, static_local_uninit_b=%d\n",&static_local_uninit_b,static_local_uninit_b);
printf("&const_local_b=%p, const_local_b=%d\n",&const_local_b,const_local_b);
printf("malloc_p_a=%p, malloc_p_a=%d\n",malloc_p_a,*malloc_p_a);
while(1)
;
return 0;
}
2) 编译并运行程序,这里不过多介绍
3) 另开起一个终端
ps -axu 查看系统所有进程,找到我们刚才运行的程序./addr
cat /proc/进程PID/maps 查看内存分布情况
结果如下:
两张图的地址段对比就可以知道程序中的变量在内存中如何存放的!
已经将对比的结果写到程序的注释中了.
4)BSS段去哪里了?
1>首先查看程序的格式 file addr
由此可知应用程序addr是elf属性的文件
2> 使用readelf -S addr 来查看bss的地址段
由此可知BSS(未初始化的数据段):
全局未初始化的变量(静态的,非静态的)
局部未初始化的变量(静态的)
另一种方法:(就是麻烦点
)
先判断出所有变量的分布,再找出未初始化的数据段的变量,即属于BSS段
5) 总结:
5. BSS段:
全局未初始化的变量(静态的,非静态的)
局部未初始化的变量(静态的)
(2)内存布局
linux所有应用程序都是从0x80480000开始,
其中0x80480000是一个虚拟地址
1)下面来测试一下应用程序的地址分布
#include <stdio.h>
#include <stdlib.h>
int global_init_a=1; //全局的,初始化的变量 : 数据段
int global_uninit_a; //全局的,没有初始化的变量 : 数据段
static int static_global_init_a = 1; //全局的,静态的,初始化的变量 : 数据段
static int static_global_uninit_a; //全局的,静态的,未初始化的变量 : 数据段
const int const_global_a = 1; //全局的,常量 : 代码段
int global_init_b=1; //全局的,初始化的变量 : 数据段
int global_uninit_b; //全局的,没有初始化的变量 : 数据段
static int static_global_init_b = 1; //全局的,静态的,初始化的变量 : 数据段
static int static_global_uninit_b; //全局的,静态的,未初始化的变量 : 数据段
const int const_global_b = 1; //全局的,常量 : 代码段
int main(void)
{
int local_init_a=1;//局部的,初始化的变量 : 栈
int local_uninit_a;//局部的,没有初始化的变量 : 栈
static int static_local_init_a = 1; //局部的,静态的,初始化的变量 : 数据段
static int static_local_uninit_a; //局部的,静态的,未初始化的变量 : 数据段
const int const_local_a = 1; //局部的,常量 : 栈
int local_init_b=1;//局部的,初始化的变量 : 栈
int local_uninit_b;//局部的,没有初始化的变量 : 栈
static int static_local_init_b = 1; //局部的,静态的,初始化的变量 : 数据段
static int static_local_uninit_b; //局部的,静态的,未初始化的变量 : 数据段
const int const_local_b = 1; //局部的,常量 : 栈
int * malloc_p_a;//局部的,指针
malloc_p_a=malloc(sizeof(int)); //通过malloc分配得到的,局部 : 堆
printf("&global_init_a=%p, global_init_a=%d\n",&global_init_a,global_init_a);
printf("&global_uninit_a=%p, global_uninit_a=%d\n",&global_uninit_a,global_uninit_a);
printf("&static_global_init_a=%p, static_global_init_a=%d\n",&static_global_init_a,static_global_init_a);
printf("&static_global_uninit_a=%p, static_global_uninit_a=%d\n",&static_global_uninit_a,static_global_uninit_a);
printf("&const_global_a=%p, const_global_a=%d\n",&const_global_a,const_global_a);
printf("&global_init_b=%p, global_init_b=%d\n",&global_init_b,global_init_b);
printf("&global_uninit_b=%p, global_uninit_b=%d\n",&global_uninit_b,global_uninit_b);
printf("&static_global_init_b=%p, static_global_init_b=%d\n",&static_global_init_b,static_global_init_b);
printf("&static_global_uninit_b=%p, static_global_uninit_b=%d\n",&static_global_uninit_b,static_global_uninit_b);
printf("&const_global_b=%p, const_global_b=%d\n",&const_global_b,const_global_b);
printf("&local_init_a=%p, local_init_a=%d\n",&local_init_a,local_init_a);
printf("&local_uninit_a=%p, local_uninit_a=%d\n",&local_uninit_a,local_uninit_a);
printf("&static_local_init_a=%p, static_local_init_a=%d\n",&static_local_init_a,static_local_init_a);
printf("&static_local_uninit_a=%p, static_local_uninit_a=%d\n",&static_local_uninit_a,static_local_uninit_a);
printf("&const_local_a=%p, const_local_a=%d\n",&const_local_a,const_local_a);
printf("&local_init_b=%p, local_init_b=%d\n",&local_init_b,local_init_b);
printf("&local_uninit_b=%p, local_uninit_b=%d\n",&local_uninit_b,local_uninit_b);
printf("&static_local_init_b=%p, static_local_init_b=%d\n",&static_local_init_b,static_local_init_b);
printf("&static_local_uninit_b=%p, static_local_uninit_b=%d\n",&static_local_uninit_b,static_local_uninit_b);
printf("&const_local_b=%p, const_local_b=%d\n",&const_local_b,const_local_b);
printf("malloc_p_a=%p, malloc_p_a=%d\n",malloc_p_a,*malloc_p_a);
while(1)
;
return 0;
}
2) 编译并运行程序,这里不过多介绍
3) 另开起一个终端
ps -axu 查看系统所有进程,找到我们刚才运行的程序./addr
cat /proc/进程PID/maps 查看内存分布情况
结果如下:
两张图的地址段对比就可以知道程序中的变量在内存中如何存放的!
已经将对比的结果写到程序的注释中了.
4)BSS段去哪里了?
1>首先查看程序的格式 file addr
由此可知应用程序addr是elf属性的文件
2> 使用readelf -S addr 来查看bss的地址段
由此可知BSS(未初始化的数据段):
全局未初始化的变量(静态的,非静态的)
局部未初始化的变量(静态的)
另一种方法:(就是麻烦点
)
先判断出所有变量的分布,再找出未初始化的数据段的变量,即属于BSS段
5) 总结:
5. BSS段:
全局未初始化的变量(静态的,非静态的)
局部未初始化的变量(静态的)
相关文章推荐
- linux系统添加根证书 linux证书信任列表
- linux 安装pnp时出现了一些错误
- linux系统相关命令
- Windows/Linux下引用jar包,并用javac/java编译运行
- linux命令三:chmod
- linux防火墙iptables详细教程
- linux命令二:chgrp
- linux指令一chown
- CentOS6.x升级MySQL版本5.1到5.6
- Linux账号管理与ACL权限设置
- linux设备模型 底层
- 【解决】 CentOS6.6安装Cloudera Manager5.4的问题
- 初学linux
- linux设备模型 上层
- 生产服务器环境最小化安装后 Centos 6.5优化配置备忘
- Linux中IIC总线驱动分析
- 通过虚拟机给Linux添加一块磁盘,挂载到相应的目录下
- linux 统计swap被那些进场占用
- 使用linux访问windows共享文件的两种方法
- Linux 驱动之并发控制 (信号量、原子锁和自旋锁)