Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
Linux kernel 是否将\u复制到\u用户而不复制数据?_Linux Kernel_Linux Device Driver_Embedded Linux - Fatal编程技术网

Linux kernel 是否将\u复制到\u用户而不复制数据?

Linux kernel 是否将\u复制到\u用户而不复制数据?,linux-kernel,linux-device-driver,embedded-linux,Linux Kernel,Linux Device Driver,Embedded Linux,对于一个项目,我们正在SoC系统上从嵌入式FPGA读取和写入数据。现在只需要1个字节就可以写了,但是很好。read函数正确地访问FPGA并获得正确的值,但出于某种原因,copy_to_用户不会将任何内容复制到用户。在我的设备上运行cat不会返回任何内容。我希望有人能告诉我哪里做错了 附加信息:我们的目标是配备ARMv7处理器的Altrera Cyclone V SoC系统。我们正在使用Altera推荐的内核为4.3.0的buildroot系统 代码: 输出,包括内核消息和调试打印: # insm

对于一个项目,我们正在SoC系统上从嵌入式FPGA读取和写入数据。现在只需要1个字节就可以写了,但是很好。read函数正确地访问FPGA并获得正确的值,但出于某种原因,copy_to_用户不会将任何内容复制到用户。在我的设备上运行cat不会返回任何内容。我希望有人能告诉我哪里做错了

附加信息:我们的目标是配备ARMv7处理器的Altrera Cyclone V SoC系统。我们正在使用Altera推荐的内核为4.3.0的buildroot系统

代码:

输出,包括内核消息和调试打印:

# insmod mymodule.ko 
[  701.922707] Initializing mymodule module
[  701.926681] Probing for fpga devices...
[  701.931382] Probing successful!
[  701.935429] FPGA successfully initialized!
# echo -n -e \\x81 > /dev/mydevice
# cat /dev/mydevice 
[  721.555795] Data received from FPGA: 129
[  721.559539] 0: 4 bytes copied to userspace pointer 0xbec67c78, value: 129!

非常感谢

您确定返回0;?我认为这个函数应该返回复制的字节数,在您的例子中,应该是return sizeofrad_value32

您确定返回0;?我认为这个函数应该返回复制的字节数,在您的例子中,应该是return sizeofrad_value32

是的,这确实改变了一些事情。cat现在返回\201,我假设它是该字节的某种表示形式。但输出似乎从未停止过,你知道为什么吗?这个函数将在循环中被调用,直到它返回0,这意味着流的结束。因此,您的cat命令只是不断地反复转储相同的寄存器值。您可能希望使用命令head-C4(而不是CAT4)读取单个值。您也可以检查偏移值-开始时它将为0,然后它将变为4、8、12、16等等。所以当偏移量!=0,您确实返回了0head-c4,但我希望它在没有更多数据可读取时停止。我添加了一个简单的if偏移量!=0将0返回到开头,但在第一次调用之前,该操作将停止。有没有其他方法可以让cat从0以外的值开始读取?Linux内核中类似的函数都使用简单的从缓冲区读取的函数-参见这里的一个例子:要读取的数组是filp->private_数据,要读取的字节数是代码中的内存块*块信息大小。因此,对于您来说,它将从缓冲区、len、offset和read\u value32、sizeofrad\u value32返回simple\u read\u;您不需要调用copy\u to\u用户。这个函数还更新了偏移量,我们忘了在这里做。是的,这确实改变了一些事情。cat现在返回\201,我假设它是该字节的某种表示形式。但输出似乎从未停止过,你知道为什么吗?这个函数将在循环中被调用,直到它返回0,这意味着流的结束。因此,您的cat命令只是不断地反复转储相同的寄存器值。您可能希望使用命令head-C4(而不是CAT4)读取单个值。您也可以检查偏移值-开始时它将为0,然后它将变为4、8、12、16等等。所以当偏移量!=0,您确实返回了0head-c4,但我希望它在没有更多数据可读取时停止。我添加了一个简单的if偏移量!=0将0返回到开头,但在第一次调用之前,该操作将停止。有没有其他方法可以让cat从0以外的值开始读取?Linux内核中类似的函数都使用简单的从缓冲区读取的函数-参见这里的一个例子:要读取的数组是filp->private_数据,要读取的字节数是代码中的内存块*块信息大小。因此,对于您来说,它将从缓冲区、len、offset和read\u value32、sizeofrad\u value32返回simple\u read\u;您不需要调用copy\u to\u用户。这个函数还更新了偏移量,我们忘了在这里这么做。还需要注意的是,您的调试打印打印的是一个名为dev->data\u value8的东西,没有在代码段中使用,也没有读取\u value32。是的,这是我之前写的值,本地存储在一个结构中,所以我有一个比较点,第一次调试打印应该正确地打印读取的值。想想@pelya是正确的。还需要注意的是,调试打印打印的是一个名为dev->data\u value8的东西,没有在代码段中使用,也没有读取\u value32。是的,这是我之前写的值,本地存储在结构中,因此我有一个比较点,第一次调试打印应该正确打印读取的值。
# insmod mymodule.ko 
[  701.922707] Initializing mymodule module
[  701.926681] Probing for fpga devices...
[  701.931382] Probing successful!
[  701.935429] FPGA successfully initialized!
# echo -n -e \\x81 > /dev/mydevice
# cat /dev/mydevice 
[  721.555795] Data received from FPGA: 129
[  721.559539] 0: 4 bytes copied to userspace pointer 0xbec67c78, value: 129!