05 简单的字符设备驱动操作

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); 


 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值