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

如何從EMI角度看PCB layout 法規(guī)
Linux上對進程進行內(nèi)存分析和內(nèi)存泄漏定位
從步進電機驅(qū)動IC的角度看步進電機
進程間通信之共享內(nèi)存

從純粹軟件技術(shù)的角度看Windows CE

進程虛擬內(nèi)存布局以及進程的虛擬內(nèi)存分配釋放流程,涉及的代碼
鴻蒙內(nèi)核源碼分析:進程是內(nèi)核的資源管理單元

從SMT焊接角度看BGA封裝的優(yōu)勢
從軟件角度看看內(nèi)存

線程、進程、多線程、多進程和多任務(wù)之間有何關(guān)系?

評論