国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 10294|回復(fù): 6
打印 上一主題 下一主題

(ZT)RO和RW還有ZI代表什么?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2009-7-23 10:32:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)鍵詞: 代表
(轉(zhuǎn)自[url]http://hi.baidu.com/hhjj1201/blog/item/297ab931972011ad5edf0ec1.html)[/url]
一般而言,一個(gè)程序包括只讀的代碼段和可讀寫的數(shù)據(jù)段。在ARM的集成開發(fā)環(huán)境中,只讀的代碼段和常量被稱作RO段(ReadOnly);可讀寫的全局變量和靜態(tài)變量被稱作RW段(ReadWrite);RW段中要被初始化為零的變量被稱為ZI段(ZeroInit)。對(duì)于嵌入式系統(tǒng)而言,程序映象都是存儲(chǔ)在Flash存儲(chǔ)器等一些非易失性器件中的,而在運(yùn)行時(shí),程序中的RW段必須重新裝載到可讀寫的RAM中。這就涉及到程序的加載時(shí)域和運(yùn)行時(shí)域。簡單來說,程序的加載時(shí)域就是指程序燒入Flash中的狀態(tài),運(yùn)行時(shí)域是指程序執(zhí)行時(shí)的狀態(tài)。對(duì)于比較簡單的情況,可以在ADS集成開發(fā)環(huán)境的ARMLINKER選項(xiàng)中指定RO BASE和RWBASE,告知連接器RO和RW的連接基地址。對(duì)于復(fù)雜情況,如RO段被分成幾部分并映射到存儲(chǔ)空間的多個(gè)地方時(shí),需要?jiǎng)?chuàng)建一個(gè)稱為“分布裝載描述文件”的文本文件,通知連接器把程序的某一部分連接在存儲(chǔ)器的某個(gè)地址空間。需要指出的是,分布裝載描述文件中的定義要按照系統(tǒng)重定向后的存儲(chǔ)器分布情況進(jìn)行。在引導(dǎo)程序完成初始化的任務(wù)后,應(yīng)該把主程序轉(zhuǎn)移到RAM中去運(yùn)行,以加快系統(tǒng)的運(yùn)行速度。
什么是arm的映像文件,arm映像文件其實(shí)就是可執(zhí)行文件,包括bin或hex兩種格式,可以直接燒到rom里執(zhí)行。在axd調(diào)試過程中,我們調(diào)試的是axf文件,其實(shí)這也是一種映像文件,它只是在bin文件中加了一個(gè)文件頭和一些調(diào)試信息。映像文件一般由域組成,域最多由三個(gè)輸出段組成(RO,RW,ZI)組成,輸出段又由輸入段組成。所謂域,指的就是整個(gè)bin映像文件所處在的區(qū)域,它又分為加載域和運(yùn)行域。加載域就是映像文件被靜態(tài)存放的工作區(qū)域,一般來說flash里的 整個(gè)bin文件所在的地址空間就是加載域,當(dāng)然在程序一般都不會(huì)放在flash里執(zhí)行,一般都會(huì)搬到sdram里運(yùn)行工作,它們?cè)诒话岬絪dram里工作所處的地址空間就是運(yùn)行域。我們輸入的代碼,一般有代碼部分和數(shù)據(jù)部分,這就是所謂的輸入段,經(jīng)過編譯后就變成了bin文件中ro段和rw段,還有所謂的zi段,這就是輸出段。對(duì)于加載域中的輸出段,一般來說ro段后面緊跟著rw段,rw段后面緊跟著zi段。在運(yùn)行域中這些輸出段并不連續(xù),但rw和zi一定是連著的。zi段和rw段中的數(shù)據(jù)其實(shí)可以是rw屬性。
   | Image$$RO$$Base| |Image$$RO$$Limit| |Image$$RW$$Base||Image$$ZI$$Base| |Image$$ZI$$Limit|這幾個(gè)變量是編譯器通知的,我們?cè)趍akefile文件中可以看到它們的值。它們指示了在運(yùn)行域中各個(gè)輸出段所處的地址空間| Image$$RO$$Base|就是ro段在運(yùn)行域中的起始地址,|Image$$RO$$Limit|是ro段在運(yùn)行域中的截止地址。其它依次類推。我們可以在linker的output中指定,在 simple模式中,ro base對(duì)應(yīng)的就是|Image$$RO$$Base|,rw base對(duì)應(yīng)的是|Image$$RW$$Base|,由于rw和zi相連,|Image$$ZI$$Base| 就等于|Image$$ZI$$limit|.其它的值都是編譯器自動(dòng)計(jì)算出來的。
    下面是2410啟動(dòng)代碼的搬運(yùn)部分,我給出注釋
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
adr r0, ResetEntry;   ResetEntry是復(fù)位運(yùn)行時(shí)域的起始地址,在boot
nand中一般是0
ldr r2, BaseOfROM;
cmp r0, r2
ldreq r0, TopOfROM;TopOfROM=0x30001de0,代碼段地址的結(jié)束
beq InitRam
ldr r3, TopOfROM
;part 1,通過比較,將ro搬到sdram里,搬到的目的地址從 | Image$$RO$$Base| 開始,到|Image$$RO$$Limit|結(jié)束
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0;

;part 2,搬rw段到sdram,目的地址從|Image$$RW$$Base| 開始,到|Image$$ZI$$Base|結(jié)束
sub r2, r2, r3;r2=0
sub r0, r0, r2   
InitRam ;carry rw to baseofBSS
ldr r2, BaseOfBSS ;TopOfROM=0x30001de0,baseofrw
ldr r3, BaseOfZero ;BaseOfZero=0x30001de0
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
;part 3,將sdram zi初始化為0,地址從|Image$$ZI$$Base|到|Image$$ZI$$Limit|
mov r0, #0;init 0
ldr r3, EndOfBSS;EndOfBSS=30001e40
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
沙發(fā)
 樓主| 發(fā)表于 2009-7-23 10:34:00 | 只看該作者
關(guān)于ro(rw)的問答  收藏
http://bbs.edw.com.cn/dispbbs.as ... age=1&skin=0&Star=1

請(qǐng)?jiān)俳忉屢粋(gè)關(guān)于ADS中ro/rw base的疑惑(已查閱資料)!

首先說一下,我認(rèn)為我還是看了不少的資料,然后再來問這個(gè)問題的,看起來下面我寫的很多,其實(shí)我只是想把問題描述清楚一點(diǎn),我認(rèn)為我已經(jīng)寫的比較詳細(xì)了,所以應(yīng)該不會(huì)耽誤各位大俠多少時(shí)間,所以希望能耐心看完,謝謝 !

我的CPU是4510,我在各種資料上都看過相關(guān)的解釋:
-ro-base address(即設(shè)定Image$$RO$$Base--我的理解)
這個(gè)選項(xiàng)將包含有RO(Read-Only屬性)輸出段的加載地址和運(yùn)行地址設(shè)置為address,
該地址必須是字對(duì)齊的,如果沒有指定這個(gè)選項(xiàng),則默認(rèn)的RO基地址值為0x8000。
-rw-base address
這個(gè)選項(xiàng)設(shè)置包含RW(Read/Write屬性)輸出段的域的運(yùn)行時(shí)地址,該地址必須是字對(duì)
齊的。

Image$$RO$$Base is the address of the read-only execution region (usually
contains code and read-only data).--ro運(yùn)行時(shí)地址

Image$$RW$$Base is the address of the read-write execution region (usually
contains data).--rw運(yùn)行時(shí)地址

所以大致意思,我是知道的,不過在還是在有幾個(gè)問題想不明白:

    問題1、就是這個(gè)設(shè)定的Image$$RO$$Base與我們復(fù)位時(shí)CPU讀取第一條指令的 0x0 地址有什么關(guān)系?這個(gè)“Image$$RO$$Base”到底又設(shè)定了那些源代碼的運(yùn)行起始地址?比如在一個(gè)Bootloader中,往往包含同時(shí)包含匯編代碼和C語言代碼兩部分,這個(gè)“Image$$RO$$Base”只設(shè)定了C語言中RO段的運(yùn)行地址 ?(拷貝RO RW段代碼到Image$$RO$$Base,Image$$RW$$Base標(biāo)識(shí)的位置是我的bootloader 匯編代碼進(jìn)入C前做的最后一件事)
    如果說也設(shè)定了匯編中ro部分代碼的運(yùn)行地址,那問題2又怎么解釋 ?

    問題2、有人說“請(qǐng)注意,將工程編譯為燒入Flash的二進(jìn)制代碼時(shí),需要將鏈接器重新設(shè)置,將調(diào)試時(shí)程序空間定位地址(RO Base地址)改為0x00000000”,但我明明剛剛編譯的Bootloader就將ro base設(shè)為了0xf00000,現(xiàn)在我已將其燒寫入Flash中測(cè)試過,Bootloader運(yùn)行良好,而且在上電時(shí)Flash首先被映射到0地址開始的地方,這與設(shè)定的0xf00000差的很遠(yuǎn),當(dāng)然在程序?qū)⑦M(jìn)入C語言前,會(huì)remap SDRAM到0~16M空間,并將RO RW段拷貝到Image$$RO$$Base,Image$$RW$$Base標(biāo)識(shí)的位置,問題是這個(gè)拷貝之前我的所有代碼(比如SDRAM初始化,remap,堆棧初始化等)都運(yùn)行的很正常,這又怎么解釋呢?
    這樣一來我到有個(gè)奇怪的想法就是,如果我的程序沒有C語言代碼,豈不是就可以不用管這個(gè)ro base的設(shè)置?因?yàn)閺囊婚_機(jī)到拷貝ro/rw段前,我所有的匯編代碼執(zhí)行良好。

    問題3、我的vector.S中復(fù)位入口“ResetEntry”的部分代碼如下,用AXD載入ADS編譯的這個(gè).bin文件的時(shí)候可以看到,這個(gè) “ResetEntry”標(biāo)號(hào)開始的代碼被編譯到了.bin文件的最前面,因?yàn)槲以阪溄釉O(shè)置里面把reset section放在了img的最前面。我有點(diǎn)不明白就是這個(gè)“ResetEntry”標(biāo)號(hào)代表著的一個(gè)地址與Image$$RO$$Base又有什么關(guān)系?與復(fù)位時(shí)CPU讀取第一條指令的 0x0 地址又有什么關(guān)系?因?yàn)槲业腂ootloader在拷貝ro段代碼時(shí)用到了這個(gè)標(biāo)號(hào),同時(shí)我的Bootloader代碼也并不是真正放在Flash的起始部分(即開機(jī)的0地址處),只是在0地址處放了一條跳轉(zhuǎn)到Flash的高端,再執(zhí)行哪里存放的Bootloader代碼。

            AREA reset, CODE, READONLY
ENTRY
           ;復(fù)位和上電啟動(dòng)的入口
ResetEntry
           b SYS_RST_HANDLER
           b UDF_INS_HANDLER
.........................................


    4、我在AXD調(diào)試程序時(shí)還發(fā)現(xiàn),調(diào)試過程中我可以把ADS生成的.bin文件載入SDRAM中任何位置,然后修改pc值執(zhí)行之,不論你的 Image$$RO$$Base,Image$$ROW$$Base設(shè)定在什么地方,當(dāng)然我的這個(gè)調(diào)試的程序肯定沒有對(duì)ro/rw段做任何的拷貝操作。這讓我更對(duì)RW段運(yùn)行時(shí)地址和Image$$ROW$$Base的關(guān)系感到疑惑,因?yàn)閞w段中不是保存有程序需要的變量或數(shù)據(jù)么?Image$$ROW$$Base設(shè)定了rw段的運(yùn)行地址,那豈不是也就設(shè)定了運(yùn)行時(shí)變量或數(shù)據(jù)在內(nèi)存中的存在位置?那我用AXD加載的這個(gè)程序又在哪里獲得的程序運(yùn)行需要的變量和數(shù)據(jù)呢 ?

    上面的問題其實(shí)一直就困擾了我好久,不過因?yàn)轫?xiàng)目方面比較急,所以也就一直放在哪里沒有對(duì)其深究,現(xiàn)在稍微有點(diǎn)空,才放到網(wǎng)上來,請(qǐng)各位解惑,非常感謝 !
    我的表達(dá)能力也不怎么好,上面的問題也許有點(diǎn)羅嗦,如果還有什么沒有說清楚的也希望能提出來,3KS  ag !


********************************************************************************************

四個(gè)問題其實(shí)就是一個(gè),即鏈接器到底指定了什么東西。簡單地說,linker把對(duì)函數(shù)的調(diào)用轉(zhuǎn)成向某一地址的跳轉(zhuǎn),把對(duì)變量的讀寫轉(zhuǎn)成對(duì)某一地址的訪問。

但是,一段正在執(zhí)行的代碼本身,從本質(zhì)上來說,并不需要知道自己運(yùn)行在什么地址。只要PC指針有一個(gè)初值(比如0x0),然后每次加4之后,能取到下一條指令就行了。與此相關(guān)的另一個(gè)概念就是PIC(Position Independent Code,與位置無關(guān)的代碼)。

只有當(dāng)代碼中調(diào)用了函數(shù),向某個(gè)symbol跳轉(zhuǎn)或訪問了變量,才需要知道真實(shí)的地址。所以Image$$RO$$Base是否起作用,并不取決于C代碼和匯編代碼的區(qū)別,而在于PIC與PDC的區(qū)別。
********************************************************************************************

版主和TALISKER已經(jīng)回答了樓主的問題。我也說說自己的看法,希望對(duì)你有幫助。
1. Image$$RO$$Base is the address of the read-only execution region
   你仔細(xì)琢磨RO BASE的意思,RO BASE指定的只是RO段的起始地址,注意:并沒
   有說始第一條指令的地址。所以,如果你的程序包括多個(gè)段的時(shí)候,有可能別
   的段放到了RO BASE指定的地址上,而并不是期望執(zhí)行的第一條指令。在調(diào)試
   的時(shí)候,這不會(huì)造成什么問題,因?yàn)镈EBUGGER會(huì)把PC指向程序的第一條指令。
   如果你把程序燒寫到FLASH里面后,這可能會(huì)造成問題,因?yàn)镃PU在RESET后只
   從地址0x0處開始取指令。所以,如果你寫一個(gè)程序,期望程序從地址0x0開始
   執(zhí)行,要滿足兩個(gè)條件:1-RO BASE要為0x0,2-告訴linker,把包括你希望
   執(zhí)行的第一天指令SECTION鏈接到RO段的最前面。
  
2. 對(duì)于你說到的第二個(gè)問題,為什么你把RO BASE設(shè)置為0xF0000000還能從地址
   0x0開始執(zhí)行?這是因?yàn)?510的地址繞卷問題造成的,其實(shí)地址0xF0000000就是
   地址0x0,不信你可以自己測(cè)試一下,從地址0xF00000讀出來的指令和地址0x0
   的指令一樣。所以,你的第二個(gè)問題不是問題,這和RO BASE沒什么關(guān)系。
  
3. 前面說過了,一個(gè)程序包括了RO段,但程序可能包括了很多個(gè)SECTION,在編譯
   的時(shí)候,各個(gè)section的RO段都是被鏈接到你指定的RO BASE開始的地方的,這
   就涉及到另外一個(gè)問題:在RO段里面,你怎么安排各個(gè)sedtion在RO段的順序?
   如果你寫的是BOOTLOADER的話,你必須要把包括你要執(zhí)行的第一條指令的段放
   在最前面,這樣才能保證板子上電后能正常運(yùn)行。
  
4. 我不知道你的程序里面是否有RW段?程序分為RO段和RW段,但并不是每個(gè)程序
   都一定有RW段,如果你的程序里面沒有全局變量等,那編譯后,肯定是沒有RW
   段的,在這種情況下,你不進(jìn)行RW段的拷貝,程序也能正常運(yùn)行的。OK,在來
   看看你的問題,你說在編譯生成bin文件后,在bin文件里如何定位RW段?答案
   是:單單依賴bin文件是無法定位RW段的。所以 - 如果你的程序有RW段的話,
   你必須在自己程序里面處理RW段的拷貝。
********************************************************************************************

首先謝謝各位兄弟、大哥的回復(fù),非常感謝 !

其次針對(duì)各位的回復(fù),再綜合我所知道的別人給的解釋,我想再談一下我自己現(xiàn)在的想法:
to Talisker:我不知道你想設(shè)定ro base在0x04的意思是什么?

to Twentyone:
針對(duì)你的回答1:
“在調(diào)試的時(shí)候,這不會(huì)造成什么問題,因?yàn)镈EBUGGER會(huì)把PC指向程序的第一條指令!保艺{(diào)試的時(shí)候采用的是ADW載入ADS編譯的二進(jìn)制bin文件的方式,所以pc值或bin文件載入地址都是由我指定的,但都與ro base設(shè)定的值不同。
針對(duì)你的回答2:“對(duì)于你說到的第二個(gè)問題,為什么你把RO BASE設(shè)置為0xF0000000還能從地址0x0開始執(zhí)行?這是因?yàn)?510的地址繞卷問題造成的,其實(shí)地址0xF0000000就是地址 0x0”---你說的沒錯(cuò),0xF0000000地址最終會(huì)對(duì)應(yīng)到0地址,不過我是將ro base設(shè)在了0xf00000,即15M內(nèi)存的地方,而調(diào)試使用的obey xxx.ini命令將0~16M的內(nèi)存都分配給了SDRAM,所以將ro base 設(shè)在0xf00000,還沒有到地址卷繞的地方。
針對(duì)你的回答4:
我調(diào)試的程序首先是比較簡單,那是不錯(cuò),不過變量肯定是有的,不論全局、局部變量,都有 !是一個(gè)同時(shí)包含串口和IO口簡單測(cè)試的程序。
板凳
 樓主| 發(fā)表于 2009-7-23 10:34:18 | 只看該作者
另外有人回答說:

解答問題1&2:這說明你的bootloader是基于相對(duì)地址的,也就是說與地址無關(guān),而這也是對(duì)bootloader的一個(gè)基本要求。一般的bootloader都設(shè)計(jì)成地址無關(guān)的。

解答問題4:這說明你的程序比較小,或者函數(shù)調(diào)用不復(fù)雜,堆棧操作不頻繁等。也就是說,不按照你的設(shè)置的ro和rw基址調(diào)入程序,有可能數(shù)據(jù)空間不夠,或者代碼和數(shù)據(jù)重疊,程序執(zhí)行就可能出錯(cuò)。

------我看這個(gè)回答好像是對(duì)的,不知道各位對(duì)此有什么理解或看法 ?

********************************************************************************************
Twentyone:

文后附的是一個(gè)測(cè)試程序,這個(gè)程序可以驗(yàn)證RW的影響。
測(cè)試的之前,你把你的板子的MEMORY給配置好,把SDRAM配置到地址0X0開始的地方。

測(cè)試1:程序的RO_BASE = 0x0,RW_BASE不設(shè)置,你用仿真器單步運(yùn)行程序,然后觀察
內(nèi)存0x800的內(nèi)容變化,變化順序應(yīng)該是0x0 -> 0x1 -> 0x2 ... -> 0x9

測(cè)試2:程序的R0_BASE不變,還是RO_BASE = 0x0,RW_BASE設(shè)置為0x400,單步運(yùn)行程
序,觀察內(nèi)存0x800的內(nèi)容變化,看看結(jié)果和第一次測(cè)試的是否一樣

我:

我試過了,也基本上清楚了,按照你的實(shí)驗(yàn)設(shè)定測(cè)試2會(huì)看到0x800地址的數(shù)據(jù)不規(guī)則的變化,我又看了一下對(duì)應(yīng)的匯編代碼(我是指編譯后的匯編代碼),發(fā)現(xiàn)程序在讀取array數(shù)組值時(shí),是從rw base開始的地方讀取數(shù)據(jù)的,因此如果一開始沒有將rw段放到rw base開始的地方,則程序執(zhí)行后讀取的數(shù)據(jù)肯定是不對(duì)的,這也符合rw base本身的意思,現(xiàn)在我應(yīng)該說是徹底的清楚了,謝謝 !
    我以前的問題是:我在程序中使用變量前首先就先改變了變量的值,因此RW段首先就被我程序先修改了,也就是說雖然我沒有搬移RW 段的操作,但是我重新修改了rw base開始的數(shù)據(jù)的值,對(duì)應(yīng)到你的這個(gè)測(cè)試程序,也就是說本來我沒做搬移RW段的操作,則0x400地址開始的數(shù)據(jù)(在你這個(gè)測(cè)試程序中存放的是 array數(shù)組的值)是不確定的,但后來程序一開始我就修改了array數(shù)組的數(shù)據(jù),也即修改了0x400開始的數(shù)據(jù),因此RW段雖然我沒有搬移操作,但其實(shí)也就被我重新設(shè)定正確了,然后再讀取使用,當(dāng)然執(zhí)行起來,當(dāng)然就沒有什么問題了,不過這里有一點(diǎn):就是我的程序本來就比較小,RW段也很小,所以沒有什么問題,但如果程序大一點(diǎn),RW段太大,我不能夠一一重新指定,那程序就會(huì)出錯(cuò)了,問題解決,非常感謝 !
    不過關(guān)于RO段的問題:RO base 設(shè)定值與bin程序載入值不同,但程序仍能正確執(zhí)行的問題 。
    我想可能只能用我得代碼都是“地址無關(guān)”的這個(gè)來解釋了,對(duì)吧 ?
    這東西有點(diǎn)絞,不知道我上面的表達(dá)清楚沒? 呵呵,如果沒什么問題,我想就把上面這段話轉(zhuǎn)到電子產(chǎn)品世界去了,然后我那個(gè)帖子也就可以方封貼了,呵呵,不過真的非常感謝你的幫助,謝謝 !

Twentyone:

不用客氣!

你說的很清楚,你的理解是正確的,關(guān)于RO_BASE的問題,如果程序完全運(yùn)行正確的話
,只能用與地址無關(guān)來解釋。

如果你想做一個(gè)RO_BASE的測(cè)試的話,你可以寫一個(gè)測(cè)試程序,在程序里面包括一些絕
對(duì)尋址的指令,你就會(huì)發(fā)現(xiàn)程序運(yùn)行時(shí)用不同的RO_BASE的話,運(yùn)行會(huì)有問題的(可能
不影響結(jié)果,但中間肯定是有地方和你期望的不一樣的)。


ft,忘了貼代碼了,Twentyone大俠的測(cè)試程序如下:

init.s:

AREA    Init, CODE, READONLY
CODE32
ENTRY
ARM
LDR SP, =0xC00
IMPORT CTEST
B    CTEST
END


test.c:

unsigned int array[] = {0,1,2,3,4,5,6,7,8,9};

int CTEST(void)
{
int i;
unsigned int base;
i = 0;
base = 0x800;
for(i = 0; i < 10; i++){
  *((unsigned int*)(base)) = array[i];
}
return 0;
}
地板
 樓主| 發(fā)表于 2009-7-23 10:37:04 | 只看該作者
|Image$$RO$$Limit||Image$$RW$$Base||Image$$ZI$$Ba|

引自http://hi.baidu.com/liudefang888 ... 0ecc3b86947378.html

對(duì)于剛學(xué)習(xí)ARM的人來說,如果分析它的啟動(dòng)代碼,往往不明白下面幾個(gè)變量的含義:|Image$$RO$$Limit|、|Image$$RW$$Base|、|Image$$ZI$$Base|。

首先申明我使用的調(diào)試軟件為ADS1.2,當(dāng)我們把程序編寫好以后,就要進(jìn)行編譯和鏈接了,在ADS1.2中選擇MAKE按鈕,會(huì)出現(xiàn)一個(gè)Errors and Warnings 的對(duì)話框,在該欄中顯示編譯和鏈接的結(jié)果,如果沒有錯(cuò)誤,在文件的最后應(yīng)該能看到Image component sizes,后面緊跟的依次是Code,RO Data ,RW Data ,ZI Data ,Debug 各個(gè)項(xiàng)目的字節(jié)數(shù),最后會(huì)有他們的一個(gè)統(tǒng)計(jì)數(shù)據(jù):

Code 163632 ,RO Data 20939 ,RW Data 53 ,ZI Data 17028

Tatal RO size (Code+ RO Data)             184571 (180.25kB)

Tatal RW size(RW Data+ ZI Data)           17081(16.68 kB)

Tatal ROM size(Code+ RO Data+ RW Data)   184624(180.30 kB)

后面的字節(jié)數(shù)是根據(jù)用戶不同的程序而來的,下面就以上面的數(shù)據(jù)為例來介紹那幾個(gè)變量的計(jì)算。

在ADS的Debug Settings中有一欄是Linker/ARM Linker,在output選項(xiàng)中有一個(gè)RO base選項(xiàng),下面應(yīng)該有一個(gè)地址,我這里是0x0c100000,后面的RW base 地址是0x0c200000,然后在Options選項(xiàng)中有Image entry point ,是一個(gè)初始程序的入口地址,我這里是0x0c100000 。

有了上面這些信息我們就可以完全知道這幾個(gè)變量是怎么來的了:

|Image$$RO$$Base| = Image entry point = 0x0c100000 ;表示程序代碼存放的起始地址

|Image$$RO$$Limit|=程序代碼起始地址+代碼長度+1=0x0c100000+Tatal RO size+1

= 0x0c100000 + 184571 + 1 = 0x0c100000 +0x2D0FB + 1

= 0x0c12d0fc

|Image$$RW$$Base| = 0x0c200000 ;由RW base 地址指定

|Image$$RW$$Limit| =|Image$$RW$$Base|+ RW Data 53 = 0x0c200000+0x37(4的倍數(shù),0到55,共56個(gè)單元)

=0x0c200037

|Image$$ZI$$Base| = |Image$$RW$$Limit| + 1 =0x0c200038

|Image$$ZI$$Limit| = |Image$$ZI$$Base| + ZI Data 17028

                            =0x0c200038 + 0x4284

                            =0x0c2042bc

也可以由此計(jì)算:

|Image$$ZI$$Limit| = |Image$$RW$$Base| +TatalRWsize(RWData+ZIData) 17081

                            =0x0c200000+0x42b9+3(要滿足4的倍數(shù))

                            =0x0c2042bc
地下室
 樓主| 發(fā)表于 2009-7-23 10:38:07 | 只看該作者
這是一位用戶的問題,這里轉(zhuǎn)發(fā)一下答復(fù)(也是摘自北航書“44binit.s初始化程序研究”一節(jié)中的一部分內(nèi)容)

一個(gè)簡易的映像文件包括以下幾個(gè)部分:
○ 一個(gè)只讀(RO)區(qū)域;
○ 一個(gè)讀寫(RW)區(qū)域;
○ 一個(gè)被0初始化(ZI)的區(qū)域。
我們采用如下的方法,在鏈接器中指定每個(gè)區(qū)域在執(zhí)行時(shí)的定位地址:
-RO-base   exec_address1    指示鏈接器將只讀(RO)區(qū)域定位在exec_address1地址處(例如,定位在ROM空間的起始地址上);
-RW-base   exec_address2   指示鏈接器將讀寫(RW)區(qū)域定位在exec_address2地址處。
在RW(數(shù)據(jù))區(qū)域中,也可能含有程序代碼,這是因?yàn)槌绦蛴袝r(shí)候需要自我修改(或產(chǎn)生新的代碼),類似的,RO(代碼)區(qū)域中可能包含只讀的數(shù)據(jù)(例如字符串,常數(shù)等)。
鏈接器在創(chuàng)建上述區(qū)域的同時(shí)產(chǎn)生相應(yīng)的“符號(hào)”并把地址信息傳遞給這些符號(hào),從而允許將區(qū)域從它的加載地址拷貝到執(zhí)行地址。這些符號(hào)描述了每個(gè)區(qū)域的起始地址和大小限制。這些符號(hào)的列舉和定義,請(qǐng)參考附圖。

在這里,exec_address1是RO區(qū)域的執(zhí)行地址,它與RO區(qū)域在代碼加載時(shí)的地址相同。exec_address2是RW的代碼執(zhí)行地址,它與RW區(qū)在加載時(shí)的地址是不一樣的,RW在加載時(shí)是緊接在R0區(qū)域后面的,因此在C程序執(zhí)行之前,它必須被移到正確的地址上去。同時(shí),ZI區(qū)域也必須重新創(chuàng)建(因?yàn)樵诩虞d階段,不存在ZI區(qū)域)。

在一個(gè)簡單的image里面:
Image$$RO$$Base:是RO段的執(zhí)行地址開始和裝載地址開始,由-RO-BASE這個(gè)參數(shù)指定的
Image$$RO$$Limit:是RO段的裝載地址結(jié)束的后一個(gè)地址,也就是RW的裝載地址的開始。(在一個(gè)simple image里面,裝載的時(shí)候,RO段被裝載在-RO-BASE指定的地址,后面緊跟著的是RW的數(shù)據(jù),注意,在simple image執(zhí)行的時(shí)候,因?yàn)閞o段的裝載地址和執(zhí)行地址相同,所以不需要移動(dòng),而RW的執(zhí)行地址是由-RW-BASE指定的,所以需要移動(dòng)。
Image$$RW$$Base:是rw段的執(zhí)行地址,由-rw-base這個(gè)參數(shù)指定!
總結(jié)一下:
沒運(yùn)行前:flash中的ro段是ro-base指定的地址開始,等ro段完了(也就是Image$$RO$$Base~Image$$RO$$limit-1),后面緊接著就是rw段(也就是Image$$RO$$limit~。。。)!
運(yùn)行時(shí):flash中的ro段地址沒有動(dòng),還是Image$$RO$$Base~Image$$RO$$limit-1,原來flash中的rw段移到了sdram中,地址為Image$$RW$$Base~Image$$ZI$$Base,然后又初始化了一段ZI區(qū)!
呵呵!寫點(diǎn)這個(gè)就當(dāng)和我一樣的弱人共勉吧!如有不對(duì)之處,請(qǐng)大家指正!共同進(jìn)步

在一個(gè)簡單的image里面:
Image$$RO$$Base:是RO段的執(zhí)行地址開始和裝載地址開始,由-RO-BASE這個(gè)參數(shù)指定的
Image$$RO$$Limit:是RO段的裝載地址結(jié)束的后一個(gè)地址,也就是RW的裝載地址的開始。(在一個(gè)simple image里面,裝載的時(shí)候,RO段被裝載在-RO-BASE指定的地址,后面緊跟著的是RW的數(shù)據(jù),注意,在simple image執(zhí)行的時(shí)候,因?yàn)閞o段的裝載地址和執(zhí)行地址相同,所以不需要移動(dòng),而RW的執(zhí)行地址是由-RW-BASE指定的,所以需要移動(dòng)!)
Image$$RW$$Base:是rw段的執(zhí)行地址,由-rw-base這個(gè)參數(shù)指定!
總結(jié)一下:
沒運(yùn)行前:flash中的ro段是ro-base指定的地址開始,等ro段完了(也就是Image$$RO$$Base~Image$$RO$$limit-1),后面緊接著就是rw段(也就是Image$$RO$$limit~。。。)!
運(yùn)行時(shí):flash中的ro段地址沒有動(dòng),還是Image$$RO$$Base~Image$$RO$$limit-1,原來flash中的rw段移到了sdram中,地址為Image$$RW$$Base~Image$$ZI$$Base,然后又初始化了一段ZI區(qū)!
呵呵!寫點(diǎn)這個(gè)就當(dāng)和我一樣的弱人共勉吧!如有不對(duì)之處,請(qǐng)大家指正!共同進(jìn)步
6
發(fā)表于 2009-8-2 11:55:41 | 只看該作者
好東西,很多ARM新手就是對(duì)這些東西不理解

俺當(dāng)初也是折騰這個(gè)折騰了N久才明白
7
發(fā)表于 2009-8-14 09:48:23 | 只看該作者
RO 代表只讀段,也就是代碼段,裝載域和運(yùn)行域都有
RW代表是數(shù)據(jù)段,包括DATA和BSS,裝載域和運(yùn)行域都有
ZI代表是堆棧段,只有在運(yùn)行域中有,

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 麻豆久久婷婷国产综合五月 | 爽死777 | 欧美亚洲综合图区在线 | 老司机亚洲精品影视www | 影音先锋色先锋女同另类 | 丁香婷婷影音先锋5566 | 欧美精品一区二区三区观 | 91手机在线视频观看 | 亚洲国产二区三区久久 | 久久夜色精品国产噜噜小说 | 欧美精品亚洲精品日韩经典 | 色偷偷久久 | 亚洲一区免费在线观看 | 国产精品欧美一区喷水 | 日本不卡二区 | 日韩精品视频免费网址 | 91碰视频 | 亚洲人成片在线观看 | 成人免费在线视频 | 成人激情综合 | 色老二精品视频在线观看 | 欧美成人免费高清网站 | 亚洲国产成人精品不卡青青草原 | 日本一区二区三区视频在线观看 | 一级人做人a爰免费视频 | 在线一区视频 | 999久久狠狠免费精品 | 欧美成人亚洲国产精品 | 江疏影腿抬高点我要进去小说 | 69视频在线下载 | 久久久久久国产精品视频 | 五月天婷婷视频在线观看 | 大伊香蕉精品视频在线天堂 | 自拍天堂 | 亚洲欧美综合日韩字幕v在线 | 成人亚洲欧美日韩中文字幕 | www.av免费| 色交视频 | 两个人的视频在线观看免费完整版 | 国产视频一二区 | 国产一在线精品一区在线观看 |