一些背景信息:
内核版本:CentOS 6.4 / 2.6.32-358.el6.x86_64
内核启动选项:hugepagesz = 1g hugepages = 64 default_hugepagesz = 1g
/ proc / meminfo的相关部分:
AnonHugePages:0 kB
HugePages_Total:64
HugePages_Free:64
HugePages_Rsvd:0
HugePages_Surp:0
Hugepagesize:1048576 kB
DirectMap4k:848 kB
DirectMap2M:2062336 kB
DirectMap1G:132120576 kB
我可以挂载-t hugetlbfs nodev / mnt / hugepages. CONfig_HUGETLB_PAGE为true. MAP_HUGETLB已定义.
我已经阅读了一些关于使用libhugetlbfs在用户空间中调用get_huge_pages()的信息,但理想情况下,这个缓冲区将在内核空间中分配.我尝试用MAP_HUGETLB调用do_mmap(),但它似乎没有改变自由大页面的数量,所以我认为它实际上并没有用大页面支持mmap.
所以我想我得到的是,有什么方法可以将缓冲区映射到内核空间中的1GB HugePage,还是必须在用户空间中完成?或者,如果有人知道任何其他方式,我可以获得一个巨大的(1-64GB)数量的连续物理内存可用作内核缓冲区?
解决方法 这在内核空间中并不常见,因此没有太多示例.就像任何其他页面一样,大页面分配了alloc_pages,调整到:
struct page *p = alloc_pages(GFP_TRANSHUGE,HPAGE_PMD_ORDER);
HPAGE_PMD_ORDER是一个宏,根据普通页面定义单个巨大页面的顺序.以上暗示在内核中启用了透明的大页面.
然后,您可以使用kmap()以通常的方式继续映射获取的页面指针.
免责声明:我自己从未尝试过,所以你可能需要做一些实验.要检查的一件事是:HPAGE_PMD_SHIFT表示较小“巨大”页面的顺序.如果你想使用那些巨大的1GB页面,你可能需要尝试不同的顺序,可能是PUD_SHIFT – PAGE_SHIFT.
总结以上是内存溢出为你收集整理的如何在Linux内核模块中分配1GB HugePages支持的DMA缓冲区?全部内容,希望文章能够帮你解决如何在Linux内核模块中分配1GB HugePages支持的DMA缓冲区?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)