如何在workqueue(linux,kernel)中使用copy_to_user?

时间:2017-01-12 16:09:53

标签: c linux linux-kernel

我想将工作推迟到工作队伍中,然后使用我的多处理器核心。此外,我想在工作完成后将数据复制回用户空间缓冲区。现在我知道用户空间地址也取决于用户空间进程。我已经将current传递给了工作函数。如何在工作函数中设置正确的上下文,以便我可以安全地使用copy_to_user

1 个答案:

答案 0 :(得分:1)

copy_to_user只打算从用户上下文中调用。从工作队列上下文中调用它是个坏主意。

你可以分配内存块(kmalloc),将它提交给工作队列,等到wokqueue完成它在用户上下文中的工作(在read,write,ioctl等函数中)并将workqueue结果复制到用户空间。

作为另一种方法,您可以分配内核内存并将其映射到用户空间,以便内核和用户空间可以同时直接访问内存。每次workqueue更新内核内存时,数据都可供用户空间使用。您必须在用户空间和内核空间工作队列之间实现某种同步,以使此方法可行。

有关mmap实施的示例,请参阅uvc_queue.c