ARM程序的镜像文件以及在内存中的分区


    最近在对程序的编译和运行机制比较感兴趣,总结了一些关于ARM生成的镜像文件和在内存中的内容,同时还有一些疑问,欢迎大家指教。
    首先,程序主要有以下三部分组成:
    RO:指程序的指令和常量(我们的代码编译后生成的是机器指令)
    RW:指程序中已经初始化的变量
    ZI:程序中未初始化的变量

   现在我们知道了程序的是由这三部分组成的,那我们生产的镜像文件(bin)又包含什么呢?
    镜像文件指的是烧录到flash中的文件只包含RO和RW部分,ZI不包含在其内。之所以image中不包含ZI,是因为ZI全部都是0,内有必要包含,只要在程序运行之前,在内存中将ZI区域的值全部清零即可,包含在flash中反而浪费空间。而RW是初始化过得
变量,这些数值不可能无中生有,所以flash中必须包含。

   下面是一个我编译后的map文件截图:
    
    
    可以看出统计结果:
    code和RO size是RO
    RAM包含了:RW data和 ZI data
    ROM包含了:code + RW + RO
    
    程序的执行过程:将RW搬运到程序的RAM区,将ZI所在的RAM区全部清零,完成这两项工作后,程序才能正常访问变量,然后CPU从flash中取指令,执行程序。

   一个程序编译后占用的内存分以下几个部分:
    1、栈区(stack)--用于存放函数的参数,局部变量等。
    2、堆区(heap)--由程序员来分配和释放的内存。
    3、全局区、静态区--包含初始化和未初始化的全局变量和静态变量。
    4、常量区--存放字符串等常量。
    5、程序代码区--存放函数的二进制代码。










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值