標(biāo)題: SMT32:ARM編譯中的RO、RW和ZI DATA區(qū)段 [打印本頁]
作者: xiaoliu 時(shí)間: 2014-11-10 22:24
標(biāo)題: SMT32:ARM編譯中的RO、RW和ZI DATA區(qū)段
一、ARM程序(指在ARM系統(tǒng)中正在執(zhí)行的程序,而非保存在ROM中的bin文件)的組成
一個(gè)ARM程序包含3部分:RO段,RW段和ZI段
RO是程序中的指令和常量
RW是程序中的已初始化變量
ZI是程序中的未初始化的變量
由以上3點(diǎn)說明可以理解為:
RO就是readonly,
RW就是read/write,
ZI就是zero
二、ARM映像文件的組成
所謂ARM映像文件就是指燒錄到ROM中的bin文件,也成為image文件。以下用Image文件來稱呼它。Image文件包含了RO和RW數(shù)據(jù)。之所以Image文件不包含ZI數(shù)據(jù),是因?yàn)閆I數(shù)據(jù)都是0,沒必要包含,只要程序運(yùn)行之前將ZI數(shù)據(jù)所在的區(qū)域一律清零即可。包含進(jìn)去反而浪費(fèi)存儲空間。
三、
Q:為什么Image中必須包含RO和RW?
A:因?yàn)镽O中的指令和常量以及RW中初始化過的變量是不能像ZI那樣“無中生有”的。
ARM程序的執(zhí)行過程
從以上兩點(diǎn)可以知道,燒錄到ROM中的image文件與實(shí)際運(yùn)行時(shí)的ARM程序之間并不是完全一樣的。
因此就有必要了解ARM程序是如何從ROM中的image到達(dá)實(shí)際運(yùn)行狀態(tài)的。
實(shí)際上,RO中的指令至少應(yīng)該有這樣的功能:
1. 將RW從ROM中搬到RAM中,因?yàn)镽W是變量,變量不能存在ROM中。
2. 將ZI所在的RAM區(qū)域全部清零,因?yàn)閆I區(qū)域并不在Image中,所以需要程序根據(jù)編譯器給出的ZI地址及大小來將相應(yīng)得RAM區(qū)域清零。
ZI中也是變量,同理:變量不能存在ROM中。在程序運(yùn)行的最初階段,RO中的指令完成了這兩項(xiàng)工作后C程序才能正常訪問變量。否則只能運(yùn)行不含變量的代碼。
說了上面的可能還是有些迷糊,RO,RW和ZI到底是什么,下面我將給出幾個(gè)例子,最直觀的來說明RO,RW,ZI在C中是什么意思。
1; RO
看下面兩段程序,他們之間差了一條語句,這條語句就是聲明一個(gè)字符常量。因此按照我們之前說的,他們之間應(yīng)該只會在RO數(shù)據(jù)中相差一個(gè)字節(jié)(字符常量為1字節(jié))。
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)
================================================================================
以上兩個(gè)程序編譯出來后的信息可以看出:
Prog1和Prog2的RO包含了Code和RO Data兩類數(shù)據(jù)。他們的唯一區(qū)別就是Prog2的RO Data比Prog1多了1個(gè)字節(jié)。
這正和之前的推測一致。如果增加的是一條指令而不是一個(gè)常量,則結(jié)果應(yīng)該是Code數(shù)據(jù)大小有差別。
2; RW
同樣再看兩個(gè)程序,他們之間只相差一個(gè)“已初始化的變量”,按照之前所講的,已初始化的變量應(yīng)該是算在RW中的,
所以兩個(gè)程序之間應(yīng)該是RW大小有區(qū)別。
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之間確實(shí)只有RW Data之間相差了1個(gè)字節(jié),這個(gè)字節(jié)正是被初始化過的一個(gè)字符型變量“a”所引起的。
3; ZI
再看兩個(gè)程序,他們之間的差別是一個(gè)未初始化的變量“a”,從之前的了解中,應(yīng)該可以推測,
這兩個(gè)程序之間應(yīng)該只有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)
================================================================================
編譯的結(jié)果完全符合推測,只有ZI數(shù)據(jù)相差了1個(gè)字節(jié)。這個(gè)字節(jié)正是未初始化的一個(gè)字符型變量“a”所引起的。
注意:如果一個(gè)變量被初始化為0,則該變量的處理方法與未初始化華變量一樣放在ZI區(qū)域。
即:ARM C程序中,所有的未初始化變量都會被自動(dòng)初始化為0。
總結(jié):
1; C中的指令以及常量被編譯后是RO類型數(shù)據(jù)。
2; C中的未被初始化或初始化為0的變量編譯后是ZI類型數(shù)據(jù)。
3; C中的已被初始化成非0值的變量編譯后市RW類型數(shù)據(jù)。
附:
程序的編譯命令(假定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
以上摘自(原文不知何處):
http://hi.baidu.com/smallwormsea/blog/item/08e40a17cc22520a4a90a7a1.html
另外,
1、你會發(fā)現(xiàn):ROM Size不等于RO和RW的總和,原因是這里使用了RW數(shù)據(jù)壓縮,LInker默認(rèn)把下載到ROM的重復(fù)的RW數(shù)據(jù)壓縮。如下表,可見,原本的316B的RW被壓縮為108B,也正如上文開頭說的那樣,Image文件(下載到ROM的文件)是沒有包括ZI的,所以這里由2692B變成實(shí)際下載到ROM的0B。
2、其中inc.data為內(nèi)聯(lián)數(shù)據(jù)(inline data),是包含在code里面的,如文字池、短字符串,這個(gè)與RO data很相似的,但是和RO Data有什么區(qū)別呢?(現(xiàn)在可以確定的是const數(shù)據(jù)歸為RO data,但明顯不只有const數(shù)據(jù),難道還有‘長字符串’??待查)
3、如上文介紹,下載到單片機(jī)上的image文件只包括RO和RW,沒有包括ZI,這就是所謂的加載區(qū)(LR),但是程序運(yùn)行 時(shí)候需要重新建立映像的會生產(chǎn)一個(gè)ZI,這個(gè)就是所謂的執(zhí)行區(qū)(ER)
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
14014 3494 1954 316 2692 384984 Grand Totals
14014 3494 1954 108 2692 384984 ELF Image Totals(compressed)
14014 3494 1954 108 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 15968 ( 15.59kB)
Total RW Size (RW Data + ZI Data) 3008 ( 2.94kB)
Total ROM Size (Code + RO Data + RW Data) 16076 ( 15.70kB)
==============================================================================
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |