在Linux裡面有一個虛擬的檔案系統,由kernel提供的, 位置在/proc
裡面有關於整個系統的資訊,像是
/proc/uptime 存放開機時間,你下指令uptime就是從這邊讀的
不然就是htop, glances, ps, free 等
proc工具也會來讀這個目錄
另外就是修改kernel的參數也是來這邊改的(也能用sysctl指令來改)
像是最常見的就是,讓系統可以當router轉發封包的指令
echo 1 > /proc/sys/net/ipv4/ip_forward
這個資料夾裡面最多的就是目前系統上面跑的行程PID
裡面有status,maps等虛擬檔案
其中maps是紀錄著這個process在memory中的Layout配置
一般來說,一個執行檔在磁碟中,只有code(也稱作text)段和 data段
載入到記憶體中執行時,才會額外多出bss , heap , stack 段
code段,就是存放程式碼的區段,這一區是唯讀的,而且可執行
data段,就是存放初始化的全域變數,static區域變數等的地方
bss段,就是存放 未初始變數的地方,像是全域變數等等(注意,全域變數你assign一個0值仍然算是未初始化)
heap段,就是給malloc動態配置記憶體用的區段,這一區是往高位址的方向成長
stack段,就是給function裡面的auto區域變數、return address , parameter放的地方
這一段是往低位址的方向成長.
另外,如果你的C code有用VLA(Variable Length Array)讓陣列大小可以在runtime時
再來決定的話,那麼你用GCC編譯,GCC會將VLA放在stack這一段空間,
而不像malloc放在heap段.
搞懂這些區域對於組合語言的學習有很大的幫助,另外就是可以了解C語言的設計
像是
char *s1="string1";
char s2[]="string2";
為什麼前者s1不能更改字串內容(因為位於.rodata段),而後者s2卻可以(因為位於.data段)
或者是說auto的區域變數為什麼離開function後生命周期會消失
還有像是安全方面的 buffer-overflow、heap-overflow, heap-overread 等知識
Linux裡面有個size指令可以看一個執行檔的這些區段內容
譬如以我目前本機的 bash 為例
mint@mint ~ $ size `which bash`
text data bss dec hex filename
977292 36536 23448 1037276 fd3dc /bin/bash