本節注重分清幾個概念:.text .data .bss 堆 棧 靜態存儲區 只讀存儲區等
從程序到a.out 把程序變成.text .data .bss 是編譯原理完成的過程
從a.out把程序映射到對應的內存地址空間是操作系統完成的,也就是在操作系統創建進程的時候完成的,在描述進程的那個結構體中。
我們常說的堆是為了申請動態內存的時候使用的,malloc。
棧是為了在函數中切換使用的,即存放函數中的局部變量。(堆和棧是操作系統分配的,所有不在a.out中)
靜態存儲區是用來存放全局變量,靜態變量的,理解static的用法,即包括.bss段(未初始化的)和.data段(初始化的)。
只讀存儲區是用來存放一些常量,字符串,只讀的數據的,理解char * p="hello!!" 不是野指針的原因。
程序段(.text)是用來存放可執行代碼的。
總結下:其實只讀存儲區,又叫做代碼區,這個區存放的是,只讀常量char* p="hello!!" #define PI 3.14 枚舉類型 程序代碼。
所以說一般對於內存可以分成四個區:堆 棧 靜態區 只讀存儲區
注意:在棧中 不僅僅保存了數據 應該也保存了程序的機器碼 之後就轉換成了.text段了
注意:其中有些不是特別清晰的問題,如a.out中各段的生成,a.out到內存的映射,a.out映射後的堆和棧是怎麼生成的,根據什麼生成的?這些問題都是編譯原理和操作系統的知識點。