内核空间和用户空间的数据传递
还是前几天那个dm642的pci驱动。
static ssize_t device_read(struct file *filp, char __user *buf, size_t count, loff_t *offp),
static ssize_t device_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp),
static loff_t device_llseek(struct file *filp, loff_t off, int whence),
这三个内核驱动函数,在和用户空间交互数据的时候都有些问题。
read和write,count应该等于用户空间的fread、fwrite的字节个数,实际上我在内核里打印出来不等于。
buf指针传递的没有问题。
llseek里的whence,对应于用户空间fseek的SEEK_SET==0、SEEK_CUR==1、SEEK_END==2,实际上,0和1可以正常传递。当用户空间的参数是2时,内核空间接收到的数据是0;除此之外的其余数据,内核空间直接没有调用device_llseek。
请问这是可能什么原因呢,谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
你最好不要用fread、fwrite的C库函数,而用read,write来测试。fread、fwrite会多次调用系统调用,可能与你设想的不一样。
我必须跟用户空间有接口。你说的用read,write来测试具体是指什么呢?
用户空间可以用fread,fwrite这是标准I/O,也可以用系统I/O呀。就是read,write。
实际上,fread,fwrite最终也是调用的read,write操作实现的。read,write直接调用系统调用。
你可以试一下。
因此你执行一次fread可以能导致实际上执行多次系统调read,所以你可以先单独用read系统调用进行测试
看一下这篇帖子中我们的讨论:
http://linux.chinaunix.net/bbs/thread-1043550-1-1.html
多谢二位,read确实是这个问题。
我再看看write和seek了。
看来驱动版最近激起了我们高涨的学习钻研浪潮,希望再接再厉,大家都能成为顶尖的高手。
路漫漫其修远兮……
关键还是版主的积极引导,而且给大家提供了那么多优秀的学习教程。
Godbach过奖了,多亏你跟我一直探讨啊
希望一段时间后,我们都有所成吧。