如何获取大页的物理地址

ale*_*791 5 c linux linux-kernel huge-pages

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

rut*_*ord 1

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

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

如果您从读取中得到 -EINVAL,请查看页面映射文档中的这段引用(该示例读取了错误的字节数):

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