2012-03-18 57 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,这就是所有事项。