7.15 Linux内核的面向对象思想:封装(上)
字符设备
./fs/char_dev.c 用到了
include/linux/cdev.h
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
设备管理模型
kobject
struct kobject {
const char *name;
struct list_head entry; //链表 如将tty0 - ttyn 串起来
struct kobject *parent; //父目录
struct kset *kset; //子目录名 如tty
struct kobj_type *ktype;
struct kernfs_node *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;
};
kobj_type
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);
};
kref
struct kref {
atomic_t refcount;
};
kset
相同类型的kobject的集合
struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
struct kset_uevent_ops *uevent_ops;
};