linux应用程序内存布局
1.linux应用程序内存布局
- 从低地址到高地址分别为:代码段、数据段、BSS段、堆、栈
- 对向高内存地址生长,栈想低内存地址生长
- linux中所有的应用程序都是这个布局,每个应用程序都是从0x80480000这个地址开始的,这样冲突吗?不冲突,因为这个地址是一个虚拟地址,linux中每个应用程序都有自己的虚拟地址空间。
2.2.查看linux中应用程序内存布局
方 法:通过查看应用程序进程中的进程地址映射文件实现。
例如查看2053号进程的内存布局
命令如下:cat /proc/2053/maps
结果如下:
上图中第一行是代码段,因为代码段可读可执行但不可写,从中也可以看出该程序的起始地址是0x80480000。
第二行是数据段的内存地址范围。
第三行是堆的内存地址范围。
最后一行是栈的内存地址范围。
3.linux中变量所在内存位置分析
我们通过下面的程序来分析各种变量在程序中的内存位置。
文件名:addr.c
#include <stdio.h>
#include <stdlib.h>int A; //全局未初始化变量
int B = 2; //全局初始化变量
int static C; //全局静态未初始化变量
int static D = 4; //全局静态初始化变量
int const E = 5; //全局常量int main()
{int *m_addr;int a; //局部未初始化变量int b = 2; //局部初始化变量int static c; //局部静态未初始化变量int static d = 4;//局部静态初始化变量int const e =5; //局部常量m_addr = malloc(sizeof(int));printf("A_global_addr = %0x\n",&A);printf("B_global_init_addr = %0x\n",&B);printf("C_global_static_addr = %0x\n",&C);printf("D_global_static_init_addr = %0x\n",&D);printf("E_global_const_addr = %0x\n",&E);printf("\n");printf("a_addr = %0x\n",&a);printf("b_init_addr = %0x\n",&b);printf("c_static_addr = %0x\n",&c);printf("d_static_initaddr = %0x\n",&d);printf("e_const_addr = %0x\n",&e);printf("m_addr = %p\n",m_addr);while(1);return 0;
}
- 程序执行后的结果:
- 查看该程序进程的maps得到该应用程序的内存分布如下
- 通过以上两幅图片的比对得出:
代码段 | E |
---|---|
数据段 | A、B、C、D、c、d |
堆 | m_addr |
栈 | a、b、e |
总结:各个段存放的数据类型
栈:局部变量(初始化或者未初始化)或者局部常量(const) |
---|
堆:动态分配空间(malloc) |
数据段:全局变量(初始化或者未初始化),静态变量(static) |
代码段:全局常量(const) |
4. 关于bss段
- 使用readelf工具查看该段地址空间。
- readelf -S (可执行程序名)
例如该应用程序:readelf -S addr
查看结果:
第25号,就是bss段的内存地址范围0x080498c0~0x080498d4(其空间大小为14B)
bss段:A、C、c
总结:
bss段存放的是未初始化的数据(变量),只要是存放在数据段(大概念)又没有初始化的就存在这里。
linux应用程序内存布局相关推荐
- 深入理解C程序内存布局
1.堆和栈的区别,堆和栈的最大限制 堆主要用来分配动态内存,操作系统提供了malloc等内存分配机制来供程序员进行堆内存的分配,同时,堆内存的释放需要程序员来进行.malloc分配的是虚拟地址空间,和 ...
- linux程序内存布局,关于Linux中程序的内存布局
我有一些关于Linux中的程序的内存布局的问题. 我知道从各种来源(我正在读"从头开始编程"),每个部分都加载到它自己的内存区域. 文本部分首先在虚拟地址0x8048000处加载, ...
- linux系统进程的内存布局
内存管理模块是操作系统的心脏:它对应用程序和系统管理非常重要.今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕.由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Lin ...
- C/C++程序内存布局(data段,bss段,text段)以及static关键字详解
目录 1.内存布局 1.1 data段(可读可写) 1.2 text段(只读) 1.3 bss段(可读可写) 1.4 堆区 1.5 栈区 1.6全局区/静态区 1.7 字符串常量区 1.8 代码区 1 ...
- Linux启动检测内存条错误,linux检测程序内存泄漏和内存错误
在linux的开发程序的时候,可以很方便的使用valgrind这个工具方便检测内存泄漏和内存错误. 安装很方便: debian(如ubuntu) sudo apt-get install valgri ...
- linux跑程序内存不够,linux 未跑程序 内存 cache使用过大(示例代码)
linux与windows不同,会存在缓存内存,通常叫做Cache Memory.有些时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存会很少,此时查看Linux系统 /proc ...
- 08 内存分配和程序内存布局
1 Memory Model 类型 描述 大小 int 整形数字 4B short 整形数字 2B long 整形数字 8B char 字符 1B float 浮点型 4B double 浮点型 8B ...
- Linux上程序调试的基石(2)--GDB
3. GDB的实现 GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序.可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况.它的实现也是基于ptrace系统调用来完成的. ...
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
最新文章
- Spring之注解方式实例化Java类
- Spring jdbc的搭建
- 信息系统项目管理师:第二三章:信息系统项目管理基础与立项管理
- 求细胞数量pascal题解
- 我的世界卸载java_我的世界:官方移除了Herobrine?一个骗了玩家十年的谎言!...
- MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例
- P5494-[模板]线段树分裂
- 从 Linux 源码看 Socket 的阻塞和非阻塞
- cvpr 深度估计_CVPR再现黑科技!你还在相信“眼见为实”?
- 解决placeholder样式设置无效问题,更改placeholder默认样式颜色
- yum安装virtualbox_CentOS7安装virtualbox
- C语言mutex使用案例,C语言 如何使用互斥锁严格交替使用两个线程?
- php后台代码自动生成程序,Thinkphp自定义代码生成工具及用法说明(附下载地址)...
- 数值范围_涉及数值范围的答复及撰写建议
- CxImage 使用报错解决办法
- 扫普通二维码打开小程序配置详情
- java 鸭子类_Python:多态、协议和鸭子类型
- java 抽象final_java抽象、接口 和final
- INSERT插入表记录
- 2020.10.28----HashMap
热门文章
- Kafka使用脚本根据时间重置消费位移,格式你写对了么?
- java面向对象程序设计 习题答案_Java面向对象程序设计习题解答与实验 张桂珠.pdf...
- 【云周刊】第156期:首帧秒开+智能鉴黄+直播答题,阿里云直播系统背后技术大起底...
- 飘零无影 --------------我喜欢这个网名..
- 移动端 viewport
- ARM架构二 ARMv5T架构简介
- plot参数详解python_matplotlib.pyplot.plot()参数详解
- 对 Ubuntu_18.04 安装之后出现的WIFI,亮度,声音问题的解决
- Clickhouse的多种连接方式
- Meta-INF文件的创建