ARM程式組成

2021-05-26 09:22:52 字數 2143 閱讀 9798

一般的可執行程式都包括**段、資料段。也可以簡單的看作由兩部分組成:ro段和rw段。

ro段一般包括**段和一些常量,在執行的時候是唯讀的。而rw段包括一些全域性變數和靜態變數,在執行的時候是可以改變的(讀寫)。如果有部分全域性變數被初始化為零,則rw段裡還包括了zi段。

ro:

read only  **段

rw:read write

已初始化的全域性變數

zi:

zero init  未初始化的全域性變數

因為ro段是唯讀的,在執行的時候不可以改變,所以,在執行的時候,ro段可以駐留在flash裡(當然也可以在sdram或者sram裡了)。而rw段是可以讀寫的,所以,在執行的時候必須被裝載到sdram或者sram裡。

在用ads編譯的時候,是需要設定ro base 和rw base的,用過ads的應該都清楚這點。通過ro base 和rw base的設定,告訴鏈結器(linker)該程式的起始執行位址(ro base)和 rw段的位址 (rw base)。如果乙個程式只有ro段,沒有rw段,那麼這個程式可以完全在flash裡執行,不需要用到sdram 或者 sram。如果包括rw段和ro段,那麼該程式的rw段必須在被訪問以前被拷貝到sdram 或者sram裡去,以保證程式可以正確執行。下面這個圖說明了乙個程式執行前(load view)和執行時(execute view)的狀態。從圖中可以看到,整個程式在執行前始放在rom裡的,在執行的時候,rw段被拷貝到了ram裡的合適位置去。

程式一開始總是儲存在rom/flash裡面的,其ro部分既可以在rom/flash裡面執行,也可以轉移到速度更快的ram中去;而rw和zi這兩部分是必須轉移到可寫的ram裡去。所謂應用程式執行環境的初始化,就是完成必要的從rom到ram的資料傳輸和內容清零。

不同的工具鏈會提供一些不同的機制和方法幫助使用者完成這一步操作,主要是跟鏈結器(linker)相關。下面是在arm開發工具環境ads下,一種常用儲存器模型的直接實現:

ldr r0, = |image$$ro$$limit| ;得到ro段末的下一位元組的位址,rom中的rw的開始位址

ldr r1, = |image$$rw$$base| ;得到ram中的rw段的初始位址

ldr r3, = |image$$zi$$base| ;全域性變數的初始位址  

cmp r0, r1 ; 

beq loop1 

loop0 

cmp r1, r3 ; 是否到ram中的rw段的末位址,如果沒到,則一直將rom

/flash變數與資料段拷貝到ram中

ldrcc r2, [r0], #4 ;[r0]=[r1] 

strcc r2, [r1], #4 ;  

bcc loop0 

loop1 

ldr r1, = |image$$zi$$limit| ; loop1與loop2執行將zi初始化為0

mov r2, #0 

loop2 

cmp r3, r1 

strcc r2, [r3], #4 ; 

bcc loop2

在ads裡,有一些預先定義了的變數可以用(linker defined symbol)。在下面的實現裡,用到了幾個預定義的變數:

image$$ro$$base 該變數指定了ro段的 base

image$$ro$$limit 該變數指定了ro段的 limit

image$$rw$$base 該變數指定了rw段的 base

image$$rw$$limit 該變數指定了rw段的 limit

image$$zi$$base 該變數指定了zi段的 base

image$$zi$$limit 該變數指定了zi段的 limit

注:具體可以參考ads linker guide

image$$ro$$limit 減 image$$ro$$base 等於ro段的大小

image$$rw$$limit 減 image$$rw$$base 等於rw段的大小

image$$zi$$limit 減 image$$zi$$base 等於zi段的大小

(image$$ro$$limit 減 image$$ro$$base)

+ (image$$rw$$limit 減 image$$rw$$base)

= 等於整個程式的大小

注:zi段始包括在rw段裡面的。

源文件

ARM 下的C執行程式的組成 RO RW ZI

一直以來對於arm體系中所描述的ro,rw和zi資料存在似是而非的理解,這段時間對其仔細了解了一番,發現了一些規律,理解了一些以前書本上有的但是不理解的東西,我想應該有不少人也有和我同樣的困惑,因此將我的一些關於ro,rw和zi的理解寫出來,希望能對大家有所幫助。要了解ro,rw和zi需要首先了解以...

程式的組成

1 標頭檔案 包含結構宣告和使用這些結構的函式的原型。2 源 檔案 包含與機構有關的函式的 1 函式原型 最好不要在標頭檔案中包含函式的定義 2 使用 define或const定義的符號常量。3 結構宣告 4 類宣告 5 模板函式 5 內聯函式 將結構宣告放在標頭檔案中是可以的,因為它們不建立變數,...

C 程式的組成

函式在被呼叫時,在棧中是以乙個棧幀的形式存在的,棧分為公升棧和降棧,不同架構,棧是不同的.t1堆 程式中的靜態區 t2 程式的組成 在上圖中 堆和棧是直到程式執行是才會存在,是程式執行的基礎 file header 用於告訴作業系統檔案是可執行檔案,和其他一些與執行相關資訊 text section...