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

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

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

解决方案

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

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

不知道就很难多说 为什么 这必须是原子的。实际上,分配内存无论如何都需要是可中断的(否则你不太可能成功),因此进出内核并返回内核不太可能造成太大伤害。实际上, 任何 写入用户空间内存 必须 可中断,因为可能会出现需要 IO 的页面错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top