ELF 加载程序如何映射小于页面大小的部分?
How does the ELF loader mmap sections smaller than a page size?
mmap 手册页指出“文件以页面大小的倍数映射。”,在我的系统上是 4096 字节 (0x1000)。然而 ELF 文件可以有小于 0x1000 的部分,例如:
[Sections]
nth paddr size vaddr vsize perm name
―――――――――――――――――――――――――――――――――――――――――――――――――
0 0x00000000 0x0 0x00000000 0x0 ----
1 0x00001000 0xb93 0x00401000 0xb93 -r-x .text
2 0x00002000 0x660 0x00402000 0x660 -r-- .rodata
3 0x00002660 0x304 0x00402660 0x304 -r-- .eh_frame
4 0x00003000 0xe6 0x00404000 0xe6 -rw- .data
5 0x000030e6 0x0 0x00404100 0x100 -rw- .bss
6 0x000030e6 0x2e 0x00000000 0x2e ---- .shstrtab
ELF如何加载和映射它们?它不能天真地四舍五入到 0x1000,因为那样下一节就会失败。它是否以某种方式检测到这一点并将连续的页面组合在一起?如果他们有不同的权限怎么办?
How does ELF load and mmap them?
ELF 加载程序不查看也不关心任何部分。事实上,headers 部分可以完全剥离,可执行文件将继续正常工作。部分在(静态)link 时间 仅 使用。
加载器关心的是段。您可以使用 readelf -Wl a.out
.
查看段(以及段到段的映射)
是的:段可以有 non-even 页长度。加载程序不关心——它只是执行 mmap()
(内核将映射舍入到整个页面大小)。
另请参阅this 部分相关的答案。
它可能只用一整页来满足您的请求,但正如您所说,让步的内存量只是您请求的内存量。这既不与任意请求的可能性冲突,又与系统无关。如果您调整内存量,请考虑您要求的确切内存量。
mmap 手册页指出“文件以页面大小的倍数映射。”,在我的系统上是 4096 字节 (0x1000)。然而 ELF 文件可以有小于 0x1000 的部分,例如:
[Sections]
nth paddr size vaddr vsize perm name
―――――――――――――――――――――――――――――――――――――――――――――――――
0 0x00000000 0x0 0x00000000 0x0 ----
1 0x00001000 0xb93 0x00401000 0xb93 -r-x .text
2 0x00002000 0x660 0x00402000 0x660 -r-- .rodata
3 0x00002660 0x304 0x00402660 0x304 -r-- .eh_frame
4 0x00003000 0xe6 0x00404000 0xe6 -rw- .data
5 0x000030e6 0x0 0x00404100 0x100 -rw- .bss
6 0x000030e6 0x2e 0x00000000 0x2e ---- .shstrtab
ELF如何加载和映射它们?它不能天真地四舍五入到 0x1000,因为那样下一节就会失败。它是否以某种方式检测到这一点并将连续的页面组合在一起?如果他们有不同的权限怎么办?
How does ELF load and mmap them?
ELF 加载程序不查看也不关心任何部分。事实上,headers 部分可以完全剥离,可执行文件将继续正常工作。部分在(静态)link 时间 仅 使用。
加载器关心的是段。您可以使用 readelf -Wl a.out
.
是的:段可以有 non-even 页长度。加载程序不关心——它只是执行 mmap()
(内核将映射舍入到整个页面大小)。
另请参阅this 部分相关的答案。
它可能只用一整页来满足您的请求,但正如您所说,让步的内存量只是您请求的内存量。这既不与任意请求的可能性冲突,又与系统无关。如果您调整内存量,请考虑您要求的确切内存量。