一.devfs 设备文件系统(过时的系统).主要特点如下:
1.可以通过程序在设备初始化时在/dev目录下创建设备文件,卸载设备时将它删除。
2. 设备驱动程序可以指定设备名、所有者和权限位,用户空间程序仍可以修改所有者和权限位。
3. 不再需要为设备驱动程序分配主设备号以及处理次设备号,在程序中可以直接给register_chrdev()传递0 主设备号以动态获得可用的主设备号,并在
devfs_register()中指定次设备号。
驱动程序应调用下面这些函数来进行设备文件的创建和删除工作。
/*创建设备目录*/
devfs_handle_t devfs_mk_dir(devfs_handle_t dir, const char *name, void*info);
/*创建设备文件*/
devfs_handle_t devfs_register(devfs_handle_t dir, const char *name,unsigned int flags, unsigned int major, unsigned int minor, umode_t mode, void*ops,void *info);
/*撤销设备文件*/
void devfs_unregister(devfs_handle_t de);
二. udev 设备文件系统
udev 完全在用户态工作,利用设备加入或移除时内核所发送的热插拔事件(hotplugevent)来工作。在热插拔时,设备的详细信息会由内核输出到位于/sys的sysfs文件系统。
udev的设备命名策略、权限控制和事件处理都是在用户态下完成的,它利用sysfs中的信息来进行创建设备文件节点等工作.由于 udev根据系统中硬件设备的状态动态更新设备文件,进行设备文件的创建和删除等,因此,在使用udev后,/dev目录下就会只包含系统中真正存在的设备了。
devfs 与udev的另一个显著区别在于:采用devfs,当一个并不存在的/dev节点被打开的时候,devfs能自动加载对应的驱动,而udev则不能。这是因为udev的设计者
认为Linux 应该在设备被发现的时候加载驱动模块,而不是当它被访问的时候。udev的设计者认为devfs 所提供的打开/dev 节点时自动加载驱动的功能对于一个配置正确
的计算机是多余的。系统中所有的设备都应该产生热插拔事件并加载恰当的驱动,而udev能注意到这点并且为它创建对应的设备节点。
sysfs文件系统
sysfs 被看成是与proc、devfs 和devpty 同类别的文件系统,该文件系统是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似
sysfs 把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性。sysfs的一个目的就是展示设
备驱动模型中各组件的层次关系,其顶级目录包括block、device、bus、drivers、class、power 和firmware。
1.block 目录包含所有的块设备
2.devices 目录包含系统所有的设备并根据设备挂接的总线类型组织成层次结构
3.bus 目录包含系统中所有的总线类型
4.drivers 目录包括内核中所有已注册的设备驱动程序.
5.class 目录包含系统中的设备类型(如网卡设备、声卡设备、输入设备等)
设备-总线-类-驱动 从不同分类方式来描述设备
kobject内核对象
kobject是Linux 2.6 引入的设备管理机制,在内核中由kobject结构体表示,这个数据结构使所有设备在底层都具有统一的接口。kobject提供了基本的对象管理能力,
是构成Linux 2.6 设备模型的核心结构,每个在内核中注册的kobject 对象都对应于sysfs文件系统中的一个目录。
kobject 结构体
1 struct kobject
2 {
3 char *k_name;
4 char name[KOBJ_NAME_LEN]; //对象名称
5 struct kref kref; //对象引用计数
6 struct list_head entry; //用于挂接该kobject对象到kset链表
7 struct kobject *parent; //指向父对象的指针
8 struct kset *kset; //所属kset的指针
9 struct kobj_type *ktype; //指向对象类型描述符的指针
10 struct dentry *dentry; //sysfs文件系统中与该对象对应的文件节点入口
11 };
内核通过kobject 的kref 成员实现对象引用计数管理,且提供两个函数kobject_get()、kobject_put()分别用于增加和减少引用计数,当引用计数为0 时,所有该对象使用的资源将被释放.
kobject的ktype成员是一个指向kobj_type结构的指针,表示该对象的类型。
码清单5.7 所示,kobj_type 数据结构包含3 个成员:用于释放kobject 占用的资源的
1 struct kobj_type
2 {
3 void (*release)(struct kobject *);//release函数
4 struct sysfs_ops * sysfs_ops;//属性操作
5 struct attribute ** default_attrs;//默认属性
6 };
release()函数、指向sysfs操作的sysfs_ops 指针和sysfs文件系统默认属性列表
kobj_type 结构体种的sysfs_ops 包括store()和show()两个成员函数,用于实现属性的读写,代码清单5.8 给出了sysfs_ops结构体的定义。当从用户空间读取属性时,
show()函数将被调用,该函数将指定属性值存入buffer 中返回给用户,而store()函数用于存储用户通过buffer 传入的属性值。和kobject不同的是,属性在sysfs 中呈现为
一个文件,而kobject则呈现为sysfs中的目录
.kset内核对象集合
kobject 通常通过kset 组织成层次化的结构,kset 是具有相同类型的kobject 的集合,在内核中用kset数据结构表示