40-程序的内存布局

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:4.4.5

 

一、程序文件的一般布局

1) 不同代码可执行程序中的对应关系

g_init_v映射到.data段——变量被初始化

g_uninit_v映射到.bss段——变量没被初始化(记得看uboot代码时,bss段内存会被初始化为0) 

 

       int a = 3;和int b;不放在右边是因为没有栈和堆的存储区,右边这个表是为了映射到可执行程序。

 

二、程序与进程

1) 程序进程不同

        -    程序是静态的概念,表现形式为一个可执行文件

        -    进程是动态的概念,程序由操作系统加载运行后得到进程

        -    每个程序可以对应多个进程(多进程编程)

        -    每个进程只能对应一个程序

 

三、思考

1) 面试中的小问题

        包含脚本代码的文本文件是一种类型的可执行程序吗?如果是,对应什么样的进程呢?

        脚本是一种间接地可执行程序。答案分析下图。

 

四、程序与进程

 

五、程序文件的一般布局

1) 文件布局在内存中的映射

左图:可执行程序文件布局(编译阶段)

右图:可执行程序被加载到内存布局的结果(运行阶段)

未映射区域:用来加载特殊的可执行程序。

 

六、程序的内存布局

1) 各个段的作用

        -  堆栈段在程序运行后才正式存在,是程序运行的基础

        - .bss段存放的是未初始化的全局变量和静态变量

        - .text段存放的是程序中的可执行代码

        - .data段保存的是已经初始化了的全局变量和静态变量

        - .rodata段存放程序中的常量值,如字符串常量

 

七、程序术语的对应关系

1) 静态存储区通常指程序中的.bss.data

2) 只读存储区通常之程序中的.rodata

3) 局部变量所占空间为上的空间

4) 动态空间为堆中的空间

5) 程序可执行代码存放于.text段(if、switch等等)

 

八、思考

1) 面试中的小问题

            同是全局变量和静态变量,为什么初始化的和未初始化的保存在不同段中

提示:面试考验的是思考方式,你是如何处理问题。

 

小结:

1) 程序源码在编译后对应可执行程序中的不同存储区

2) 程序和进程不同,程序静态概念进程是动态概念

3) 堆栈段是程序运行的基础,只存在于进程空间中

4) 程序可执行代码存放于.text段,是只读的

5) .bss.data段用于保存全局变量静态变量

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值