如何获取大页面的物理地址

Posted

技术标签:

【中文标题】如何获取大页面的物理地址【英文标题】:How to get the physical address of a huge-page 【发布时间】:2016-05-31 21:51:46 【问题描述】:

我需要从用户空间获取大页面 (2 MB) 的物理地址。我设法从页面映射中获取正常 4 KB 页面的物理地址,如 https://shanetully.com/2014/12/translating-virtual-addresses-to-physcial-addresses-in-user-space/#codeprocpidpagemapcode 所示,但是我不明白我应该如何使用页面映射来获取大页面的物理地址。 pagemap中如何表示大页面页框号?任何参考资料,尤其是任何一段代码都将受到高度赞赏。

【问题讨论】:

你读过documentation for pagemap吗?它甚至从您提供的链接中引用。特别是描述COMPOUND_HEADCOMPOUND_TAIL 的部分。 我一直在查看页面地图文档,但在 HUGE 部分下并没有说太多。因此,根据 COMPOUND_HEAD 和 COMPOUND_TAIL,我的 2 MB 缓冲区的开头应该是头部,因此我的缓冲区前 4 KB 中的任何位置都应该映射到整个大页面的 PFN?那么我应该如何解释这个值?我应该期待 PFN 末尾有 9 个零吗?并将第 10 位及以上的位视为扩展我的偏移量的物理内存位? 【参考方案1】:

应该是一样的。普通页和大页之间的主要区别在于页表的几层。对于大页面(至少在 x86 上),页表遍历提前结束。

大页面通常以比典型页面更多的零结尾,因为它们需要与其大小对齐(在 2MB 的情况下,低 21 位应该全部为零)。

如果您从读取中得到 -EINVAL,请查看来自 pagemap documentation 的引用(该示例读取错误的字节数):

如果你不是从任何文件读取将返回 -EINVAL 从 8 字节边界开始读取(例如,如果您寻找奇数 文件中的字节数),或者如果读取的大小不是 8 字节的倍数。

【讨论】:

但也可能不一样。让我知道您遇到了哪个错误,我会看看我是否能理解原因。 非常感谢,目前似乎可以使用。我注意到我得到的地址有很多尾随零,这是有道理的,但我不确定,这只是我不想盲目依赖的观察结果。再次感谢

以上是关于如何获取大页面的物理地址的主要内容,如果未能解决你的问题,请参考以下文章

如何从结构页面中获取关联数据的物理地址?

linux内核 - 如何获取物理地址(内存管理)?

linux内存池能分配连续物理内存吗

如何从接口获取物理接口 IP 地址

如何通过 CPUID 命令使用 C/C++ 获取物理和虚拟地址位

如何获取Cisco设备OID值来监控各种物理及逻辑状态信息