RO段、RW段和ZI段

转载:RO段、RW段和ZI段
2009-04-02 15:23
原帖地址
Posted by gavinkwoe

一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。

要了解RO,RW和ZI需要首先了解以下知识:

ARM程序的组成

此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。

一个ARM程序包含3部分:RO,RW和ZI

RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的未初始化的变量


由以上3点说明可以理解为:
RO就是readonly,
RW就是read/write,
ZI就是zero。

ARM映像文件的组成

所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。
Image文件包含了RO和RW数据。

之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

Q:为什么Image中必须包含RO和RW?
A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。


ARM程序的执行过程

从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。

实际上,RO中的指令至少应该有这样的功能:
1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。

在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。

1 RO

看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。因此按照我们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节)。

Prog1:
#include
void main(void)
{
;
}

Prog2:
#include
const char a = 5;
void main(void)
{
;
}

Prog1编译出来后的信息如下:
============================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
============================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
============================================================

Prog2编译出来后的信息如下:
============================================================
Code RO Data RW Data ZI Data Debug
948 61 0 96 0 Grand Totals
============================================================
Total RO Size(Code + RO Data) 1009 ( 0.99kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
============================================================

以上两个程序编译出来后的信息可以看出:
Prog1和Prog2的RO包含了Code和RO Data两类数据。他们的唯一区别就是Prog2的RO Data比Prog1多了1个字节。这正和之前的推测一致。
如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。

2 RW

同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,所以两个程序之间应该是RW大小有区别。

Prog3:
#include
void main(void)
{
;
}

Prog4:
#include
char a = 5;
void main(void)
{
;
}

Prog3编译出来后的信息如下:
============================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
============================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
============================================================

Prog4编译出来后的信息如下:
============================================================
Code RO Data RW Data ZI Data Debug
948 60 1 96 0 Grand Totals
============================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
============================================================

可以看出Prog3和Prog4之间确实只有RW Data之间相差了1个字节,这个字节正是被初始化过的一个字符型变量“a”所引起的。

3 ZI

再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,这两个程序之间应该只有ZI大小有差别。
Prog3:
#include
void main(void)
{
;
}

Prog4:
#include
char a;
void main(void)
{
;
}

Prog3编译出来后的信息如下:
============================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
============================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
============================================================

Prog4编译出来后的信息如下:
============================================================
Code RO Data RW Data ZI Data Debug
948 60 0 97 0 Grand Totals
============================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
============================================================

编译的结果完全符合推测,只有ZI数据相差了1个字节。这个字节正是未初始化的一个字符型变量“a”所引起的。
注意:如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。
即:ARM C程序中,所有的未初始化变量都会被自动初始化为0。


总结:

1; C中的指令以及常量被编译后是RO类型数据。
2; C中的未被初始化或初始化为0的变量编译后是ZI类型数据。
3; C中的已被初始化成非0值的变量编译后市RW类型数据。

RO段、RW段和ZI段 转载:RO段、RW段和ZI段相关推荐

  1. 双y轴设置 颜色_项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、实时下位机数据)...

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400长期持续带来更多项目与技术分享 ...

  2. 汇编语言:编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储b段中

    题目介绍 程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储b段中. assume cs:code,ds:a,ss:ba segmentdw 1,2,3,4,5,6,7 ...

  3. 分数段统计函数c语言,Excel 五个函数统计学生期末考试分数段

    考试结束,老师们都要对学生的考试成绩进行分析.各分数段人数的统计是其中一项必做的工作.在Excel中,怎样快速准确地统计分数段人数呢?以下的方法也许对你有所帮助. 先看看原始的学生成绩表.五门功课的成 ...

  4. autocad.net 画多段线_auto CAD 二次开发 c#.net 之JIG画多段线(polyline)

    在CAD 命令中画多段线的命令为:pline.下面将介绍一种JIG画多段线的方法. 首先,来介绍一下JIG这个东西. EntityJig(实体动态预览),按照指定步骤模仿特定类型的单个实体对象.首先, ...

  5. 表字段顺序有何影响_「品味保定」炸烹虾段乾隆赞 百年保定柔雅香

    [引文]上溯先贤尧帝,保定传承已逾千载.燕赵之地.畿辅之疆.北控三关.南通九省.翅卫京师说的就是古城保定.千百年来,古城保定形成了独具特色的饮食文化,精致气派的直隶官府菜就是这种文化的结晶.品百年保定 ...

  6. 计算机专业转段考试,计算机信息技术学院完成计算机网络技术专业3+2本科转段考试工作...

    本网讯2019年4月11日,湖北工业大学-武汉船舶职业技术学院计算机网络技术专业3+2本科转段考试在教务处的协调配合下顺利完成. 根据2016年武汉船舶职业技术学院与湖北工业大学合作试点"3 ...

  7. 利用全加器实现7段数码管_简单共阴极数码管电路图大全(CD4511/段译码/驱动器)...

    共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a.b.c.d.e.f.g及dp(小数点),如下图所示.图中的8个LED分别与上面那个图中的A~DP各段相对应,通过控制各个L ...

  8. 计算机各分数段人数,Excel中求优分率、及格率及各分数段人数.doc

    Excel中求优分率.及格率及各分数段人数 Excel中求优分率及格率及各分数段人数 每次考试,我们都要对考试情况作分析,所分析的项目包括有参考班级,参考人数.平均分,合格人数.合格率.优秀人数.优秀 ...

  9. 汽机车仪表/温控器/电量显示器/无线蓝牙音箱/电力监测仪等LCD段码液晶显示屏驱动IC-VK1623 LQFP/QFP100/DICE裸片,48*8段显示,兼容替代市面上的1623,且具省电模式

    产品型号:VK1623 产品品牌:永嘉微电/VINKA 封装形式:LQFP100  QFP100  DICE裸片 产品年份:新年份 VK1623概述: VK1623是一个48x8的LCD駆动器. 可软 ...

  10. 字词句段篇章语言训练人教版上册r_《小学语文字词句段篇章八年级(上册)》...

    坠落过程 ◇吴万夫 『阅读提示』 世上有千般爱,只有母爱最伟大,即使把整个世界都拿来,也无法超越母爱的伟大.无私.珍贵. <坠落过程>以全新的视角展示了母爱的力量有多大.为了救儿子,母亲以 ...

最新文章

  1. 一个不错的shell 脚本教程 入门级
  2. 深度学习——02、深度学习入门 8-14
  3. jsp Request获取url信息的各种方法比较
  4. mysql 用户 类别_从mysql里读取用户类型
  5. 你必须懂的 T4 模板:深入浅出
  6. linux关闭gvim命令,Linux 下 8 种退出 vim 编辑器的方法
  7. Nginx、Haproxy、LVS负载均衡从原理到部署(一)
  8. 【bzoj4321】queue2 dp
  9. x86汇编语言(2) 认识8086处理器
  10. php模拟顺序栈基本操作
  11. ArcGIS中KML/KMZ转为.shp文件
  12. 四针角oled屏连接arduino_Arduino提高篇03—OLED屏图片显示
  13. 【Android面试题】准备、hr面试问题总结
  14. (CCF202109-4)收集卡牌(概率DP)
  15. 专业术语-外文首字母组词的原词组
  16. PLC学习之路001
  17. 游戏机制对IT员工激励的影响
  18. 编写函数devide(x, y),x为被除数,y为除数
  19. 开始Python学习第二课(python环境安装)
  20. Microsoft Teams对话历史记录

热门文章

  1. ios中while()和 android中的不同之处
  2. Aix iostat命令解析
  3. 三大主流开源工作流引擎技术分析与市场预测
  4. hdu-1576(A/B)
  5. MySQL的常见存储引擎介绍与参数设置调优
  6. msfvenom 摄像头
  7. 【JulyEdu-Python基础】第 8 课:Python第三方库
  8. JSPServlet学习笔记----第4章
  9. Web开发环境搭建 Eclipse-Java EE 篇
  10. W-D-S-UART编程