博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内存段的分析
阅读量:5061 次
发布时间:2019-06-12

本文共 2889 字,大约阅读时间需要 9 分钟。

    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
 

转载于:https://www.cnblogs.com/qxj511/p/5084103.html

你可能感兴趣的文章
10个让你忘记 Flash 的 HTML5 应用演示
查看>>
8个Python面试必考的题目,小编也被坑过 ToT
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
centos 图形界面和命令行界面切换(转载)
查看>>
Maven启用代理访问
查看>>
Primary definition
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
发送请求时params和data的区别
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
一步步学习微软InfoPath2010和SP2010--第七章节--从SP列表和业务数据连接接收数据(4)--外部项目选取器和业务数据连接...
查看>>
如何增强你的SharePoint 团队网站首页
查看>>
FZU 1914 Funny Positive Sequence(线性算法)
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
基于grunt构建的前端集成开发环境
查看>>
MySQL服务读取参数文件my.cnf的规律研究探索
查看>>
java string(转)
查看>>
__all__有趣的属性
查看>>
BZOJ 5180 [Baltic2016]Cities(斯坦纳树)
查看>>