一般而言,系統會將程式碼與 data 分離,所以才會有分段的產生,因此不同目的程式碼對系統而言儲存的位置也不同。
我先用一張圖,做一個總結。這裡有一個很棒的例子,可以很清楚的知道哪些資料存放在哪個分段,若有興趣看每一個分段的分法,可以先看後面的定義。
由下圖可以看到,整段程式碼存放的地方是 .text,變數 i 因為尚未指派數值因此存在 .bss,常數 hello 存在 .data, 而其被指派的數值存放在 .rodata。
個別的分段原則:
用來保存實際的程式碼的地方
用來宣告初始的資料與常數(執行時期[runtime]不會在再改變的變數)
存放宣吿變數的地方(還沒有初始值)
用來存放唯讀資料
宣告方法很簡單,參照以下程式:
section .text
start
xxx
section .data
yyy
section .bss
zzz
xxx, yyy, zzz 就是你可宣告完,可以放其他程式碼的地方。
上述的主要是 Unix 上的分段。如果是 Windows 上的分段,結果就會不大一樣。
可以和Linux對應的段落包括,.text、.data、.bss、.rdata。
更多常見的是:.idata, .edata, .reloc, .rsrc, .tls ...族繁不及備載,有興趣的話,歡迎參考[官方文件]。(https://docs.microsoft.com/en-us/windows/win32/debug/pe-format?redirectedfrom=MSDN#general-concepts)
今天,我們了解程式碼的分段原因與原則。明天,將會更透徹的理解這些分段在記憶體是如何分配!