我的问题是关于将数据从内核传递到用户空间程序。我想实现一个系统调用“get_data(size, char *buff, char **meta_buf)”。在此调用中,buff 由用户空间程序分配,其长度在 size 参数中传递。然而,meta_buf 是一个可变长度的缓冲区,由内核分配(在用户空间程序的 vm 页中)和填充。用户空间程序将释放该区域。
(我无法在用户空间分配数据,因为用户空间程序不知道 meta_buff 的大小。此外,用户空间程序无法分配固定数量的内存并一次又一次地调用系统调用来读取整个元数据。 meta_data 必须在一个系统调用中返回)
- 如何从内核线程为用户空间程序分配内存? (如果你能指出任何其他执行类似操作的系统调用 - 在内核中分配并在用户空间中释放,我将不胜感激)
- 这个界面是否正确,或者是否有更好的方法?
最佳答案
不要试图从内核为用户空间分配内存——这是对内核抽象分层的严重违反。相反,请考虑其他一些选项:
- 让用户空间询问它需要多少空间。用户空间分配内存,然后从内核中获取内存。
- 将您的驱动程序拥有的用户空间 mmap 页面直接放入其地址空间。
- 设置所需数据量的上限。就分配那么多。
如果不知道为什么这必须是原子的,就很难说更多。实际上分配内存无论如何都需要是可中断的(否则你不太可能成功),所以离开和回到内核不太可能造成太大伤害。事实上,任何对用户空间内存的写入必须是可中断的,因为页面错误可能需要 IO。
关于linux - 从内核线程为用户空间分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1623008/