記憶体佈局結構,即在linker過程中各段的組成以及在執行中各段的載入的情況。
- 記憶体中各個段的組成
- 程式的連結過程中的特性及常見錯誤
- 執行的方式。
其所產生的binary file中,其組成有
- code(text):即所執行的程序。
- Ro data:即不會被改變的的資料。像是"字串,"xxxx"。
- RW data:其變數(非區域)且有被正確初始化,其會佔用記憶体空間,以供程式讀寫。
- BSS:未始化資料,其不會佔用binary file的大小。而是在程式執行時才去建立。
- heap:只在程式執行時出現,由程式者建立及釋放。
- 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";
而若你將其const char 放在函式內則其視其為區域變數(stack),只是它不改變...而已.
1: static char ro[]={"abc"};
函式外;
有無static, 外部可讀否。均放在RW中
函式內;
有無 static,為RW,或stack
最後,在C語言中,讀寫資料段和末初始化資料段中是包含了;全域變數、單個檔案內使用的全域變數(加static)、局部靜態變數(加static)。
各個目的檔的關係
沒有留言:
張貼留言