从内核线程为用户空间分配内存

时间:2009-10-26 04:03:13

标签: linux linux-kernel

我的问题是将数据从内核传递到用户空间程序。我想实现一个系统调用“get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,其长度在size参数中传递。但是,meta_buf是一个可变长度的缓冲区,它被分配(在用户空间程序的vm页面中)并由内核填充。用户空间计划将释放该地区。

(我无法在用户空间中分配数据,因为用户空间程序不知道meta_buff的大小。此外,用户空间程序无法分配固定数量的内存并反复调用系统调用来读取整个元数据。必须在一个系统调用中返回meta_data)

  1. 如何从内核线程为用户空间程序分配内存? (如果你能指出我执行类似操作的任何其他系统调用 - 在内核中分配并释放用户空间,我甚至会感激不尽)
  2. 这个界面是正确的还是有更好的方法呢?

1 个答案:

答案 0 :(得分:11)

不要尝试从内核为用户空间分配内存 - 这严重违反了内核的抽象分层。相反,请考虑其他几个选项:

  • 让用户空间询问它需要多少空间。用户空间分配,然后从内核中获取内存。
  • 将驱动程序拥有的用户空间mmap页面直接放入其地址空间。
  • 设置所需数据量的上限。只需分配那么多。

如果不知道为什么这必须是原子的,那么很难说更多。实际上,分配内存无论如何都需要中断(或者你不太可能成功),因此不太可能走出内核并重新受到伤害。实际上,任何写入用户空间内存必须是可以中断的,因为可能存在需要IO的页面错误。