2013年8月30日 星期五

C語言中的記憶体佈局

記憶体佈局結構,即在linker過程中各段的組成以及在執行中各段的載入的情況。

  • 記憶体中各個段的組成
  • 程式的連結過程中的特性及常見錯誤
  • 執行的方式。

其所產生的binary file中,其組成有

  1. code(text):即所執行的程序。
  2. Ro data:即不會被改變的的資料。像是"字串,"xxxx"。
  3. RW data:其變數(非區域)且有被正確初始化,其會佔用記憶体空間,以供程式讀寫。
  4. BSS:未始化資料,其不會佔用binary file的大小。而是在程式執行時才去建立。
  5. heap:只在程式執行時出現,由程式者建立及釋放。
  6. stack:只在程式執行時出現,內容為函式中變數、參數或返回值。均是建立在stack上。

因為有些是一開始binary file中就存在的;而某些則是在程式開始執行時才出現的。故又可分為:

"映射"(code、RO and RW)及"執行"(BSS,stack and heap)。

其各個組件,可以稱為"段,segment"。

 

C語言中各段說明:

  • Code:
    • 各函式
    • 基本運算(+,-,* and / . &&, ||,&,| and ~)
    • if ..else …
    • while/for.
  • Ro data:
    • 任何在程式中不會被改變的數值,即為Ro data
    • 唯讀的全域變數: const char a[]={“abcd”};
    • 唯讀的局域變數:const char b[]={“test”};
    • 常數:printf("test\n"); 其中會把test\n.視為常數。
    • "使用時const 時,必定需要初始化"
    • const char ro[] , const char* ptr;均指向RO。而其指向的內容都不可改變。其差別在於ro[]在程式中不可改變;而ptr在程式中可以改。
    • error: incompatible types when assigning to type 'const char[4]' from type 'char *'|
  • Rw data:
    • 已初始化的全域變數。char a[]={“1234”};
    • 已初始化的局域靜態變數。static char b[]={"test"};
    • "只有初始化才會形成RW data。若沒有時,則會成為BSS"
    • 若其初始化的全域變數+static 時,則代表其只能在這個檔案內可存取。
  • BSS:
    • block start by symbol。即沒有被初始化的資料,因此它只有在object file中被標示,而不會真正成為object file中的一部份。
  • **static修飾;不論其變數是宣告在函式內/外。其compiler/linker均把它放在全域段中。但其函式內外其可視的範圍不同。
  • 函式內,只能在此函式內;函式外,只能在此檔案內。
  • 若其在函式內變數,沒有修飾(static/const)則為statck 。Static 視是否有初始?有,RW :否,BSS。const 均在RO中。
   1: const char ro[]={"abc"};
   2: const char* ptr="test";

imageptr為D ,RW 全域。 而ro為R,RO,全域。


而若你將其const char 放在函式內則其視其為區域變數(stack),只是它不改變...而已.



   1: static char ro[]={"abc"};



函式外;


有無static, 外部可讀否。均放在RW中


函式內;


有無 static,為RW,或stack


image


最後,在C語言中,讀寫資料段和末初始化資料段中是包含了;全域變數、單個檔案內使用的全域變數(加static)、局部靜態變數(加static)。


 


各個目的檔的關係

沒有留言:

張貼留言