文章插图
继续跟入__vfs_write:
ssize_t __vfs_write(struct file *file, const char __user *p, size_t count,loff_t *pos){ if (file->f_op->write)return file->f_op->write(file, p, count, pos); else if (file->f_op->write_iter)return new_sync_write(file, p, count, pos); elsereturn -EINVAL;
关键代码在这里:
if (file->f_op->write)return file->f_op->write(file, p, count, pos);
上面提到建立了/dev/hello和file_operations的关系 。所以这里其实就是判断hello驱动里有没有定义write函数,如果有,那就调用hello驱动里的write函数 。
所以,按照如上的路径,应用程序里的write就顺利的调用到了hello驱动里的write函数 。因为我们驱动里的hello_write和hello_read里都返回了0 。所以,应用程序里的write和read也返回了0 。
ssize_t hello_write(struct file *f, const char __user *u, size_t s, loff_t *l){printk(KERN_EMERG"hello_writern");return 0;}ssize_t hello_read(struct file *f, char __user *u, size_t s, loff_t *l){printk(KERN_EMERG"hello_readrn");return 0;}
如果你想让测试程序里的write和read返回非零值,只要把驱动里的return 0,改为任意值就好了,大家可以自己测试一下 。
关注“技术简说”,带你一步一步学习linux内核驱动 。
推荐阅读
- 软件测试基础——Linux系统搭建MySQL数据库
- linux下多线程与并发服务器设计方案及常见问题
- 如何解密 Linux 版本信息
- 深入聊聊Linux 五种IO模型
- kali linux之应用层Dos
- linux内核驱动第1讲:带你编写一个最简单的字符设备驱动
- Linux常规命令
- 淘宝c店如何升级为企业店铺 淘宝c店怎么开发票
- 制作一个app的成本多少?app的制作费用清单
- 整理 Linux下列出目录内容的命令