内核空间和用户空间的数据传递

发布于 2022-09-22 13:54:43 字数 618 浏览 23 评论 0

还是前几天那个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

甜扑 2022-09-29 13:54:43

你最好不要用fread、fwrite的C库函数,而用read,write来测试。fread、fwrite会多次调用系统调用,可能与你设想的不一样。

ㄖ落Θ余辉 2022-09-29 13:54:43

原帖由 dreamice 于 2008-11-13 14:49 发表
你最好不要用fread、fwrite的C库函数,而用read,write来测试。fread、fwrite会多次调用系统调用,可能与你设想的不一样。

我必须跟用户空间有接口。你说的用read,write来测试具体是指什么呢?

凡尘雨 2022-09-29 13:54:43

原帖由 illeggy 于 2008-11-13 14:55 发表

我必须跟用户空间有接口。你说的用read,write来测试具体是指什么呢?

用户空间可以用fread,fwrite这是标准I/O,也可以用系统I/O呀。就是read,write。
实际上,fread,fwrite最终也是调用的read,write操作实现的。read,write直接调用系统调用。
你可以试一下。

帥小哥 2022-09-29 13:54:43

因此你执行一次fread可以能导致实际上执行多次系统调read,所以你可以先单独用read系统调用进行测试

漆黑的白昼 2022-09-29 13:54:43

看一下这篇帖子中我们的讨论:
http://linux.chinaunix.net/bbs/thread-1043550-1-1.html

妄想挽回 2022-09-29 13:54:43

多谢二位,read确实是这个问题。
我再看看write和seek了。

余生共白头 2022-09-29 13:54:43

原帖由 illeggy 于 2008-11-13 15:23 发表
多谢二位,read确实是这个问题。
我再看看write和seek了。

看来驱动版最近激起了我们高涨的学习钻研浪潮,希望再接再厉,大家都能成为顶尖的高手。
路漫漫其修远兮……

浪漫人生路 2022-09-29 13:54:43

原帖由 dreamice 于 2008-11-13 15:32 发表

看来驱动版最近激起了我们高涨的学习钻研浪潮,希望再接再厉,大家都能成为顶尖的高手。
路漫漫其修远兮……

关键还是版主的积极引导,而且给大家提供了那么多优秀的学习教程。

丢了幸福的猪 2022-09-29 13:54:43

原帖由 Godbach 于 2008-11-13 15:37 发表

关键还是版主的积极引导,而且给大家提供了那么多优秀的学习教程。

Godbach过奖了,多亏你跟我一直探讨啊
希望一段时间后,我们都有所成吧。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文