Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在工作队列(linux、内核)中使用复制到用户?_C_Linux_Linux Kernel - Fatal编程技术网

C 如何在工作队列(linux、内核)中使用复制到用户?

C 如何在工作队列(linux、内核)中使用复制到用户?,c,linux,linux-kernel,C,Linux,Linux Kernel,我想把工作推迟到工作队列,这样就可以利用我的多处理器内核。我还想在工作完成后将数据复制回用户空间缓冲区。现在我知道用户空间地址也依赖于用户空间进程。我已经将电流传递到工作功能。如何在工作功能中设置正确的上下文,以便安全地使用copy\u to\u user?仅从用户上下文调用copy\u to\u user。从工作队列上下文调用它是个坏主意 您可以分配内存块kmalloc,将其提交给workqueue,然后在诸如read、write、ioctl和copy workqueue result to

我想把工作推迟到工作队列,这样就可以利用我的多处理器内核。我还想在工作完成后将数据复制回用户空间缓冲区。现在我知道用户空间地址也依赖于用户空间进程。我已经将电流传递到工作功能。如何在工作功能中设置正确的上下文,以便安全地使用copy\u to\u user?

仅从用户上下文调用copy\u to\u user。从工作队列上下文调用它是个坏主意

您可以分配内存块kmalloc,将其提交给workqueue,然后在诸如read、write、ioctl和copy workqueue result to userspace之类的函数中等待直到wokqueue在用户上下文中完成其工作

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


参见mmap实施示例。

谢谢您的回复。在我的例子中,我想堆叠文件系统。例如,我得到一个带有缓冲区用户空间的读取请求。现在,我分配内核内存kmalloc,并使用kernel_read in workqueue从子文件系统读取到内核缓冲区。现在,如果我只在所有工作完成后复制到用户空间缓冲区,我就不能并行化复制-我希望复制速度更快。我只能从最顶层的文件系统的用户空间读写调用,所以我想我不能使用mmap。@tofi,我怀疑使用多核的并行复制比单核复制快多少。小型块—适合内核内部缓存的块—使用多个内核进行复制没有意义。大数据块复制受到外部RAM速度的限制。单核写入运行速度比RAM快得多。您可以仅使用内核内存对其进行基准测试。如果你发现在速度上有了显著的提高,那么继续工作是有意义的。