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

Adi*_*tya 8 c linux kernel shared-memory linux-kernel

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

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

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

Gil*_*ton 6

做很多页面并没有太大的不同.

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

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

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