一直以来对于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 <stdio.h>
void main(void)
{
;
}
Prog2:
#include <stdio.h>
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 <stdio.h>
void main(void)
{
;
}
Prog4:
#include <stdio.h>
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 <stdio.h>
void main(void)
{
;
}
Prog4:
#include <stdio.h>
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类型数据。
附:
程序的编译命令(假定C程序名为tst.c):
armcc -c -o tst.o tst.c
armlink -noremove -elf -nodebug -info totals -info sizes -map -list aa.map -o tst.elf tst.o
编译后的信息就在aa.map文件中。
ROM主要指:NAND Flash,Nor Flash
RAM主要指:PSRAM,SDRAM,SRAM,DDRAM
偏远地段————远离闹市喧嚣,尽享静谧人生
郊区乡镇————回归自然,享受田园风光
紧邻闹市————坐拥城市繁华
挨着臭水沟———绝版水岸名邸,上风上水
挖个水池子———东方威尼斯,演绎浪漫风情
地势高—————视野开阔,俯瞰全城
地势低洼————私属领地,冬暖夏凉
楼顶是圆的———巴洛克风格
楼顶是尖的———哥特式风格
户型很烂————个性化户型设计,紧跟时尚潮流
楼间距小————邻里亲近,和谐温馨
边上是荒草地——超大绿化,满眼绿意
边上有家银行——紧邻中央商务区
边上有个居委会—中心政务区核心地标
边上有家学校——浓厚人文学术氛围
边上有家诊所——拥抱健康,安享惬意
边上有家小卖店—便利生活触手可及
边上有个垃圾站—人性化环境管理
边上有火车道——交通便利,四通八达
边上什么也没有—简约生活,闲适安逸
Tags: 生活
在北京,此网站无法访问。
This is probably a temporary error.
504 Error
Tags: class, java, javascript, ror
南山滑雪场的网站做得真不错,所有滑雪场网站里做得最 web2.0
Tags: web
此次更新包含很多的组件和特性,如果 dojo, Zend_Service_twitter, Zend_Search_Lucene 组件对 Open Office Document 的支持, Zend_ProgressBar, I18N 的改进和大量的 bug fixes









看网志年会还要求我用 ie browser 来看。。。。。。
在 Zend Studio for Eclipse 时会有显示 Building PHP Project 的错误,解决的办法很简单,在 preference 里的 General 中设置 Startup and Shutdown ,把 Advanced Debugger UI Plug-in 和 PDT Debug Daemon Plug-in 的对号去掉既可。
汽车渴望公路,
花草渴望雨露,
太监迫切渴望著雄性激素。
灵魂渴望超度,
心灵渴望归宿,
而我则迫切渴望著有个媳妇。
众里寻她千百度,
踏平脚下路。
蓦然回首细环顾,
大婶大娘无数。
偶有美女光顾,
还是有夫之妇,
余下大多数,
基本不堪入目。
时间犹如脱兔,
匆匆不肯停步。
转眼就把我拖到了该当爹妈的岁数。
然而上天却挺可恶,
对我不管不顾。
把我培养的庸庸碌碌,
难以获得少女的爱慕。
我曾向月老求助,
求他将我单身的生涯结束。
而他给予我的眷顾,
竟是接踵而至的恶女和怨妇。
比起她们的飞扬跋扈,
以及对我精神上的无情屠戮,
我更愿意选择让步,
甘心走向黄泉之路。
无助,无助。
其实我并非一无是处。
我有很多的优点可以列举和陈述。
但我不知道是什么缘故,
我竟无法得到过别人的敬仰和拥护
我的爱心彰明较著,
最最热心于公益捐助。
为了祖国福利和体育事业的长足进步,、
我不知疲倦的奔波于体彩和福彩中心投注;
为了向世人体现优越的社会主义制度,
以及在党和国家的领导下我们小康的程度,
我毅然决然的增加了喝酒的次数,
终于练出了代表富足的啤酒肚;
我还坚持为人民服务,用我最大的热情为别人提供帮助。
为了让我这片心意落到实处,
我硬是把不愿过去的大娘也搀过了马路……
而我得到的赞扬却远远少于挨骂的次数。
我不明白我的努力换来的为何只是别人的不屑一顾甚至是愤怒。
是因为我过人的天赋,
让他们相形见绌,
还是我高尚的品格和气度,
让他们产生了深深的嫉妒?
我的优秀并没有让我自负,
更没有因为自己的伟大而恃才傲物。
本以为这样才能有女孩对我暗生情素,
谁知我等到现在也还没有一点迹象和眉目。
其实要把女人比做猎物,
我则是一个迷茫的猎户。
因为我实在是不懂狩猎的技术。
该跟著群雄逐鹿,
还是该继续著守株待兔,
思考了很久也没有整理出一条清晰的思路。
也许这便也成了我的桎梏,
成了我无法得到爱情的又一大因素。
或许曾经的某次时机被我奢侈的贻误,
就造成了现在的万劫不复。
咱们这个国度,
人口资源丰富。
但为何娶不到老婆的男人还是不计其数?
是因为封建思想的束缚,
打乱了男女的比例和数目,
还是因为社会的退步,
又重新开始了一夫多妻的制度?
有时想想也他妈愤怒,
你说凭啥大款就可以包养了N个情妇?
难道只为著权利和财富,
就可以不受道德的约束,
并置我们光棍于不顾,
抢占著资源无数?
怪也怪女人们过于世故,
对金钱和地位的趋之若鹜。
只知道花园洋房和别墅,
早把真情的概念颠覆。
冲动时我真恨不得变成动物,
哪怕只是头卖力的牲畜。
听凭主人的吩咐,
不用感受做人的无助。
或者干脆来个移花接木,
彻底的做个变性手术。
跑到人群中滥竽充数,
也好让同胞们多一条可以选择的出路。
街上的婚介星罗棋布。
我也曾幻想著他们能帮我打开销路。
然而最终的结果是让我明白了什么叫认贼作父,
并被婚托儿们榨干了我几年的收入。
吃不著猪蹄儿能看看猪跑也算对我心灵创伤的平复。
所以能看到美女的繁华地段成了我最爱的去处。
每当看著她们迈著款款的猫步,
在我的视线里出出入入,
我总是能感受到久违了的心跳并顺便痛心一下她们的已为人妇。
现实的打击让我鸡肠小肚。
我最看不惯情侣们当众亲密过度。
只要看到有人稍越雷池半步,
我就会上前阻止并提醒他们病出口入。
结果自然不必赘述,
我经常会体验到肢体语言的丰富。
尽管如此我也并没有减少对此事的关注,
反而更觉得有必要加大宣传的攻势和力度。
没有爱的倾注,
我如涸辙之鲋。
这样的生活确实很难让我安之若素。
看著朋友们已为人父,
小生活过的美满和睦,
我又何尝不是深深的羡慕,
并渴望著感情上的脱贫致富?
都说男儿有泪不扑簌,
但那绝对是未到伤心处。
有谁知道泪水已经多少次模糊了我心灵的窗户?
况且咱都是沧海一粟,
凭啥我就不能在爱情的海岸登陆?
只能一口一口的吃著干醋,
被动的尽著晚婚晚育的义务!
人生本来就短促,我又怎能就这样默默的虚度?
为了尽快给自己找一个归宿,
我决心不择手段的全力以赴。
错误,错误。
这种想法最终成了我难逃的劫数。
没想到我一时的慌不择路,
竟上演了那样惨绝人寰的一幕。
那是我走投无路,
勾引了有夫之妇。
谁知道罪行败露,
被人家当场抓住。
只后悔不会武术,
没能够杀出血路。
无奈的任人摆布,
惨遭了打击报复。
他们恼羞成怒,
打得义无反顾。
片刀循环往复,
板砖频频招呼。
我浑身血流如注,
俩腿还不住抽搐。
走错那罪恶一步,
差点就死不瞑目。
恐怖,恐怖。、
真庆幸我还能把命保住。
那场我自导自演的前车之覆,
带给了我贼深贼深的感触。
往事历历在目,
我此刻一一追溯。
经历了苦痛挣扎后的觉悟,
终于上升到了前所未有的高度。
问世间情为何物,
我算是大彻大悟。
感情上的事儿看来还真不能过于盲目。
是你的挡不住,
不是你的留也留不住。
别人的老婆就是再好也不能轻易接触。
有道是皮之不存毛将焉附,
我要是OVER了还上哪儿去找我的贤内助?
更何况人生短促,
还有很多东西值得我们珍惜和呵护。
爱情的光环固然眩目,
也毕竟不是生命的全部。
岁月的痕痕无孔不入。
无有爱情的皮囊苍老的更加迅速。
看著我那用蒸汽熨斗都已无法熨平的面部,
真不知还有谁肯向我将她的终身托付。
等待著等待到行将就木,
持续著持续到人生落幕。
盼望吧盼望著解决光棍待遇的法规早日颁布,
但愿啊但愿我首先踏入的能够是婚姻的坟墓。