Linux 设备文件的创建和mdev.doc
《Linux 设备文件的创建和mdev.doc》由会员分享,可在线阅读,更多相关《Linux 设备文件的创建和mdev.doc(9页珍藏版)》请在三一文库上搜索。
1、Linux 设备文件的创建和mdev一、设备类相关知识设备类是虚拟的,并没有直接相应的物理实物。仅仅是为了更好地管理同一类设备导出到用户空间而产生的文件夹和文件。整个过程涉及到sysfs文件系统,该文件系统是为了展示linux设备驱动模型而构建的文件系统,是基于ramfs,linux根文件夹中的/sysfs即挂载了sysfs文件系统。Struct kobject数据结构是sysfs的基础。kobject在sysfs中代表一个文件夹,而linux的驱动(struct driver)、设备(struct device)、设备类(struct class)均是从kobject进行派生的,因此他们在s
2、ysfs中都相应于一个文件夹。而数据结构中附属的struct device_attribute、driver_attribute、class_attribute等属性数据结构在sysfs中则代表一个普通的文件。Struct kset是struct kobject的容器。即Struct kset能够成为同一类struct kobject的父亲,而其自身也有kobject成员。因此其又可能和其它kobject成为上一级kset的子成员。本文无意对sysfs和linux设备驱动模型进行展开,以后再另写文章进行分析。二、两种创建设备文件的方式在设备驱动中cdev_add将struct file_ope
3、rations和设备号注冊到系统后,为了可以自己主动产生驱动相应的设备文件。须要调用class_create和device_create,并通过uevent机制调用mdev(嵌入式linux由busybox提供)来调用mknod创建设备文件。当然也可以不调用这两个接口。那就手工通过命令行mknod来创建设备文件。三、设备类和设备相关数据结构1include/linux/kobject.hstruct kobject const char *name;/名称struct list_head entry;/kobject链表struct kobject *parent;/即所属kset的kobje
4、ctstruct kset *kset;/所属ksetstruct kobj_type *ktype;/属性操作接口;struct kset struct list_head list;/管理同属于kset的kobjectstruct kobject kobj;/能够成为上一级父kset的子文件夹const struct kset_uevent_ops *uevent_ops;/uevent处理接口;如果Kobject A代表一个文件夹,kset B代表几个文件夹(包含A)的共同的父文件夹。则A.kset=B; A.parent=B.kobj.2include/linux/device.hst
5、ruct class /设备类const char *name; /设备类名称struct module *owner;/创建设备类的modulestruct class_attribute *class_attrs;/设备类属性struct device_attribute *dev_attrs;/设备属性struct kobject *dev_kobj;/kobject再sysfs中代表一个文件夹.struct class_private *p;/设备类得以注冊到系统的连接件;3drivers/base/base.hstruct class_private /该设备类相同是一个kset,包
6、括以下的class_devices。同一时候在class_subsys填充父ksetstruct kset class_subsys;struct klist class_devices;/设备类包括的设备(kobject)struct class *class;/指向设备类数据结构,即要创建的本级文件夹信息;4include/linux/device.hstruct device /设备struct device *parent;/sysfs/devices/中的父设备struct device_private *p;/设备得以注冊到系统的连接件struct kobject kobj;/设备
7、文件夹const char *init_name;/设备名称struct bus_type *bus;/设备所属总线struct device_driver *driver; /设备使用的驱动struct klist_node knode_class;/连接到设备类的kliststruct class *class;/所属设备类const struct attribute_group *groups;5drivers/base/base.hstruct device_private struct klist klist_children;/连接子设备struct klist_node knod
8、e_parent;/增加到父设备链表struct klist_node knode_driver;/增加到驱动的设备链表struct klist_node knode_bus;/增加到总线的链表struct device *device;/相应设备结构;6解释class_private是class的私有结构。class通过class_private注冊到系统中。device_private是device的私有结构,device通过device_private注冊到系统中。注冊到系统中也是将对应的数据结构增加到系统已经存在的链表中,可是这些链接的细节并不希望暴露给用户,也没有必要暴露出来,所以才
9、有private的结构。而class和device则通过sysfs向用户层提供信息。四、创建设备类文件夹文件1.在驱动通过cdev_add将struct file_operaTIons接口集和设备注冊到系统后。即利用class_create接口来创建设备类文件夹文件。led_class = class_create(THIS_MODULE, led_class);_class_create(owner, name, cls-name = name;/设备类名cls-owner = owner;/所属moduleretval = _class_register(cls, key);struct
10、class_private *cp;/将类的名字led_class赋值给相应的ksetkobject_set_name(/填充class_subsys所属的父kset:ket:sysfs/class.cp-class_subsys.kobj.kset = class_kset;/填充class属性操作接口cp-class_subsys.kobj.ktype = cp-class = cls;/通过cp能够找到classcls-p = cp;/通过class能够找到cp/创建led_class设备类文件夹kset_register(/在led_class文件夹创建class属性文件add_cla
11、ss_attrs(class_get(cls)。2.继续展开kset_registerkset_register(kobject_add_internal(/ parent即class_kset.kobj,即/sysfs/class相应的文件夹parent = kobject_get(kobj-parent);create_dir(kobj);/创建一个led _class设备类文件夹sysfs_create_dir(kobj);/该接口是sysfs文件系统接口,代表创建一个文件夹,不再展开。3.上述提到的class_kset在class_init被创建class_kset = kset_cr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 设备文件的创建和mdev 设备 文件 创建 mdev
链接地址:https://www.31doc.com/p-3255220.html