首页 > 解决方案 > 在内核模块中分配大页面

问题描述

我正在寻找一种在内核模块中分配大页面(2M 或 1G)的方法(我使用的是内核版本 4.15.0)。

在用户空间中,我可以挂载hugetlbfs文件系统,然后使用mmap(参见,例如,https ://blog.kevinhu.me/2018/07/01/01-Linux-Hugepages/ )分配大页面。在内核空间中是否有类似的方法可以做到这一点?

我知道我可以先在用户空间中分配它们,然后使用 将它们传递给内核get_user_pages,如Sequential access to hugepages in kernel driver 中所述。但是,我正在寻找一种更直接的方式来分配它们,因为我只需要在内核空间中使用它们。

标签: linux-kernelx86x86-64kernel-modulehuge-pages

解决方案


类似的东西

kmalloc(0x200000, GFP_KERNEL | __GFP_COMP)

应该管用。

正如这篇LWN 文章中所解释的:

复合页面只是将两个或更多物理上连续的页面组合成一个单元,在许多方面可以将其视为单个更大的页面。它们最常用于创建大页面,在hugetlbfs 或透明大页面子系统中使用,但它们也出现在其他上下文中。复合页可以用作匿名内存或用作内核中的缓冲区;但是,它们不能出现在页面缓存中,页面缓存只准备处理单例页面。

这假设大页面已配置且可用。


推荐阅读