p_align:ELF加载器如何处理两个可加载段占用同一虚拟页的可能性?

问题描述 投票:0回答:1

根据我的理解,程序头的“p_align”字段允许加载器轻松确定是否可以将文件页面简单映射到内存页面,以便加载一个部分。

但是,我想到了以下边缘情况: 假设主内存中一个可加载段的末尾几乎没有进入新页面(我们将此页面称为 P)。然后,需要将另一个可加载段加载到内存中,从 P 的中途开始。

这两个段占用的内存是不重叠的,但是它们占用的页面是重叠的,所以简单的mmap做不出来。

加载器是否只需要检查这种情况,然后手动将内容加载到包含多个段的页面?或者是否可以保证段不共享虚拟页?

我想这样的保证会极大地简化加载器的工作,但也许它不会有太大帮助,因为加载器无论如何都需要检查以确定 ELF 文件是否有效?

顺便问一下,“p_align”字段真的有必要吗?难道不能通过计算abs(p_vaddr - p_offset) 的二进制表示中的尾随零来快速确定最大对齐吗? 此外,手册页 https://man7.org/linux/man-pages/man5/elf.5.html 声明一下

可加载进程段的 p_vaddr 和 p_offset 必须具有一致的值,以页面大小为模。

所以加载器甚至不需要检查可加载段是否可以/不能映射?

elf
1个回答
0
投票

根据我的理解,程序头的“p_align”字段允许加载器轻松确定是否可以将文件页面简单映射到内存页面,以便加载一个部分。

您的理解(以及您问题的整个前提)是错误的:

LOAD
always告诉加载程序如何将
mmap
分段到内存中,而
.p_align
字段与此无关。

加载器中没有任何类型的“手动加载内容”。

© www.soinside.com 2019 - 2024. All rights reserved.