linux字符设备驱动简介


Linux字符设备驱动




用到的结构体cdev:
既然要编写字符设备驱动,根据编程思想,需要把字符设备给抽象出来,
在Linux2.6内核中,使用cdev结构体描述一个字符设备
struct cdev{
struct koject kobj;/*内嵌kobject对象*/
struct module *owner;/*所属模块(详细请见我的“内核对象简介”)*/
struct file_operations *ops;/*文件操作结构体*/
struct list_head list;/*内核链表节点*/
dev_t dev;/*设备号*/
unsigned int count;
}




重要成员解释:
(1)cdev结构体中的dev_t成员定义设备号,为32位
这其中包括12位主设备号,20位次设备号
可以通过以下两个宏来获取主设备号和次设备号
MAJOR(dev_t dev);//获取主设备号
MINOR(dev_t dev);//获取次设备号
(2)file_operations中定义了字符设备驱动提供给虚拟设备文件系统的接口



既然有设备驱动响应的结构体,那么一定有对应的操作函数函数
下面就介绍一下操作该结构体的函数:
void cdev_init(struct cdev*,struct file_operations *);
//作用,用file_operations初始化cdev结构体
struct cdev *cdev_alloc(void);
//作用,为cdev结构动态分配一块内存
void cdev_put(struct cdev *p);
int cdev_add(struct cdev *,dev_t,unsigned);
//作用,注册设备,其实也就是为cdev结构体添加你申请的设备号(关联)
void cdev_del(strcut cdev *);
//作用,删除设备





分配和释放设备号:
在调用cdev_add()函数向系统注册字符设备之前‘,首先应该调用register_chrdev_region()(register_chrdev()的升级版)
或者alloc_register_region()向设备申请设备号
int register_chrdev_region(dev_t from,unsigned count,const char *name);
int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count,const char*name);




//在调用cdev_del()函数从系统中注销字符设备之后,需要调用unregsiter_chrdev_region()函数释放原先申请的设备号
void unregister_chrdev_region()






对cdev结构中file_operations结构体的更详细的解释
file_operations结构体很重要,关于此结构体更详细描述可以去网上google一下

这里附上一张,字符设备驱动程序的全景架构图:



















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值