05 简单的字符设备驱动操作
来源:互联网 发布:淘宝怎么进淘宝客 编辑:程序博客网 时间:2024/05/16 11:31
open、release、read、write还记得这些file_operations中的函数指针么?静静地实现他们吧。
1、open方法
原型: int (*open)(struct inode *inode, struct file *filp);
任务:检查设备特定错误;如果设备首次打开,对其进行初始化;必要时,更新f_op指针;分配并填写置于filp->private_data里的数据结构;
2、release方法
原型: int (*release) (struct inode *, struct file *);
任务:open方法的逆操作
(1)释放由open分配的、保存在filp->private_data中的所有内容;
(2)在最后一次关闭操作时关闭设备;
个人认为谨记release中要做一些free操作是很有必要的。不知道你有没有,反正我经常是malloc后忘记free,很臭的一个毛病。
在Page 64前四段简明地表达了系统调用中open、fork、dup、close与内核中open、release、flush的对应关系,多看几遍这个,我想你有一种”哦,原来是这样“的感觉。(在这页提到一个dup的系统调用,第一次见,百度了一下是复制文件描述符,如果用到感觉会很方便,等用到的时候百度吧)
3、read & write
ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp);
ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp);
Page 70、71中read 、write 方法的实现对于初学者来说,理解是比较困难的。本质上read、write 方法实现了copy_to_user、copy_from_user。理解的时候,可以根据用户层的read write方法对比来看。每一个参数都是一一对应的。
#include <asm/uaccess.h>
unsigned long copy_to_user(void __user *to, const void *from, unsigned long count); //read实现
unsigned long copy_from_user(void *to, const void __user *from, unsigned long count); //write实现
以下是我的read、write简单实现,以及对应用户层的read 、write 调用;你可以添加到自己的代码中运行看看。其中返回值并没有做处理,只是为了简要说明其功能。在驱动中后续会常用这两方法,后续完善(其实是有点犯懒了)
81 size_t scull_read(struct file *filp, char __user *buf, size_t count, loff_t *f_ops) 82 { 83 const char *kernel_buf = "hello scull read"; 84 85 copy_to_user(buf, kernel_buf, 30); 86 87 printk(KERN_INFO "scull_read\n"); 88 89 return 0; 90 } 91 size_t scull_write(struct file *filp, char __user *buf, size_t count, loff_t *f_ops) 92 { 93 printk(KERN_INFO "scull_write\n"); 94 char kernel_buf[BUFF_SIZE]; 95 96 copy_from_user(kernel_buf, buf, 30); 97 printk(KERN_INFO "%s\n", kernel_buf); 98 return 0; 99 }
15 read(fd, buff, 20); 16 puts(buff); 17 strcpy(buff, "I'm so happy"); 18 write(fd, buff, 10);
0 0
- 05 简单的字符设备驱动操作
- [设备驱动] 最简单的内核设备驱动--字符驱动
- 简单字符驱动设备
- 字符设备驱动--- 设备操作
- 很简单的字符设备驱动
- 简单的一个字符设备驱动
- Tiny6410 简单的LED字符设备驱动
- 简单字符设备驱动的编写
- 一个简单的字符设备驱动
- linux简单的字符设备驱动
- 一个简单的字符设备驱动
- Tiny6410 简单的LED字符设备驱动
- Linux字符设备驱动的简单总结
- 简单的字符设备驱动模型
- 简单字符设备的驱动源码讲解
- 支持阻塞操作的字符设备驱动
- Linux设备驱动——简单的字符驱动
- 驱动入门:一个简单的字符设备驱动
- 解析QT多线程程序详细设计之QObject可重入性 下篇
- 自定义dialog的方式,以及需要注意事项
- OpenCV : 基于切线方向的边缘增强算法
- react
- [Linux] 内核的 /proc 文件系统介绍及使用方法
- 05 简单的字符设备驱动操作
- 输入任意正整数a,b,c,返回最大值
- Java Serialization/序列化/反序列化 及 transient Java关键字详解
- eclipse自动调整代码格式
- 专题四1011
- mongo 更新数组 键值对
- php 开发负责均衡
- Cocos2d-x 3.x版本中SAX 解析 XML
- HDU 4836 LCA转RMQ