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