Linux 应用程序的内存分配中,是用 segment(段)进行区别的,使用 size 命令进行查看:

size a.out
text data bss dec hex filename
1639 264 8 1911 777 a.out

    可见,数据是分配 text 段,data 段,bss 段,这里使用size 命令的查看只能是看到这三个段的大小(编译的阶段就可以确定下来)而,堆、栈则是在运行的时候动态去分配空间的。

一、Linux 段的分配

text:代码段,存储代码、常量、字符串等只读的数据

data: 数据段,保存的是有经过初始化的全局变量和静态变量的部分。这里的初始化,初始化的值必须不能为零

bss: bss 段,保存的是没有经过初始化的全局变量、静态变量和初始化的值为零的全局变量和静态变量。

堆(heap): 用于动态内存的分配额哦,程序猿手动调用 malloc 进行分配和释放。

栈(stack):存放局部变量和函数的参数等。

 

二、内存分配

    Linux 下可执行文件是安装段的方式进行管理的,一个可执行的文件是按照如下的方式进行映射:

                                    

2.1、a.out 文件的介绍

    一个可执行的文件,window 平台是通过 .exe 或者 .txt 等后缀的方式进行区分的,但是Linux 下的可执行文件则是通过一些特定的、神气的数字进行表示的。

    一个可执行的文件是通过一些数字唯一地表示是可执行的文件,通过这样的方法达到标签的目的,这些数字我们称之为神气的数字,而这些数组是通过能够被确认下来的,一组随机的二进制位的集合。

2.2、映射

    一个可执行的文件,就按照可执行文件的段,进行映射到内存中的。

    段,实质上就是一段连续的虚拟内存地址空间。这里需要注意的是,在最低的地址的位置存在一部分未被映射的区域,虽然它是在进程的地址空间内,但是并未被赋予物理地址,所以对这块区域的引用都是违法的。在典型的情况下,它是从零地址开始的几 K 字节,它用于捕捉使用空指针和小整型的指针应用内存的情况(摘自C专家编程)。

二、大小的比对

计算 size a.out 的大小

原始的大小;

int main()
{
printf("hellow world\n");
}
text data bss dec hex filename
1132 256 8 1396 574 a.out


 

1、局部变量是存储在栈中:


 
int main()
{
int a;
printf("hellow world\n");
}
~
text data bss dec hex filename
1132 256 8 1396 574 a.out


 

2、局部变量(局部数组)也是存储在栈中:

int main()
{
int a;
int b[100];
printf("hellow world\n");
}
text data bss dec hex filename
1132 256 8 1396 574 a.out


 

3、字符串(常量是存储在text中)

int main()
{
int a;
int b[100] = L"qxj511";
printf("hellow world\n");
}
text data bss dec hex filename
1639 256 8 1903 76f a.out


 

4、没有经过初始化的静态变量是存储在 BSS 段中:


 
int main()
{
int a;
int b[100] = L"qxj511";
static c;
printf("hellow world\n");
}
text data bss dec hex filename
1639 256 12 1907 773 a.out


 

5、经过初始化的静态变量是存储在 data 段中:

int main()
{
int a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow world\n");
}
text data bss dec hex filename
1639 260 8 1907 773 a.out


 

6、没有经过初始化的全部变量存储在 bss 端中:

int d;
int main()
{
int a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow world\n");
}
text data bss dec hex filename
1639 260 12 1911 777 a.out


 

7、经过初始化的全局变量存储在 data 段中:

int d = 1;
int main()
{
int a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow world\n");
}
text data bss dec hex filename
1639 264 8 1911 777 a.out


Linux内存段的分析的更多相关文章

  1. linux内存源码分析 - 零散知识点

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 直接内存回收中的等待队列 内存回收详解见linux内存源码分析 - 内存回收(整体流程),在直接内存回收过程中, ...

  2. linux内存源码分析 - 内存回收(整体流程)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文 ...

  3. linux内存源码分析 - 内存压缩(同步关系)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...

  4. linux内存源码分析 - 内存压缩(实现流程)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 本文章最好结合linux内存管理源码分析 - 页框分配器与linux内存源码分析 -伙伴系统(初始化和申请 ...

  5. linux内存源码分析 - SLUB分配器概述

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB ...

  6. linux内存源码分析 - SLAB分配器概述【转】

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...

  7. linux内存源码分析 - 伙伴系统(初始化和申请页框)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前的文章已经介绍了伙伴系统,这篇我们主要看看源码中是如何初始化伙伴系统.从伙伴系统中分配页框,返回页框于伙伴系 ...

  8. linux内存源码分析 - SLAB分配器概述

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...

  9. (转)linux内存源码分析 - 内存回收(整体流程)

    http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时 ...

随机推荐

  1. g2o初始化一些

    今天看了一下智能指针的东西,发现更简单的思路: 就是Block和solver构造时,需要传递unique_ptr,那我们将普通指针转换成unique_ptr不就可以了么: // 初始化g2o //第一 ...

  2. shell变量的数值计算

    shell中常见的算术运算命令如下 1.(())  用于整数运算的常用运算符,效率很高 2.let 用于整数运算,类似于  (()) 3.expr  可用于整数计算,但还有很多其他的额外功能 4.bc ...

  3. cf 487E Tourist

    题目大意 给定\(n\)个点\(m\)条边的无向连通图,无重边 每个点有点权 两个操作: 1.单点点权修改 2.询问从x到y的简单路径中,路径经过点的最小值的最小值时多少 (简单路径指经过每一个点至多 ...

  4. kernel thread vs user thread

    The most important difference is they use different memory, the kernel mode thread can access any ke ...

  5. C#后台无刷新页面弹出alert方法

    原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 无刷新弹出警告:        ScriptManager.RegisterStartupScript(this. ...

  6. [LeetCode] Count and Say 字符串

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  7. dubbo框架的简单介绍

    以下的官网的介绍. dubbo是SOA.小例子是简单的远程调用(生产者消费者的模式出现).http://blog.csdn.net/huangyekan/article/details/4217267 ...

  8. JMeter性能测试常用之事务控制器实例

    通常进行性能测试时,我们一般仅考虑主要的数据返回,不考虑页面渲染所需要的数据(例如:css.js.图片等).但当我们需要衡量打开一个页面(页面渲染完成)的性能时,我们就需要考虑完成页面渲染所需要的图片 ...

  9. 洛谷——P3183 [HAOI2016]食物链

    P3183 [HAOI2016]食物链 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形 ...

  10. Jenkins错误“to depth infinity with ignoreexternals:true”问题解决

    试下以下解决方法: 1.可能是SVN插件版本过低导致,升级SVN插件. 2.可能是构建时自己手动修改了代码,而SVN检出时无法覆盖导致的错误,可以先删除jenkins检出的代码,然后再检出一次去构建. ...