【Linux】应用程序内存段布局
一、各段内存布局
内存布局图

1.BSS段(Block Started by Symbol)未初始化段
2.linux ELF base address is 0x8048000
应用程序虚拟地址起始地址均为0x8048000
3.堆向高内存地址生长
4.栈向低内存地址生长
P.S.
// 查看进程ID 图片
ps aux

cat /proc/3794/maps

代码段——只读r 可执行x
起始地址必为0x8048000
二、数据存放位置
- 分析数据存放位置
对比即可

结论
1.代码段:代码,全局常量(const)、字符串常量
2.数据段(广义数据段,含BSS段):全局变量(初始化以及未初始化的)、静态变量(全局的和局部的、初始化的以及未初始化的)
3.堆:动态分配的区域
4.栈:局部变量(初始化以及未初始化的,但不包含静态变量)、局部只读变量(const)
动手尝试即可
#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()
{
int local_init_a = 1; //Stack 栈
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\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\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",&malloc_p_a,malloc_p_a);
while(1);
return 0;
}
三、BSS段
- (Block Started by Symbol)未初始化段
- 利用readelf –S 程序名 分析BSS段
- elf 为可执行文件类型

【Linux】应用程序内存段布局的更多相关文章
- Linux C程序内存空间
linux下内存空间布置: 一个典型的Linux C程序内存空间由如下几部分组成: 代码段(.text).这里存放的是CPU要执行的指令.代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段 ...
- Linux应用程序的地址布局
转载自:http://blog.csdn.net/embedded_hunter http://www.360doc.com/content/12/0405/00/1671317_200882538. ...
- linux C 程序内存布局
参考: 1. http://www.cnblogs.com/clover-toeic/p/3754433.html 2. http://www.cnblogs.com/jacksu-tencent/p ...
- linux结束程序内存不会马上释放的解决方法
Linux下频繁读写文件时,内存资源被耗尽,当程序结束后,内存不会释放需要清除缓存.Linux缓存有dentry,buffer cache,page cache. 注:Dentry用来加速文件路径 ...
- linux系统进程的内存布局
内存管理模块是操作系统的心脏:它对应用程序和系统管理非常重要.今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕.由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Lin ...
- C程序内存分配
在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中.这个沙盘就是虚拟地址空间(virtual address space),在32位模式下它总是一个4GB的内存地址块.这些虚拟地址通过页 ...
- c程序内存模型
这篇文章主要记录一下c程序运行时内存空间如何使用.(摘抄自网络) 在一个多任务操作系统中的每个进程都运行在它自己的内存“沙箱”中.这个沙箱是一个虚拟地址空间(virtual address space ...
- Unix下C程序内存泄露检测工具:valgrind的安装使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
- linux应用程序地址布局,王明学learn
linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...
随机推荐
- 洛谷 P3182 [HAOI2016]放棋子(错排问题)
题面 luogu 题解 裸的错排问题 错排问题 百度百科:\(n\)个有序的元素应有\(n!\)个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排:有的叫重排.如,1 2的错 ...
- ZOJ Monthly, January 2019 I Little Sub and Isomorphism Sequences(set 妙用) ZOJ4089
写这篇博客来证明自己的愚蠢 ...Orz 飞机 题意:给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构 题解:经过一些奇思妙想后 ,你可以发现问题是传 ...
- HDU4499
In Chinese Chess, there is one kind of powerful chessmen called Cannon. It can move horizontally or ...
- selenium原理和尝试
引用文章:https://www.cnblogs.com/Albert-Lee/p/6238866.html Selenium是一个自动化测试框架.因为它能够模拟人工操作,比如能在浏览器中点击按钮.在 ...
- lxc 容器基础配置篇
一, 首先配置lxc需要的网卡断 吧eth0复制一份变为br0 配置br0 配置eth0 重启网卡 /etc/init.d/network restart 安装lxc软件 需要epel源--- y ...
- URL篇之URL
URL(统一资源定位)是网络上使用的资源定位的方案,它是URI(由URL和URN组成)的子集. URL的通用格式 <scheme>://<user>:<password& ...
- DNS服务器设置
1,域名解析:ip能够访问,但是域名不能访问. 2,配置好网络之后,切换到命令行模式,配置好的网络便不能用了. 具体方法: 打开vim /etc/sysconfig/network-scripts/i ...
- Thinkphp基于规则的Auth权限认证类
PS:onethink是基于该权限认证类实现,Auth类作为官方类库,在Library\Think里面. 其实Auth类也是基于角色访问控制RBAC扩展的,具体到节点的权限校验方式还是需要根据业务 ...
- 第一章:hybrid app开发之技术选型
伴随着移动互联网的兴起,越来越多的企业将部分资源投入其中,想在互联网+的大潮中分一杯羹,并期望着站在风口上,成为时代的弄潮儿. 现在不会做一个app都不好意思说是搞互联网的,那么开发一个app的方式有 ...
- Java for循环的几种用法分析
J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...