Linux字符设备驱动框架

本文详细介绍了Linux字符设备驱动的注册过程、设备结构的分配及设备驱动打开的具体步骤。包括设备注册时如何查找并使用设备号,cdev结构的分配与初始化,以及打开设备文件时VFS如何调用chrdev_open等。

++++++++++++++++++++++++++++++++++++++++++

本文系本站原创,欢迎转载! 转载请注明出处:

http://blog.youkuaiyun.com/mr_raptor/article/details/6269507

++++++++++++++++++++++++++++++++++++++++++

一、设备注册(fs/char_dev.c

register_chrdev_region ->

__register_chrdev_region ->

主要任务:

struct char_device_struct类型的全局变量chrdevs[255]中倒着找到第一个可用的char_device_struct结构,将设备号和设备名等相关信息填充进去。

二、设备结构分配(fs/char_dev.c

cdev_alloc -> 通过struct cdev *p = kzalloc() 实现cdev结构的分配

cdev_init -> cdev->ops = fops;

cdev_add ->

cdev_add里,调用了kobj_map()这个设备模块映射函数,将dev_t设备号加入到了kobj_map结构体里。其实就是将设备号(最大为255)放入到了一个排好序的数组里,如下代码中的

struct probe *probes[255];。 struct kobj_map { struct probe { struct probe *next; dev_t dev; unsigned long range; struct module *owner; kobj_probe_t *get; int (*lock)(dev_t, void *); void *data; } *probes[255]; struct mutex *lock; };

三、设备驱动的打开

当字符设备文件通过open系统调用打开时,VFS会调用chrdev_open

int chrdev_open(struct inode * inode, struct file * filp)

chrdev_open主要完成以下工作:

1. 利用传递过来的inode结构里的i_rdev设备号,通过kobj_lookup找到当前设备对应的kobj对象

drivers/base/map.c

struct kobject *kobj_lookup (struct kobj_map *domain, dev_t dev, int *index)

2. 通过container_of找到kobj所在的cdev结构(注册字符设备时分配上面第二步)

3. cdev结构中的ops(操作函数指针)赋值给file结构(传递回去让用户空间访问)。

4. 调用ops中的open(注册字符驱动时的open操作函数),实现对驱动的open访问。

++++++++++++++++++++++++++++++++++++++++++

本文系本站原创,欢迎转载! 转载请注明出处:

http://blog.youkuaiyun.com/mr_raptor/article/details/6269507

++++++++++++++++++++++++++++++++++++++++++

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值