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应用程序内存布局相关推荐

  1. 深入理解C程序内存布局

    1.堆和栈的区别,堆和栈的最大限制 堆主要用来分配动态内存,操作系统提供了malloc等内存分配机制来供程序员进行堆内存的分配,同时,堆内存的释放需要程序员来进行.malloc分配的是虚拟地址空间,和 ...

  2. linux程序内存布局,关于Linux中程序的内存布局

    我有一些关于Linux中的程序的内存布局的问题. 我知道从各种来源(我正在读"从头开始编程"),每个部分都加载到它自己的内存区域. 文本部分首先在虚拟地址0x8048000处加载, ...

  3. linux系统进程的内存布局

    内存管理模块是操作系统的心脏:它对应用程序和系统管理非常重要.今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕.由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Lin ...

  4. 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 ...

  5. Linux启动检测内存条错误,linux检测程序内存泄漏和内存错误

    在linux的开发程序的时候,可以很方便的使用valgrind这个工具方便检测内存泄漏和内存错误. 安装很方便: debian(如ubuntu) sudo apt-get install valgri ...

  6. linux跑程序内存不够,linux 未跑程序 内存 cache使用过大(示例代码)

    linux与windows不同,会存在缓存内存,通常叫做Cache Memory.有些时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存会很少,此时查看Linux系统 /proc ...

  7. 08 内存分配和程序内存布局

    1 Memory Model 类型 描述 大小 int 整形数字 4B short 整形数字 2B long 整形数字 8B char 字符 1B float 浮点型 4B double 浮点型 8B ...

  8. Linux上程序调试的基石(2)--GDB

    3. GDB的实现  GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序.可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况.它的实现也是基于ptrace系统调用来完成的. ...

  9. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

最新文章

  1. Spring之注解方式实例化Java类
  2. Spring jdbc的搭建
  3. 信息系统项目管理师:第二三章:信息系统项目管理基础与立项管理
  4. 求细胞数量pascal题解
  5. 我的世界卸载java_我的世界:官方移除了Herobrine?一个骗了玩家十年的谎言!...
  6. MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例
  7. P5494-[模板]线段树分裂
  8. 从 Linux 源码看 Socket 的阻塞和非阻塞
  9. cvpr 深度估计_CVPR再现黑科技!你还在相信“眼见为实”?
  10. 解决placeholder样式设置无效问题,更改placeholder默认样式颜色
  11. yum安装virtualbox_CentOS7安装virtualbox
  12. C语言mutex使用案例,C语言 如何使用互斥锁严格交替使用两个线程?
  13. php后台代码自动生成程序,Thinkphp自定义代码生成工具及用法说明(附下载地址)...
  14. 数值范围_涉及数值范围的答复及撰写建议
  15. CxImage 使用报错解决办法
  16. 扫普通二维码打开小程序配置详情
  17. java 鸭子类_Python:多态、协议和鸭子类型
  18. java 抽象final_java抽象、接口 和final
  19. INSERT插入表记录
  20. 2020.10.28----HashMap

热门文章

  1. Kafka使用脚本根据时间重置消费位移,格式你写对了么?
  2. java面向对象程序设计 习题答案_Java面向对象程序设计习题解答与实验 张桂珠.pdf...
  3. 【云周刊】第156期:首帧秒开+智能鉴黄+直播答题,阿里云直播系统背后技术大起底...
  4. 飘零无影 --------------我喜欢这个网名..
  5. 移动端 viewport
  6. ARM架构二 ARMv5T架构简介
  7. plot参数详解python_matplotlib.pyplot.plot()参数详解
  8. 对 Ubuntu_18.04 安装之后出现的WIFI,亮度,声音问题的解决
  9. Clickhouse的多种连接方式
  10. Meta-INF文件的创建