内核空间和用户空间之间的大型共享内存

时间:2014-06-17 21:57:05

标签: c linux linux-kernel kernel shared-memory

我正在研究一个研究项目,我必须在内核模块和用户空间程序之间共享一个大型数据结构。数据结构可能变得非常大,并且由于应用程序对性能至关重要,我尝试使用共享内存来减少序列化结构的开销(使用其他接口,如NetLink)。我目前根据此链接制作了测试代码:

[http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html#s8][1]

他们正在使用 debugfs 。 我将链接中的代码添加到我的内核模块中,并编写了一个类似于他们的自定义用户空间程序。我尝试使用小尺寸的数据结构,效果很好。您可以在代码中注意到,它们只共享1页内存。我想知道是否有一种简单的方法来分享比一页更多的内存。

1 个答案:

答案 0 :(得分:6)

在做很多页面方面并没有太大的不同。

在open(alloc_pages或变体)中分配更多页面,将它们存储在一个数组中,然后你的错误处理程序需要(基于错误地址):

  • 使用类似的方法计算区域的偏移量 "(((无符号 long)vmf-> virtual_address - vma-> vm_start)+(vma-> vm_pgoff<< PAGE_SHIFT))"
  • 除以PAGE_SIZE以计算数组中的页面索引
  • 范围检查以确保其有效
  • 从数组中提取struct page *
  • 调用get_page进行映射

您可以继续使用debugfs,或者在模块初始化中进行少量额外工作,在其上放置一个更标准的字符设备前端。 (为此,没有什么需要在module_init / module_exit部分之外进行更改。)