Linux内存段的分析
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内存段的分析的更多相关文章
- linux内存源码分析 - 零散知识点
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 直接内存回收中的等待队列 内存回收详解见linux内存源码分析 - 内存回收(整体流程),在直接内存回收过程中, ...
- linux内存源码分析 - 内存回收(整体流程)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文 ...
- linux内存源码分析 - 内存压缩(同步关系)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...
- linux内存源码分析 - 内存压缩(实现流程)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 本文章最好结合linux内存管理源码分析 - 页框分配器与linux内存源码分析 -伙伴系统(初始化和申请 ...
- linux内存源码分析 - SLUB分配器概述
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB ...
- linux内存源码分析 - SLAB分配器概述【转】
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...
- linux内存源码分析 - 伙伴系统(初始化和申请页框)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前的文章已经介绍了伙伴系统,这篇我们主要看看源码中是如何初始化伙伴系统.从伙伴系统中分配页框,返回页框于伙伴系 ...
- linux内存源码分析 - SLAB分配器概述
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...
- (转)linux内存源码分析 - 内存回收(整体流程)
http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时 ...
随机推荐
- [SDOI2008][luogu2463] Sandy的卡片 [kmp]
题面 传送门 思路 这道题里面有三个主要问题: 1.由"数值相等"变成了"加上一个整数以后数值相等"(减去等价于加负数) 2.由"最多匹配多少位(从第 ...
- webstorm卡顿
http://blog.csdn.net/qq673318522/article/details/50583831 http://www.xiaobai8.com/Blog/1000.html
- Master of Sequence
Master of Sequence 时间限制: 10 Sec 内存限制: 128 MB 题目描述 There are two sequences a1,a2,...,an , b1,b2,..., ...
- Eat the Trees(hdu 1693)
题意:在n*m的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少中方法. 第一道真正意义上的插头DP,可参考陈丹琦的<基于连通性状态压缩的动态规划问题> ...
- poi导出excel文件(桃)
1.基本可以通用的工具类 package com.idcsol.apps.common.excel; import java.io.IOException; import java.io.Output ...
- [LeetCode] Minimum Depth of Binary Tree 二叉树最小深度
Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...
- 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表
一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...
- Django笔记:常见故障排除
Django框架下MySQLdb模块在python3中无法使用的问题的解决方案 由于python3环境下目前还没有官方的mysqldb模块,Django框架中又强制要求使用mysqldb,为了解决这个 ...
- UVA - 294 Divisors【数论/区间内约数最多的数的约数个数】
Mathematicians love all sorts of odd properties of numbers. For instance, they consider to be an int ...
- 某考试T1 game
题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...
