一、映像文件基本組成
映像文件加載時域包括RO和RW段,運行時域則包括RO、RW和ZI三個段。其中RO和RW段的內容在加載時和運行時是一樣的,只是存儲空間可能不同,而ZI段則是運行時由初始化函數創建的。
RO段:Read-Only段,包括源程序中的CODE段,只讀數據段(包括變量的初始化值——可以是任意變量,全局/局部、靜態/動態變量的初值;還包括數據常量——這個常量也可以是全局的或局部的。也就是說,編譯器既要為變量分配存儲空間——變量是可讀寫的,並不放在RO段,又要為變量的初值分配存儲空間,兩者是兩回事)。
RW段:可讀寫段,主要指RW-DATA,也可能有RW-CODE。RW-DATA是指已經初始化的全局變量。
ZI段:Zero-Initialized段,主要包括未初始化的全局變量,編譯器用0值對其進行初始化。該段中的數據由於是變量,因而也是可讀寫的,但在映像文件加載時,並不為ZI段分配存儲空間,雖然在ADS編譯器的Memory map文件中認為Total RW Size = (RW Data + ZI Data)。
二、代碼,數據和變量在映像文件中的位置
上面簡單總結了映像文件各段的組成。從程序的組成看,可以分為變量、數據和代碼,其中變量又分為全局/局部的或靜態/動態的,它們的存儲空間又是如何分配的呢?
代碼:一般是只讀的,由編譯器分配存儲空間並放到映像文件的RO段。
數據:這裡所指的數據都是常量(若可變則為變量),也包括指針常量,那麼也屬於只讀的數據,也由編譯器分配存儲空間放到映像文件的RO段。
變量:主要根據生存期來分,因為生存期是按在內存中的生存時間來定義的,而作用域與存儲空間分配無關。
1.全局變量和靜態變量:包括靜態局部變量和全局/靜態指針變量在內,由編譯器分配存儲空間,已初始化的放到RW段,否則放到ZI段;
2.動態變量:主要是指局部變量,包括局部指針變量在內,占用棧空間。