我在sh4-arch linux 2.6.32上为设备编程,他从UDP套接字播放视频流。
我在用户空间(称为ubuffer
)中有一个解码器(内核空间)读取的环形缓冲区。 ubuffer
是从内核空间缓冲区(称为kbuffer
)映射的。
现有应用程序(带源代码)将数据从UDP套接字读取到用户空间中的ubuffer
。为了减少延迟,我创建了一个驱动程序,它将UDP sk_buf
中的有效负载数据直接读取到环形缓冲区。现在我正在使用来自现有应用程序的ioctl,它为每个UDP数据包发送一个ubuffer到ioctl_proc
。 ioctl_proc
制作copy_to_user(ubuffer+off, skb->data+skb_off, len)
并且一切正常。我需要在没有任何用户空间应用程序和ioctl的情况下完成它。所以我已将kbuffer
发送给我的驱动程序,并使用相同的参数制作memcpy(kbuffer+off, skb->data+skb_off, len)
而不是copy_to_user
(这是唯一的区别)并且它不起作用:我看到的图片有10个有效像素的百分比(一些文本和颜色),但休息失败。如果kbuffer
错了,我将看不到任何正确的东西,但我看到了一些东西。
len
的值大约为100-1300字节。
我做错了什么?也许我必须使用一些与页面对齐的调用?