2009-10-26 102 views
5

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

(我不能在用户空间分配数据,因为用户空间程序不知道meta_buff的大小,而且用户空间程序不能分配固定数量的内存,并且一次又一次地调用系统调用来读取整个元数据。meta_data必须在一次系统调用中返回)

  1. 如何从内核线程为用户空间程序分配内存? (我甚至会很感激,如果你能指向我的任何其他系统调用做类似的操作 - 在内核中分配和释放用户空间)
  2. 这个接口是正确的还是有更好的方法来做到这一点?
+0

最小运行示例:https://stackoverflow.com/questions/10760479/how-to-mmap-a-linux-kernel-buffer-to-user-space/45645732#45645732 – 2017-08-12 01:45:42

回答

11

不要试图从内核为用户空间分配内存 - 这是对内核抽象层的巨大破坏。相反,考虑一些其他选项:

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

这很难说更多不知道为什么这必须是原子。实际上,分配内存无论如何都需要中断(或者你不太可能成功),所以不太可能退出内核会损伤很多。实际上,任何写入用户空间内存必须可中断,因为页面错误可能需要IO。

相关问题