C Linux上内存映射文件的巨大页面

C Linux上内存映射文件的巨大页面,c,linux,mmap,tlb,huge-pages,C,Linux,Mmap,Tlb,Huge Pages,我想在Linux3.13上使用带有内存映射文件的巨大页面 首先,在Ubuntu上,我分配了10个巨大的页面: sudo apt-get install hugepages sudo hugeadm --pool-pages-min=2048K:10 然后我运行了这个测试程序: #include <assert.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include

我想在Linux3.13上使用带有内存映射文件的巨大页面

首先,在Ubuntu上,我分配了10个巨大的页面:

sudo apt-get install hugepages
sudo hugeadm --pool-pages-min=2048K:10
然后我运行了这个测试程序:

#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    size_t size = 2 * 1024 * 1024; /* 1 huge page */

    int fd = open("foo.bar", O_RDWR|O_CREAT, 0666);
    assert(fd >= 0);
    int rc = ftruncate(fd, size);
    assert(rc == 0);

    void* hint = 0;
    int flags = MAP_SHARED | MAP_HUGETLB;
    void* data = mmap(hint, size, PROT_READ|PROT_WRITE, flags, fd, 0);
    if (data == MAP_FAILED)
        perror("mmap");
    assert(data != MAP_FAILED);
}
如果未使用
MAP\u ANONYMOUS
,此操作也会失败(
EINVAL

有没有办法启用磁盘上带有内存映射文件的大型页面?


明确地说,我正在寻找一种在C中实现这一点的方法——我不是在要求一种解决方案来应用于现有的可执行文件(那么问题就属于超级用户了)。

看起来您使用的底层文件系统不支持使用大页面的内存映射文件

例如,对于ext4,此支持仍在开发中,尚未包含在内核中(截至2017年5月19日)


如果您运行应用了该补丁集的内核,请注意,您需要在文件系统装载选项中启用巨大页面支持,例如,为所需的文件系统在
/etc/fstab
中的第四列添加
巨大=始终
,或者使用
sudo mount-o重新装载,巨大=始终/mountpoint

这里有一个困惑:巨大的页面可以通过原始内核界面或/或通过用户空间库(libhugetlbfs)和附带的工具(例如
hugeadm
)使用

如果您想
mmap()
将内存区域划分为巨大的页面。您正在使用“原始内核接口”。要做到这一点,这里有一个食谱


如果您想使用用户空间库(libhugetlbfs),请从和获得帮助。

我一直在尝试类似的东西,但运气不好。如果你提出了一个解决方案,请分享:)顺便说一句:你读过这个QA吗:它不能解决我的问题,但它提供了一些内核文档的链接。我试着按照那个文档来做——仍然没有任何运气,但也许你能有所收获。
    rc = madvise(data, size, MADV_HUGEPAGE);
    if (rc != 0)
        perror("madvise");
    assert(rc == 0);