在windows下的可執行文件的格式為.exe,而Linux的下的是ELF。這是一種文件格式,就是告訴你文件是怎么存儲的。
整個ELF的圖看看
這些內容和內核空間定義也差不多。
代碼段(.text):程序源代碼編譯后的機器指令被存放在這個代碼段里。
數據段(.data):存放已初始化的全局變量和已初始化的局部靜態變量。
bss段(.bss):用來存放未初始化的全局變量以及未初始化的局部靜態變量。
寫一個程序,其實是依賴很多的其他的程序,因此自己寫的程序需要編譯鏈接后才能使用。
時起到輔助作用,暫時先不用關注它們。程序在編譯鏈接時會盡量把相同權限屬性的段分配在同一個空間里,例如,把可讀可執行的段放在一起,包括代碼段、init段等;把可讀可寫的段放在一起,包括.data段和.bss段等。ELF把這些屬性相似并且鏈接在一起的段叫作分段(Segment),進程在裝載時是按照這些分段來映射可執行文件的。
描述這些分段的結構叫作程序頭(Program Header),它描述了ELF文件是如何映射到進程地址空間的,這是我們比較關心的。
可以使用objdump或者readelf工具來查看ELF文件包含哪些段。
我們可以通過“readelf -l”命令來查看這些程序頭。
在看的時候主要關注LOAD類型的分段,其他的都是在LOAD的時候起到輔助作用。
這是都是靜態的。
在如果你想去看看靜態的,可以通過proc文件系統來看看Linux內核的運行情況。每個進程運行之后,在/proc/pid/maps節點會列出當前進程的地址映射情況。
第1行中顯示了地址0x10000~0x870000這段進程地址空間,它的屬性是只讀并且可執行的,由此我們知道它是代碼段,也就是之前看到的代碼段的程序頭。
第2行中顯示了地址0x96000~0x98000,它的屬性是可讀可寫的進程地址空間,也就是我們之前看到的數據段的程序頭。
第 3 行中顯示了地址0x98000~0xbb000,這段進程地址空間叫作堆空間(Heap),也就是通常使用malloc分配的內存,大小是140KB。test進程主要使用malloc分配100KB的內存,這里看到Linux內核會分配比100KB稍微大一點的內存空間。
第4行顯示test進程的棧(stack)空間。
第5行是Sigpage的進程地址空間,Sigpage是ARM體系結構中特有的頁面。
第6行是ARM中高端映射的異常向量(vectors)。
這里說的進程地址空間,在 Linux 內核中使用一個叫作 VMA的術語來描述,它是vm_area_struct數據結構的簡稱,在虛擬內存管理部分會詳細介紹它。另外,/proc/pid/smaps節點會提供更多的地址映射的細節,以代碼段的VMA和堆的VMA為例。
另外,/proc/pid/smaps節點會提供更多的地址映射的細節,以代碼段的VMA和堆的VMA為例。
-
內核
+關注
關注
3文章
1381瀏覽量
40364 -
Linux
+關注
關注
87文章
11336瀏覽量
210100 -
內存
+關注
關注
8文章
3047瀏覽量
74207 -
代碼
+關注
關注
30文章
4819瀏覽量
68879
發布評論請先 登錄
相關推薦
評論