所述ELF 1.2规范描述的实体驻留在特定文件中的偏移量,经常表示为p_offset,这将在存储器中的特定地址被加载(通常表示为p_vaddr)。
该规范不强制的片段的任何对准直接。
然而它要求
可加载进程段必须具有
p_vaddr和 的全 等值p_offset,以页面大小为模。
该成员 [p_align] 给出了段在内存和文件中对齐的值 。
值 0 和 1 表示不需要对齐。否则,p_align应该是 2 的正整数幂,并且p_addr应该等于p_offset,模p_align。
在我看来,这个术语有点偏离(段在通常意义上没有对齐,它们不是以倍数开始的) p_align)。
引用背后的基本原理是系统必须能够快速加载一个段,因此有必要避免在内存中移动它以匹配其加载地址。
加载时的文件由一个或模式“单元”的内存组成,称为pages。
页通常具有固定的大小,因此它们都从是其大小倍数的地址开始。
对于 32 位 x86 系统,这个大小是 4KiB,想象一下一系列页面及其起始地址:
Page 0 Page 1 Page 2 ... Page 4 ... Page 100 ... Page K
0 4096 8192 16384 409600 K*4096
Run Code Online (Sandbox Code Playgroud)
关键是可以非常快速地更改页面的地址,而无需复制任何字节,这称为重新映射。
加载文件后,操作系统会重新映射文件的页面,以便每个段都位于p_vaddr.
现在,如果文件中段的开头不满足引用中规定的条件并且p_align不是 4KiB 的倍数,则此“技巧”将不起作用,操作系统需要在加载后恢复为移动段。
为了使事情变得简单并且不浪费内存,文件中的段通常与 4KiB 对齐。