我知道如何在 linux 内核中获取普通页面并使用基于此代码的 mmap 与用户进程共享:http: //people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-8.html 现在我想要将其扩展为使用大页面(2M)。
将备份共享内存的文件放在hugetlbfs文件系统中就足够了吗?你也可以给我指一个关于使用大页面的教程吗?
到目前为止的进展: 我使用hugeadm启用了hugepages和透明hugepages,并添加了相应的grub配置。
stackoverflow 上的这篇文章说对 alloc_pages 使用以下参数
struct page *p = alloc_pages(GFP_TRANSHUGE, HPAGE_PMD_ORDER);
它不起作用,因为 /proc/meminfo 仍然说所有大页面都是免费的。
然后我变了
vma->vm_flags |= VM_RESERVED;
至
vma->vm_flags |= VM_HUGETLB;
但发生了以下错误:
Oct 4 15:43:50 masoud-VirtualBox kernel: [ 2756.091381] BUG: unable to handle kernel paging request at 00000000006f0082
Oct 4 15:43:50 masoud-VirtualBox kernel: [ 2756.091387] IP: [<ffffffff8119522e>] hugetlb_fault+0x3e/0x760
Oct 4 15:43:50 masoud-VirtualBox kernel: [ 2756.091394] PGD bde87067 PUD c2ad7067 PMD b79ca067 PTE 0
Oct 4 15:43:50 masoud-VirtualBox kernel: [ 2756.091399] Oops: 0000 [#1] SMP