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

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

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

  1. 如何从内核线程为用户空间程序分配内存? (如果你能指向我的其他系统调用执行相似的操作 – 我将在内核中分配并释放用户空间)
  2. 这个界面是正确的还是有更好的方法来做到这一点?

Solutions Collecting From Web of "从内核线程为用户空间分配内存"

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

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

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