如何在字符设备驱动中实现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?
我有一个字符驱动程序在 /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?