- 概述
设备驱动模型最初是为了解决设备的电源管理而产生的,但是最后发展 起来之后,作用就越来越大了,特别适合设备管理。对于linux设备驱动工程师来说,掌握设备驱动模型非常重要。
linux的设备驱动模型的底层机制主要包括:kobject,kset等几个结构。这几个结构定义在include/linux/kobject.h中 - sysfs文件系统
sysfs文件系统是基于ramfs的一种文件系统,它作为内核空间与用户空间的桥梁为用户空间提供了内核驱动模块的各种信息及它们之间的相互关系,是与proc文件系统同级的文件系统,而掌握kobject,kset这些结构及操作函数即会在/sys/目录下形成对应的目录及属性文件,便于用户实时掌握内核设备驱动的状态的变化; - kobject
kobject的结合体定义如下
struct kobject {
const char *name;
struct list_head entry;
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct sysfs_dirent *sd;
struct kref kref;
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};
- kobject支持的主要的操作
extern void kobject_init(struct kobject *kobj);
初始化一个kobject目录
extern void kobject_add(struct kobject *kobj,struct kobject *parent,const char *fmt,…);
将kobject注册进linux系统;
上面的步骤也可以用下面一个函数来完成
kobject_init_and_add(struct kobject *kobj,struct kobj_ktype *type,struct kobject *parent,const char *fmt,…)
extern void kobject_del(struct kobject);删除一个kobject函数
- 主要成员变量介绍
ktype的定义如下
struct kobj_type {
void (*release)(struct kobject *kobj);
const struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void *(*namespace)(struct kobject *kobj);
};
该成员变量定义了kobject目录的属性,在初始化函数及添加函数调用之前,必须初始化该成员变量,以便按此属性在/sys/目录下面新建一个kobject目录
release 函数: 为释放kobject占用的资源,当调用kobject_put时kobject的成员kref变0,release被调用,当调用kobject_get时,kref加1;
sysfs_ops指针: 为kobject对象操作函数成员有
ssize_t (*show)(struct kobject , struct attribute ,char );*
读取attribute属性时调用,类似于字符驱动设备中的read
ssize_t (*store)(struct kobject ,struct attribute ,const char , size_t);*
当写attribute属性文件时调用,类似于字符设备中的write
- struct attribute
struct attribute {
const char *name;
struct module *owner;
mode_t mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lock_class_key *key;
struct lock_class_key skey;
#endif
};
- bus总线文件注册步骤
1、实现struct kobj_type这个结构体
2、调用kobject_init_and_add初始化及注册一个kobject
3、实现default_attribute数组
4、实现sysfs_ops结构体
完成以上步骤后则bus总线下的一个目录会被创建并且该目录下面的文件也随之创建