在中断处理程序中将数据从内核缓冲区移动到用户空间缓冲

时间:2017-01-27 02:30:00

标签: c linux linux-kernel driver linux-device-driver

新手到Linux内核和驱动程序开发。

我有数据以及来自pcie设备的中断。每次检测到中断时,我都希望驱动程序将数据从缓冲区(位于驱动程序中)复制到用户空间中的大缓冲区。用户应用程序不得"民意调查"新数据的驱动程序。

目前,我的中断处理程序尝试将数据copy_to_user()传递给用户空间。然而,这失败了。 copy_to_user()始终返回 n ,其中 n 是我要复制的字节数。我的猜测是中断处理程序的调用导致上下文切换导致副本失败?

我应该如何完成这项工作?

谢谢!

1 个答案:

答案 0 :(得分:4)

必须在用户空间进程的上下文中运行

copy_to_user(),因为不同的进程具有不同的地址空间。此外,如果内存碰巧被换出,copy_to_user()必须将其读回,这需要文件I / O和休眠,这不能在中断处理程序内完成。

通常,您在中断处理程序中使用的任何缓冲区必须由驱动程序本身控制(即分配)。如果要为该缓冲区提供一些用户空间程序访问权限,请实现mmap()。

实际上,将数据从DMA缓冲区复制到更大的缓冲区通常是应用程序的工作。