2012-03-18 70 views
4

我看到的處理圖像通過PMAP linux下:不同地址

08048000  0  4  0 r-x-- [my program] 

08049000  0  4  4 rw--- [my program] 

三段以上是代碼,RODATA和數據段,它們都對準於PAGESIZE(4K ),但是當我把命令objdump的-H,被顯示在ELF頭如下:

read-only code segment 
Load off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12 
    filesz 0x00000448 memsz 0x00000448 flags r-x 

read/write data segment 
Load off 0x00000448 vaddr 0x08049448 paddr 0x08049448 align 2**12 
    filesz 0x000000e8 memsz 0x00000104 flag rw- 

它在ELF頭說,代碼段和數據段從0x08048000,0x049448在虛擬地址尋址seperately ,這與存儲器中的過程映像不同。我知道代碼/數據段應該分配給不同的PAGESIZE,這可以給它們不同的保護權限。但是,如果真正的虛擬機與elf二進制文件不同,該如何執行程序?

回答

3

ELF程序加載(和內存映射通常來自文件)的方式是基於頁面的。因此,涉及的地址,文件中的偏移量和大小必須全部是頁面大小的倍數。

但是,程序加載器足夠智能,可以處理不完全在頁面邊界上開始或結束的部分,方法是將它們四捨五入到頁面邊界,映射超過需要的數量。因此,一些額外的數據將從文件中加載以填充頁面,但不應該被訪問,因此應該無關緊要。

在您的示例中,代碼段從偏移量0x0加載到地址0x08048000,大小爲0x448。地址和偏移量是對齊的,所以只需將大小四捨五入到整頁。數據段從偏移量0x448加載到0x08049448。這些不是對齊的,但是是兼容的 - 加載器向下舍入到頁面倍數(0x08049000和0x000)以及該頁面中的映射。請注意,這最終會成爲與代碼段相同的文件頁面,因此頁面將加載到兩個不同的地址,一個是隻讀的,另一個是非共享的讀寫。所以代碼和數據都在過程映像的兩個地方都可見,但這並不重要 - 代碼在0x8048000..0x8048447處結束rx,數據結束於rw- 0x8049448..0x804954b,這就是所有事項。