u-boot中的text、bss、data和rodata區別和聯繫

轉自:http://blog.csdn.net/emsoften/article/details/44808409

text段:

    代碼段(codesegment/textsegment)通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,並且內存區域通常屬於只讀,某些架構也允許代碼段爲可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。

bss段:
       bss是指那些沒有初始化的和初始化爲0的全局變量。它有什麼特點呢,讓我們來看看一個小程序的表現。
int bss_array[1024 * 1024] = {0};

int main(int argc, char* argv[])
{
    return 0;
}
[root@localhost bss]# gcc -g bss.c -o bss.exe
[root@localhost bss]# ll
total 12
-rw-r--r-- 1 root root   84 Jun 22 14:32 bss.c
-rwxr-xr-x 1 root root 5683 Jun 22 14:32 bss.exe

       變量bss_array的大小爲4M,而可執行文件的大小隻有5K。 由此可見,bss類型的全局變量只佔運行時的內存空間,而不佔文件空間。另外,大多數操作系統,在加載程序時,會把所有的bss全局變量全部清零,無需要你手工去清零。但爲保證程序的可移植性,手工把這些變量初始化爲0也是一個好習慣。

data段:
       與bss相比,data就容易明白多了,它的名字就暗示着裏面存放着數據。當然,如果數據全是零,爲了優化考慮,編譯器把它當作bss處理。通俗的說,data指那些初始化過(非零)的非const的全局變量。它有什麼特點呢,我們還是來看看一個小程序的表現。
int data_array[1024 * 1024] = {1};

int main(int argc, char* argv[])
{
    return 0;
}

[root@localhost data]# gcc -g data.c -o data.exe
[root@localhost data]# ll
total 4112
-rw-r--r-- 1 root root      85 Jun 22 14:35 data.c
-rwxr-xr-x 1 root root 4200025 Jun 22 14:35 data.exe

       僅僅是把初始化的值改爲非零了,文件就變爲4M多。由此可見,data類型的全局變量是即佔文件空間,又佔用運行時內存空間的。

rodata段:
       rodata的意義同樣明顯,ro代表read only,即只讀數據(const)。關於rodata類型的數據,要注意以下幾點:
1、常量不一定就放在rodata裏,有的立即數直接編碼在指令裏,存放在代碼段(.text)中。
2、對於字符串常量,編譯器會自動去掉重複的字符串,保證一個字符串在一個可執行文件(EXE/SO)中只存在一份拷貝。
3、 rodata是在多個進程間是共享的,這可以提高空間利用率。
4、在有的嵌入式系統中,rodata放在ROM(如norflash)裏,運行時直接讀取ROM內存,無需要加載到RAM內存中。
5、在嵌入式linux系統中,通過一種叫作XIP(就地執行)的技術,也可以直接讀取,而無需要加載到RAM內存中。

       由此可見,把在運行過程中不會改變的數據設爲rodata類型的,是有很多好處的:在多個進程間共享,可以大大提高空間利用率,甚至不佔用RAM空間。同時由於rodata在只讀的內存頁面(page)中,是受保護的,任何試圖對它的修改都會被及時發現,這可以幫助提高程序的穩定性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章