一尘不染

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

linux

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

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

  1. 如何从内核线程为用户空间程序分配内存?(如果您可以将我指向执行类似操作的任何其他系统调用(在内核中分配并在用户空间中释放),我将不胜感激)
  2. 这个接口正确吗?还是有更好的方法呢?

阅读 197

收藏
2020-06-03

共1个答案

一尘不染

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

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

在不知道 为什么
这必须是原子的情况下很难说更多。实际上,分配内存无论如何都必须是可中断的(否则您不太可能成功),因此从内核中移出和移回内核的可能性不大。实际上,对用户空间内存的
任何 写入都 必须 是可中断的,因为存在可能需要IO的页面错误。

2020-06-03