每乙個程序都有自己的乙個程序堆疊空間。在linux介面執行乙個執行碼時,shell程序會fork乙個子程序,再呼叫exec系統呼叫在子程序中執行該執行碼。
exec
系統呼叫執行新程式時會把命令列引數和環境變數表傳遞給main
函式,它們在整個程序堆疊空間中的位置如下圖12-7所示。
圖12-7 程序堆疊空間圖
下面是對圖12-7程序堆疊空間各段的具體說明: ①
**段(文字段):儲存程式的執行碼。在程序併發時,**段是共享的且唯讀的,在儲存器中只需有乙個副本。
②資料段:此段又稱為初始化資料段,它包含了程式中已初始化的全域性變數、全域性靜態變數、區域性靜態變數。
例如,函式外定義的變數並賦值:
intcount=30 ;
此變數count
存放在資料段中。
③bss
段:通常此段又稱為未初始化資料段,它包含了程式中未初始化的全域性變數、全域性靜態變數、區域性靜態變數,程式執行前作業系統將此段初始化為0。
例如,函式外定義的變數但沒有賦值:
long sum[1000] ;
此變數存放在
bss段中。
④棧:程式執行前靜態分配的記憶體空間,棧的大小可在編譯時指定,
linux
環境下預設為
8m。棧段是存放程式執行時區域性變數、函式呼叫資訊、中斷現場保留資訊的空間。程式執行時,
cpu堆疊段指標會在棧頂根據執**況進行上下移動。
⑤堆:程式執行時,按照程式需要動態分配的記憶體空間。
malloc
、calloc
、realloc
函式分配的空間都在堆上分配。
摘自《深入淺出linux工具與程式設計》
linux 使用者程序額堆疊空間VMA
linux 堆疊expand stack bprm mm init 0xbe86f000 0xbe871000 address 0xbe84f000 int expand downwards struct vm area struct vma,unsigned long address int er...
變數空間分配 堆 棧
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...
C 的記憶體空間 堆疊
c 記憶體空間布局圖示對照。命令列引數和環境變數 stack 棧heap 堆bss 未初始化資料段 data 初始化資料段 text 正文段linux下32位記憶體空間分布圖。1.命令列引數和環境變數 shell在執行程式的時候呼叫exec函式將命令列引數傳遞給要執行的程式。使程式了解程序環境,在執...