32 位可执行会话按 4kb 对齐,它是 elf 格式的一部分吗?
32bit executable session is aligned by 4kb, is it part of elf format?
我想知道ELF格式有没有规定每个section要对齐到4kb边界?
或者,仅在 x86 平台上,ELF 的 'implementation' 应将每个部分对齐到 4kb 边界。
这个有判断规范吗?
ELF 1.2 specifications 描述了驻留在文件中特定偏移处的实体,通常表示为 p_offset
,并将加载到内存中的特定地址(通常表示为 p_vaddr
).
该规范不强制直接。
段的任何对齐
但是它需要
Loadable process segments must have congruent values for p_vaddr
and
p_offset
, modulo the page size.
This member [p_align
] gives the value to which the
segments are aligned in memory and in the file.
Values 0 and 1 mean that no
alignment is required. Otherwise, p_align
should be a positive, integral power of
2, and p_addr
should equal p_offset
, modulo p_align
.
我认为这个术语有点不对(段不是通常意义上的对齐,它们不是从 p_align
的倍数开始)。
引用背后的基本原理是系统必须能够快速加载一个段,因此有必要避免在内存中移动它以匹配其加载地址。
加载时的文件由一个或模式"unit"内存组成,称为页。
页面通常具有固定大小,因此它们的起始地址都是其大小的倍数。
对于 32 位 x86 系统,这个大小是 4KiB,想象一下页面序列及其起始地址:
Page 0 Page 1 Page 2 ... Page 4 ... Page 100 ... Page K
0 4096 8192 16384 409600 K*4096
重点是可以非常快速地更改页面地址,而无需复制任何字节,这称为重新映射。
加载文件后,OS 重新映射文件的页面,以便每个段位于其在 p_vaddr
中指定的地址。
现在,如果文件中段的开头不满足引用中所述的条件并且 p_align
不是 4KiB 的倍数,则此 "trick" 将不起作用并且 OS 加载后需要恢复移动段。
为了使事情变得简单并且不浪费内存,段通常在文件中对齐到 4KiB。
我想知道ELF格式有没有规定每个section要对齐到4kb边界? 或者,仅在 x86 平台上,ELF 的 'implementation' 应将每个部分对齐到 4kb 边界。
这个有判断规范吗?
ELF 1.2 specifications 描述了驻留在文件中特定偏移处的实体,通常表示为 p_offset
,并将加载到内存中的特定地址(通常表示为 p_vaddr
).
该规范不强制直接。
段的任何对齐
但是它需要
Loadable process segments must have congruent values for
p_vaddr
andp_offset
, modulo the page size.
This member [p_align
] gives the value to which the segments are aligned in memory and in the file.
Values 0 and 1 mean that no alignment is required. Otherwise,p_align
should be a positive, integral power of 2, andp_addr
should equalp_offset
, modulop_align
.
我认为这个术语有点不对(段不是通常意义上的对齐,它们不是从 p_align
的倍数开始)。
引用背后的基本原理是系统必须能够快速加载一个段,因此有必要避免在内存中移动它以匹配其加载地址。
加载时的文件由一个或模式"unit"内存组成,称为页。
页面通常具有固定大小,因此它们的起始地址都是其大小的倍数。
对于 32 位 x86 系统,这个大小是 4KiB,想象一下页面序列及其起始地址:
Page 0 Page 1 Page 2 ... Page 4 ... Page 100 ... Page K
0 4096 8192 16384 409600 K*4096
重点是可以非常快速地更改页面地址,而无需复制任何字节,这称为重新映射。
加载文件后,OS 重新映射文件的页面,以便每个段位于其在 p_vaddr
中指定的地址。
现在,如果文件中段的开头不满足引用中所述的条件并且 p_align
不是 4KiB 的倍数,则此 "trick" 将不起作用并且 OS 加载后需要恢复移动段。
为了使事情变得简单并且不浪费内存,段通常在文件中对齐到 4KiB。