LDD读书笔记——字符设备驱动程序

编写字符设备的驱动程序一般流程:

定义驱动程序为用户程序提供的能力(机制);

决定模块的核心数据结构,如:描述设备的,描述设备数据在内存中的存放形式的等;

确定主、次设备号;

通过/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时进行方法重载。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值