and*_*eas 5 x86 x86-64 kernel-module linux-kernel huge-pages
我正在寻找一种在内核模块中分配大页面(2M或1G)的方法(我正在使用内核版本4.15.0)。
在用户空间中,我可以挂载hugetlbfs文件系统,然后使用分配大页面mmap(请参阅例如https://blog.kevinhu.me/2018/07/01/01-Linux-Hugepages/)。在内核空间中有类似的方法吗?
我知道我可以先在用户空间中分配它们,然后使用get_user_pages,将它们传递给内核,如在内核驱动程序中对宏页面的顺序访问中所述。但是,我正在寻找一种更直接的分配方式,因为我只在内核空间中需要它们。
类似的东西
kmalloc(0x200000, GFP_KERNEL | __GFP_COMP)
Run Code Online (Sandbox Code Playgroud)
应该管用。
正如这篇LWN 文章中所解释的:
复合页面只是将两个或多个物理上连续的页面分组为一个单元,该单元在许多方面可以被视为单个更大的页面。它们最常用于创建大页面,在 Hugetlbfs 或透明大页面子系统中使用,但它们也出现在其他上下文中。复合页可以用作匿名内存或用作内核内的缓冲区;但是,它们不能出现在页面缓存中,页面缓存只准备处理单例页面。
这假设大页面已配置且可用。