您的位置:首页 > 其它

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模块的结构定义为:

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时进行方法重载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: