LDD读书笔记——字符设备驱动程序
2012-12-28 20:22
176 查看
编写字符设备的驱动程序一般流程:
定义驱动程序为用户程序提供的能力(机制);
决定模块的核心数据结构,如:描述设备的,描述设备数据在内存中的存放形式的等;
确定主、次设备号;
通过/proc/devices可获得设备的主设备号,依此在/dev下mknod出设备文件;
编写模块的init, exit函数;
编写file_operations结构中的功能函数:open release, read write等;
对file_operations, file和inode的理解
file_operations结构,与设备编号一一对应,向外界(或者说是上层)提供操作本设备的方法。结构中除了owner用于指向模块,其余全是callback函数,模块根据自已的能力和需求,完成对应的callback——即方法。
由程序员创建,存放于对应模块下,生存周期等同于模块的生存周期,全部成员由程序员填写。
file结构,任一打开的文件在内核中均有一个对应的file结构,故与设备文件是一一对应的,并描述其相关的文件属性。file_operations中的方法基本都会带有这个结构作为参数,file结构中有两个重要的成员,f_op指向设备文件对应的file_operations结构,描述文件能提供的方法,private_data描述设备在内存中的私有数据,应直接指向描述该设备的结构。
由内核创建,生存周期始于open终于close,至少需要在open时填写成员private_data。
inode结构,同样用于描述文件,与设备文件一一对应,与file不同的是:file是描述符,“可能会有许多个表示打开的文件描述符的file结构,但它们都指向单个inode结构”。成员上i_cdev指向模块下的字符设备的内部结构,一般应该存放在描述设备的结构中。
由内核创建,生存周期与文件的生存周期一致,全部成员由内核填写。
描述模块的结构
书中对描述scull模块的结构定义为:
可见结构成员主要为私有数据相关的和必需的字符设备的结构体。具体上data quantum qset size用于指向私有数据和描述私有数据在内存中的存放形式。
字符设备的初始化
简单来说:分配设备编号->定义设备提供的方法(填写file_operations结构)->对每一设备文件进行:cdev_init->填写cdev结构以及描述设备的结构->cdev_add。
方法重载
我的理解就是对方法(callback函数)的替换,实现同一设备下提供多种不同的操作行为。在驱动编写中,只要可以拿到file结构,就可以对file下的f_op指针进行重新关联,以实现方法重载,当然大多都是在open时进行方法重载。
定义驱动程序为用户程序提供的能力(机制);
决定模块的核心数据结构,如:描述设备的,描述设备数据在内存中的存放形式的等;
确定主、次设备号;
通过/proc/devices可获得设备的主设备号,依此在/dev下mknod出设备文件;
编写模块的init, exit函数;
编写file_operations结构中的功能函数:open release, read write等;
对file_operations, file和inode的理解
file_operations结构,与设备编号一一对应,向外界(或者说是上层)提供操作本设备的方法。结构中除了owner用于指向模块,其余全是callback函数,模块根据自已的能力和需求,完成对应的callback——即方法。
由程序员创建,存放于对应模块下,生存周期等同于模块的生存周期,全部成员由程序员填写。
file结构,任一打开的文件在内核中均有一个对应的file结构,故与设备文件是一一对应的,并描述其相关的文件属性。file_operations中的方法基本都会带有这个结构作为参数,file结构中有两个重要的成员,f_op指向设备文件对应的file_operations结构,描述文件能提供的方法,private_data描述设备在内存中的私有数据,应直接指向描述该设备的结构。
由内核创建,生存周期始于open终于close,至少需要在open时填写成员private_data。
inode结构,同样用于描述文件,与设备文件一一对应,与file不同的是:file是描述符,“可能会有许多个表示打开的文件描述符的file结构,但它们都指向单个inode结构”。成员上i_cdev指向模块下的字符设备的内部结构,一般应该存放在描述设备的结构中。
由内核创建,生存周期与文件的生存周期一致,全部成员由内核填写。
描述模块的结构
书中对描述scull模块的结构定义为:
struct scull_dev{ struct scull_qset *data; int quantum; int qset; unsigned long size; unsigned int access_key; struct semaphore sem; struct cdev cdev; };
可见结构成员主要为私有数据相关的和必需的字符设备的结构体。具体上data quantum qset size用于指向私有数据和描述私有数据在内存中的存放形式。
字符设备的初始化
简单来说:分配设备编号->定义设备提供的方法(填写file_operations结构)->对每一设备文件进行:cdev_init->填写cdev结构以及描述设备的结构->cdev_add。
方法重载
我的理解就是对方法(callback函数)的替换,实现同一设备下提供多种不同的操作行为。在驱动编写中,只要可以拿到file结构,就可以对file下的f_op指针进行重新关联,以实现方法重载,当然大多都是在open时进行方法重载。
相关文章推荐
- 深入浅出Linux设备驱动之字符设备驱动程序
- 字符设备驱动程序之按键——异步通信机制
- 字符设备驱动程序框架
- LDD3源码分析之字符设备驱动程序
- Linux 字符设备驱动程序流程
- 一个简单的演示用的Linux字符设备驱动程序
- 最基本的字符设备驱动程序框架
- Linux字符设备驱动程序的编写框架
- 嵌入式实验7——字符设备驱动程序
- 小学生学嵌入式:)Linux_字符设备驱动程序_初探
- 我的第一个字符设备驱动程序-First_drv
- 字符设备驱动程序之同步互斥阻塞
- 第三章:字符设备驱动程序
- 字符设备驱动程序 之 使用&分析
- 字符设备驱动程序学习笔记二
- Linux设备驱动工程师之路——高级字符设备驱动程序
- Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]
- Linux字符设备驱动程序的一个简单示例
- 字符设备驱动程序编写基础
- Linux设备驱动程序第三版学习(7)- 高级字符驱动程序操作(续2)- poll/select