如何在字符设备驱动中实现MAP_HUGETLB?

How to implement MAP_HUGETLB in a character device driver?

我有一个字符驱动程序在 /dev 下公开一个字符设备文件。我想在映射一些内存时使用大页面。

MAP_HUGETLB 似乎只有在与 MAP_ANONYMOUS 或透明大页面分组时才可用,但我对此不感兴趣。

mmap(...,MAP_HUGETLB|MAP_ANONYMOUS,..., -1, 0);

如何实现字符设备的大页面功能?它已经在某处完成了吗?

我没有找到内核树的示例。

这是不可能的。如果它们驻留在 hugetlbfs 文件系统中,您只能 mmap 具有 MAP_HUGETLB 的文件。由于 /proc 是一个 procfs 文件系统,您无法通过大页面映射这些文件。

你也可以从内核the checks performed in mmap看到这个:

    /* ... */

    if (!(flags & MAP_ANONYMOUS)) { // <== File-backed mapping?
        audit_mmap_fd(fd, flags);
        file = fget(fd);
        if (!file)
            return -EBADF;
        if (is_file_hugepages(file)) { // <== Check that FS is hugetlbfs
            len = ALIGN(len, huge_page_size(hstate_file(file)));
        } else if (unlikely(flags & MAP_HUGETLB)) { // <== If not, MAP_HUGETLB isn't allowed
            retval = -EINVAL;
            goto out_fput;
        }
    } else if (flags & MAP_HUGETLB) { // <== Anonymous MAP_HUGETLB mapping?

    /* ... */

另请参阅:

  • How to use Linux hugetlbfs for shared memory maps of files?