留下许多未引用的页面。因此推迟物理上的读取常常能够避免这些情况,改良系统的
特性。为了在实践中达到这种效果,可执行的和共享的 object file 必须具备
合适于页面大小取模值的文档偏移和虚拟地址这样条件的段映像。
虚拟地址和文档偏移在 SYSTEM V 结构的段中是模 4KB(0x1000) 或大的 2 的幂。
由于 4KB 是最大的页面大小,因此无论物理页面大小是多少,文档必须去适合页面。
Figure 2-5: Executable File
File Offset File Virtual Address
=========== ==== ===============
0 ELF header
Program header table
Other information
0x100 Text segment 0x8048100
...
0x2be00 bytes 0x8073eff
0x2bf00 Data segment 0x8074f00
...
0x4e00 bytes 0x8079cff
0x30d00 Other information
...
Figure 2-6: Program Header Segments(程式头段)
Member Text Data
====== ==== ====
p_type PT_LOAD PT_LOAD
p_offset 0x100 0x2bf00
p_vaddr 0x8048100 0x8074f00
p_paddr unspecified unspecified
p_filesz 0x2be00 0x4e00
p_memsz 0x2be00 0x5e24
p_flags PF_R PF_X PF_R PF_W PF_X
p_align 0x1000 0x1000
尽管示例中的文档偏移和虚拟地址在文本和数据两方面都适合模 4KB ,但是更有
4 个文档页面混合了代码和数据(依赖于页面大小和文档系统块的大小)。
* 第一个文本页面包含了 ELF 头、程式头连同其他信息。
* 最后的文本页包含了一个数据开始的拷贝。
* 第一个数据页面有一个文本结束的拷贝。
* 最后的数据页面也许会包含和正在运行的进程无关的文档信息。
理论上,系统强制内存中段的区别;段地址被调整为适应每一个逻辑页面在地址空间
中有一个简单的准许集合。在上面的示例中,包含文本结束和数据开始的文档区域将
被映射两次:在一个虚拟地址上为文本而另一个虚拟地址上为数据。
数据段的结束处需要对未初始化的数据进行特别处理(系统定义的以 0 值开始)。
因此假如一个文档包含信息的最后一个数据页面不在逻辑内存页面中,则无关的
数据应当被置为 0 (这里不是指未知的可执行文档的内容)。在其他三个页面中
"Impurities" 理论上并不是进程映像的一部分;系统是否擦掉他们是未指定的。
下面程式的内存映像假设了 4KB 的页面。
Figure 2-7: Process Image Segments(进程映像段)
Virtual Address Contents Segment
=============== ======== =======
0x8048000 Header padding Text
0x100 bytes
0x8048100 Text segment
...
0x2be00 bytes
0x8073f00 Data padding
0x100 bytes
0x8074000 Text padding Data
0xf00 bytes
0x8074f00 Data segment
...
0x4e00 bytes
0x8079d00 Uninitialized data
0x1024 zero bytes
0x807ad24 Page padding
0x2dc zero bytes
可执行文档和共享文档在段载入方面有所不同。典型地,可执行文档段包含了
绝对代码。为了让进程正确执行,这些段必须驻留在建立可执行文档的虚拟地址
处。因此系统使用不变的 p_vaddr 作为虚拟地址。
另一方面,共享文档段包含和位置无关的代码。这让不同进程的相应段虚拟地址
各不相同,且不影响执行。虽然系统为各个进程选择虚拟地址,他还要维护各个
段的相对位置。因为位置无关的代码在段间使用相对定址,故而内存中的虚拟地址
的不同必须符合文档中虚拟地址的不同。下表给出了几个进程可能的共享对象虚拟
地址的分配,演示了不变的相对定位。该表同时演示了基地址的计算。
Figure 2-8: Example Shared Object Segment Addresses
Sourc Text Data Base Address
===== ==== ==== ============
File 0x200 0x2a400 0x0
Process 1 0x80000200 0x8002a400 0x80000000
Process 2 0x80081200 0x800ab400 0x80081000
Process 3 0x900c0200 0x900ea400 0x900c0000
Process 4 0x900c6200 0x900f0400 0x900c6000
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




