RO和RW還有ZI代表什麼?

2021-04-20 01:18:42 字數 3263 閱讀 8103

一般而言,乙個程式包括唯讀的**段和可讀寫的資料段。在arm

的整合開發環境中,唯讀的**段和常量被稱作ro

段(readonly)

;可讀寫的全域性變數和靜態變數被稱作rw

段(readwrite)

;rw段中要被初始化為零的變數被稱為zi

段(zeroinit)

。對於嵌入式系統而言,程式映象都是儲存在flash

儲存器等一些非易失性器件中的,而在執行時,程式中的rw

段必須重新裝載到可讀寫的ram

中。這就涉及到程式的載入時域

和執行時域

。簡單來說,程式的載入時域就是指程式燒入flash

中的狀態,執行時域是指程式執行時的狀態

。對於比較簡單的情況,可以在ads

整合開發環境的arm linker

選項中指定ro base

和rw base

,告知聯結器ro

和rw的連線基位址。對於複雜情況,如ro

段被分成幾部分並對映到儲存空間的多個地方時,需要建立乙個稱為「

分布裝載描述檔案」

的文字檔案,通知聯結器把程式的某一部分連線在儲存器的某個位址空間。需要指出的是,分布裝載描述檔案中的定義要按照系統重定向後的儲存器分布情況進行。在引導程式完成初始化的任務後,應該把主程式轉移到ram

中去執行,以加快系統的執行速度。 

什麼是arm

的映像檔案,

arm映像檔案其實就是可執行檔案,包括bin

或hex

兩種格式,可以直接燒到rom

裡執行。在axd

除錯過程中,我們除錯的是axf

檔案,其實這也是一種映像檔案,它只是在bin

檔案中加了乙個檔案頭和一些除錯資訊。映像檔案一般由域

組成,域最多由三個輸出段組成(ro,rw,zi)

組成,輸出段又由輸入段組成

。所謂域,指的就是整個bin

映像檔案所處在的區域,它又分為載入域和執行域

。載入域就是映像檔案被靜態存放的工作區域,一般來說flash

裡的整個bin

檔案所在的位址空間就是載入域

,當然在程式一般都不會放在flash

裡執行,一般都會搬到sdram

裡執行工作,它們在被搬到sdram

裡工作所處的位址空間就是執行域

。我們輸入的**,一般有**部分和資料部分,這就是所謂的輸入段,經過編譯後就變成了bin

檔案中ro

段和rw

段,還有所謂的zi

段,這就是輸出段

。對於載入域中的輸出段,一般來說ro

段後面緊跟著rw

段,rw

段後面緊跟著zi

段。在執行域中這些輸出段並不連續,但rw

和zi一定是連著的。

zi段和rw

段中的資料其實可以是rw

屬性。

| image$$ro$$base| |image$$ro$$limit| |image$$rw$$base| |image$$zi$$base| |image$$zi$$limit|

這幾個變數是編譯器通知的,我們在makefile

檔案中可以看到它們的值。它們指示了在執行域中各個輸出段所處的位址空間| image$$ro$$base|

就是ro

段在執行域中的起始位址,|image$$ro$$limit|

是ro段在執行域中的截止位址。其它依次類推。我們可以在linker

的output

中指定,在******

模式中,ro base

對應的就是| image$$ro$$base|

,rw base

對應的是|image$$rw$$base|

,由於rw

和zi相連,|image$$zi$$base|

就等於|image$$zi$$limit| .

其它的值都是編譯器自動計算出來的。

下面是2410

啟動**的搬運部分,我給出注釋

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

是復位執行時域的起始位址,在boot

nand

中一般是0

ldr r2, baseofrom;

cmp r0, r2

ldreq r0, topofrom;topofrom=0x30001de0,**段位址的結束

beq initram

ldr r3, topofrom

;part 1

,通過比較,將ro

搬到sdram

裡,搬到的目的位址從| image$$ro$$base|

開始,到|image$$ro$$limit|

結束 0

ldmia r0!,

stmia r2!,

cmp r2, r3

bcc %b0;

;part 2

,搬rw

段到sdram

,目的位址從|image$$rw$$base|

開始,到|image$$zi$$base|

結束 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

ARM程式的RO段 RW段和ZI段 Image

limit 含義 了解ro,rw和zi需要首先了解以下知識 arm程式的組成 此處所說的 arm程式 是指在arm系統中正在執行的程式,而非儲存在rom中的bin映像 image 檔案,這一點清注意區別。乙個arm程式包含3部分 ro,rw和zi ro是程式中的指令和常量 rw是程式中的已初始化變數...

通訊領域的SP和CP都代表什麼?

sp cp在不同領域有不同的解釋,我在這裡介紹的是通訊領域的噢 sp是移動資料業務服務提供商or 移動增值業務服務提供商 cp是移動資料業務內容提供商or 移動增值業務內容提供商 什麼是sp證?移動網增值業務經營許可證 什麼是isp證?網際網路接入服務業務經營許可證 什麼是icp經營許可證?icp ...

python乙個 和兩個 代表什麼意思???

有時可能需要乙個函式能處理比當初宣告時更多的引數。這些引數叫做不定長引數,宣告時不會命名。乙個星號 的變數args會存放所有未命名的變數引數,args為元組 兩個星號 的變數kwargs會存放命名引數,即形如key value的引數,kwargs為字典。例如 def add a,b,args,kwa...