歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux程序存儲結構

Linux系統下,程序是一個可執行文件,通常是ELF格式。通常,Linux的可執行文件擁有兩種內存分配方式:存儲時 和 運行時

1、存儲時

看實例,下面是對可執行文件aa運行size命令後得到的結果。

[root@xxx1 algriom]# size aa

text      data    bss    dec    hex  filename

1257    500    16  1773    6ed  aa

其中:

text(代碼區):表示正文段大小,是CPU執行的機器指令部分,通常,是可共享的,所以即使是頻繁執行的程序在存儲器中也只需有一個副本;

data(初始化數據區):表示包含靜態變量和已經初始化(可執行文件包含了初始化的值)的全局變量的數據段大小;

bss :表示未初始化的全局變量和未初始化的靜態變量,稱之為未初始化數據段;

PS:第4列和第5列是分別以十進制和十六進制表示的三個段的總長度。

2、運行時(進程結構)

運行時是指一個正在運行的進程在內存空間中的結構,也就是一個進程的結構。

一般包括代碼區、初始化數據區、未初始化數據區、堆區和棧區5個部分。

前三者與存儲時相同,(1)棧區存儲函數參數值、返回值、局部變量等。向下生長

(2)堆區用於動態內存分配。向上生長

堆區和棧區的區別如下:

(1)棧由操作系統自動管理,無需程序員手工控制,而堆區的申請和釋放工作由程序員控制。

(2)棧是一塊連續的內存區域,由系統預先設定,一般較小,從高地址向低地址增長;而堆是向高地址擴展的數據結構,是不連續的內存區域,空間較大。另外,分配的效率上,棧的分配比堆的分配要高效很多。

結論:

1、 經過初始化的全局變量和靜態變量保存在數據段中。

2、 未經初始化的全局變量和靜態變量保存在BSS段。

3、 函數內部聲明的局部變量保存在堆棧段中。

4、 const修飾的全局變量保存在文本段中,const修飾的局部變量保存在堆棧段中。

5、 字符串常量保存在文本段中。

Copyright © Linux教程網 All Rights Reserved