linux字符cdev和inode的联系
好长时间没怎么看书了,最近把字符设备驱动部分又复习了一下,写个笔记. Char Device Driver 相关数据结构: struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int count; }; 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; }; static struct char_device_struct { struct char_device_struct *next; unsigned int major; unsigned int baseminor; int minorct; char name[64]; struct file_operations *fops; struct cdev *cdev; /* will die */ } *chrdevs[CHRDEV_MAJOR_HASH_SIZE]; #define CHRDEV_MAJOR_HASH_SIZE 255 下面本文通过一下三个方面以及他们的关联来描述字符设备驱动: 1. 字符驱动模型 2. 字符设备的设备号 3. 文件系统中对字符设备文件的访问 1. 字符驱动模型 每个字符驱动由一个 cdev 结构来表示. 在设备驱动模型(device driver model)中, 使用 (kobject mapping domain) 来记录字符设备驱动. 这是由 struct kobj_map 结构来表示的. 它内嵌了255个struct probe指针数组 kobj_map由全局变量 cdev_map 引用: static struct kobj_map *cdev_map; 相关函数说明: cdev_alloc() 用来创建一个cdev的对象 cdev_add() 用来将cdev对象添加到驱动模型中,其主要是通过kobj_map()来实现的. kobj_map() 会创建一个probe对象,然后将其插入cdev_map中的某一项中,并关联probe->data 指向 cdev struct kobject *kobj_lookup(struct kobj_map *domain, dev_t dev, int *index) 拥有帝国一切,皆有可能。欢迎访问phome.net 根据设备号,在cdev_map中查找其cdev对象内嵌的kobject. (probe->data->kobj),返回的是cdev的kobject
2. 字符设备的设备号 字符设备的主,次设备号的分配: 全局数组 chrdevs 包含了255(CHRDEV_MAJOR_HASH_SIZE 的值)个 struct char_device_struct的元素. 每一个对应一个相应的主设备号. 如果分配了一个设备号,就会创建一个 struct char_device_struct 的对象,并将其添加到 chrdevs 中. 这样,通过chrdevs数组,我们就可以知道分配了哪些设备号. 相关函数: register_chrdev_region( ) 分配指定的设备号范围 alloc_chrdev_region( ) 动态分配设备范围 他们都主要是通过调用函数__register_chrdev_region() 来实现的 要注意,这两个函数仅仅是注册设备号! 如果要和cdev关联起来,还要调用cdev_add() register_chrdev( ) 申请指定的设备号,并且将其注册到字符设备驱动模型中. 它所做的事情为: 1. 注册设备号, 通过调用 __register_chrdev_region() 来实现 2. 分配一个cdev, 通过调用 cdev_alloc() 来实现 3. 将cdev添加到驱动模型中, 这一步将设备号和驱动关联了起来. 通过调用 cdev_add() 来实现 4. 将第一步中创建的 struct char_device_struct 对象的 cdev 指向第二步中分配的cdev. register_chrdev()是老的接口,这一步在新的接口中并不需要. 3. 文件系统中对字符设备文件的访问 对于一个字符设备文件, 其inode->i_cdev 指向字符驱动对象cdev, 如 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |