linux-kernel - 在内核模块中分配大页面
问题描述
我正在寻找一种在内核模块中分配大页面(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 中所述。但是,我正在寻找一种更直接的方式来分配它们,因为我只需要在内核空间中使用它们。
解决方案
类似的东西
kmalloc(0x200000, GFP_KERNEL | __GFP_COMP)
应该管用。
正如这篇LWN 文章中所解释的:
复合页面只是将两个或更多物理上连续的页面组合成一个单元,在许多方面可以将其视为单个更大的页面。它们最常用于创建大页面,在hugetlbfs 或透明大页面子系统中使用,但它们也出现在其他上下文中。复合页可以用作匿名内存或用作内核中的缓冲区;但是,它们不能出现在页面缓存中,页面缓存只准备处理单例页面。
这假设大页面已配置且可用。
推荐阅读
- javascript - 提示时 Node JS 生成输入文本
- powershell - Powershell Invoke-WebRequest 的问题
- installation - 在 UAC 提示后,Installshield installscript 安装程序终止
- javascript - TypeError:无法读取未定义的属性“凭据”-React-redux-firebase,Firebase Auth
- html - 如何在 MSSQL 数据库中高效地存储 HTML 内容
- linux - 在 bash 脚本问题中转义引号
- android - Jetpack Compose State:修改类属性
- c# - 根据父名获取一个JToken的路径
- symfony - Symfony 语法错误,意外的“?” 来自供应商的文件
- google-colaboratory - cp:无法创建常规文件'/.kaggle/':不是目录