ARM中ZI、RO、RW的区别_第1页
ARM中ZI、RO、RW的区别_第2页
ARM中ZI、RO、RW的区别_第3页
ARM中ZI、RO、RW的区别_第4页
ARM中ZI、RO、RW的区别_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 ARM中ZI、RO、RW和CODE的区别1.0 ARM中ZI、RO、RW和CODE介绍 CODE:代码 RO:只读,相当于code在内存中的区间(即相当于code); ZI:未初始化段,例如uchar i;就放在该区 bss段。 i=5; RW:可读可写,程序运行需要占用多大内存,小于这个区间程序会出错,例如运行变量区比如i+的运行结果就在该区运行。 uchar i=5; 全局变量,静态变量。中间变量 说明:ARM程序的组成此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。一个ARM程序包含3部分:RO,RW和ZI2

2、.0 ARM程序启动过程程序通过编译器编译后生成: 我们说的代码就是code,如果想把它烧写到nor flash中或nand flash中,可以通过目标板相应开关进行切换。 如果程序烧写到nor flash中,程序运行时可不需要将代码搬移到内存中,可以直接在nor flash上面运行,当然一般需要将代码搬移到内存中,这样可以使代码执行速度加快。如果烧写到nand flash中,那么程序运行前必须将代码搬移到内存中,然后执行。下图1.1就是将程序烧写到nor flash中,然后运行之前先将其搬移到内存中(注意是sdram,不是cpu内的4k,cpu内4k内存一般仅用于启动代码的运行)中。3.0

3、ARM启动过程示意图说明 图1.1假设code为126K,ARM运行时首先通过u-boot的设置,将code从nor flash搬移到内存中,代码存放在内存的起始地址可以通过u-boot设定(启动代码设定),这里起始存放地址设定到0x33F80000开始,然后存放code,紧接存放code代码的内存区存放RW和ZI。究竟是RW紧邻code代码存放的内存空间,还是ZI紧邻code代码存放的内存空间,是由分散加载确定的(其实这个对程序运行没有任何关系,一般默认就可以了)。 图1.2可以在keil中点击魔术棒然后在linker(如图1.2所示)点击edit即可查看分散加载程序:; *; * Scat

4、ter-Loading Description File generated by uVision *; *; Run in RAMLR_ROM1 0x30000000 ; load region ER_ROM1 0x30000000 0x0200000 ; load address = execution address *.o (RESET, +First) *(InRoot$Sections) .ANY (+RO) RW_RAM1 0x30800000 0x0800000 ; RW data .ANY (+RW +ZI) RW_IRAM1 0x40000000 0x00001000 .A

5、NY (+RW +ZI) 说明:RW,ZI由分散加载设定,根据系统要求可以修改,RW,ZI先后顺序可以互换。4.0花絮: ARM9不带操作系统的启动代码和带操作系统的启动代码异同:两者功能基本上一样,都是ARM运行前的准备工作,只是不带操作系统的启动代码功能少一些,例如不需要设定启动操作系统需要的一些参数等。 信盈达 2010年11月6日以下内容来自互联网,供参考。关于code, text, bss以下文章转自armar -sizes libmjb2.aCode RO Data RW Data ZI Data Debug Object Name 292 96 2615 40 168 jblen

6、d_AMXVideo.o 316 0 0 0 1836 jblend_AamsAppInfoUtil.o 72 0 0 0 380 jblend_AamsVmCtl.o 96 0 0 0 92 jblend_ClassCheck.o 1092 0 0 0 924 jblend_FloatSupport_arm.o 0 0 0 0 0 jblend_HotRoutines0.o 2984 0 0 144 1496 jblend_HotRoutines1.o这栏目含义见下面文章或者 size libmjb2.a text data bss dec hex filename 388 2615 40

7、3043 be3 jblend_AMXVideo.o (ex libmjb2.a) 316 0 0 316 13c jblend_AamsAppInfoUtil.o (ex libmjb2.a) 72 0 0 72 48 jblend_AamsVmCtl.o (ex libmjb2.a) 96 0 0 96 60 jblend_ClassCheck.o (ex libmjb2.a) 1092 0 0 1092 444 jblend_FloatSupport_arm.o (ex libmjb2.a) 0 0 0 0 0 jblend_HotRoutines0.o (ex libmjb2.a) 2

8、984 0 144 3128 c38 jblend_HotRoutines1.o (ex libmjb2.a)代码段(text):代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作它是不可写的。数据段(data):数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配1的变量和全局变量。 BSS段:BSS段包含了程序中未初始化全局变量,在内存中 bss段全部置零。BSS是block started by symbol的缩写。因为未初始化的变量没有对应的值,所以并不需要存储

9、在可执行对象中。但是因为C标准强制规定未初始化的全局变量要被赋予特殊的默认值(基本上是0值),所以内核要从可执行代码装入变量(未赋值的)到内存中,然后将零页映射到该片内存上,于是这些未初始化变量就被赋予了0值。这样做避免了在目标文件中进行显式地初始化,减少空间浪费PS:网上当到的一篇文章,解释RO,RW,ZIARM执行文件的生成规律分析RO,RW,ZI区别 刁雪松一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解

10、写出来,希望能对大家有所帮助。要了解RO,RW和ZI需要首先了解以下知识:􀁺 ARM程序的组成此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。一个ARM程序包含3部分:RO,RW和ZIRO是程序中的指令和常量 RW是程序中的已初始化变量ZI是程序中的未初始化的变量由以上3点说明可以理解为:RO就是readonly,RW就是read/write,ZI就是zero􀁺 ARM映像文件的组成所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Im

11、age文件来称呼它。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

12、从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。􀁺 RO看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。因此按照我们之前说的,他们

13、之间应该只会在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 Debug948 60 0 96 0 Grand Totals=Total RO Size(Code + RO Data) 1008 ( 0.98kB)Total RW Size(RW Data + ZI Data) 96 ( 0.

14、09kB)Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)=Prog2编译出来后的信息如下:=Code RO Data RW Data ZI Data Debug948 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)=以上两个程序编译出来后的信息可以

15、看出:Prog1和Prog2的RO包含了Code和RO Data两类数据。他们的唯一区别就是Prog2的RO Data比Prog1多了1个字节。这正和之前的推测一致。如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。&#1048698; RW同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,所以两个程序之间应该是RW大小有区别。Prog3:#include <stdio.h>void main(void);Prog4:#include <stdio.h>char a = 5;void

16、main(void);Prog3编译出来后的信息如下:=Code RO Data RW Data ZI Data Debug948 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 Debug948 60 1 96 0 G

17、rand 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”所引起的。&#1048698; ZI再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,这两个程序之间应该只有ZI大小有差别

18、。Prog3:#include <stdio.h>void main(void);Prog4:#include <stdio.h>char a;void main(void);Prog3编译出来后的信息如下:=Code RO Data RW Data ZI Data Debug948 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 Debug948 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)=编译的结果完全符合

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论