我的问题是将数据从内核传递到用户空间程序。我想实现一个系统调用“get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,其长度在size参数中传递。但是,meta_buf是一个可变长度的缓冲区,它被分配(在用户空间程序的vm页面中)并由内核填充。用户空间计划将释放该地区。
(我无法在用户空间中分配数据,因为用户空间程序不知道meta_buff的大小。此外,用户空间程序无法分配固定数量的内存并反复调用系统调用来读取整个元数据。必须在一个系统调用中返回meta_data)
答案 0 :(得分:11)
不要尝试从内核为用户空间分配内存 - 这严重违反了内核的抽象分层。相反,请考虑其他几个选项:
如果不知道为什么这必须是原子的,那么很难说更多。实际上,分配内存无论如何都需要中断(或者你不太可能成功),因此不太可能走出内核并重新受到伤害。实际上,任何写入用户空间内存必须是可以中断的,因为可能存在需要IO的页面错误。