Структура, с помощью которой реализованы объекты kobject, имеет следующий вид.
struct kobject {
char *k_name;
char name[KOBJ_NAME_LEN];
struct kref kref;
struct list_head entry;
struct kobject *parent;
struct kset *kset
struct kobj_type *ktype;
struct dentry *dentry;
};
Поле k_nameсодержит указатель на имя объекта. Если длина имени меньше KOBJ_NAME_LEN, что сейчас составляет 20 байт, то имя хранится в массиве name, a поле knameуказывает на первый элемент этого массива. Если длина имени больше KOBJ_NAME_LENбайт, то динамически выделяется буфер, размер которого достаточен для хранения строки символов имени, имя записывается в этот буфер, а поле k_nameуказывает на него.
Указатель parentуказывает на родительский объект данного объекта kobject. Таким образом, с помощью структур kobjectможет быть создана иерархия объектов в ядре, которая позволяет устанавливать соотношения родства между различными объектами. Как будет видно дальше, с помощью файловой системы sysfs осуществляется представление в пространстве пользователя той иерархии объектов kobject, которая существует в ядре.
Указатель dentryсодержит адрес структуры struct dentry, которая представляет этот объект в файловой системе sysfs.
Поля kref, ktypeи ksetуказывают на экземпляры структур, которые используются для поддержки объектов kobject. Поле entryиспользуется совместно с полем kset. Сами эти структуры и их использование будут обсуждаться ниже.
Обычно структуры kobjectвстраиваются в другие структуры данных и сами по себе не используются. Например, такая важная структура, как struct cdev, имеет поле kobj.
/* структура cdev - объект для представления символьных устройств */
struct cdev {
struct kobject kobj;
struct module *owner;
struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
Когда структуры kobjectвстраиваются в другие структуры данных, то последние получают те стандартизированные возможности, которые обеспечиваются структурами kobject. Еще более важно, что структуры, которые содержат в себе объекты kobject, становятся частью объектной иерархии. Например, структура cdevпредставляется в объектной иерархии с помощью указателя на родительский объект cdev->kobj->parentи списка cdev->kobj->entry.
Объекты kobjectмогут быть связаны с определенным типом, который называется ktype. Типы ktypeпредставляются с помощью структуры s truct kobj_type, определенной в файле следующим образом.
struct kobj_type {
void (*release)(struct kobject*);
struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
};
Тип ktypeимеет простое назначение — представлять общее поведение для некоторого семейства объектов kobject. Вместо того чтобы для каждого отдельного объекта задавать особенности поведения, эти особенности связываются с их полем ktype, и объекты одного "типа" характеризуются одинаковым поведением.
Поле releaseсодержит указатель на деструктор, который вызывается, когда количество ссылок на объект становится равным нулю. Эта функция отвечает за освобождение памяти, связанной с объектом, и за другие операции очистки.
Поле sysfs_opsуказывает на структуру sysfs_ops. Эта структура определяет поведение файлов на файловой системе sysfsпри выполнении операций записи и чтения. Более детально она рассматривается в разделе "Добавление файлов на файловой системе sysfs".
Наконец, поле default_attrsуказывает на массив структур attribute. Эти структуры определяют атрибуты , которые связаны с объектом kobjectи используются но умолчанию. Атрибуты соответствуют свойствам данного объекта. Если некоторый объект kobjectэкспортируется через файловую систему sysfs, то атрибуты экспортируются как отдельные файлы. Последний элемент этого массива должен содержать значению NULL.
Множества ksetпредставляют собой коллекции объектов kobject. Множество ksetработает как базовый контейнерный класс для объектов, например, "все блочные устройства". Множества ksetочень похожи на типы ktype, и возникает вопрос: "Для чего нужны два разных обобщения?" Множество ksetобъединяет несколько объектов kobject, а типы ktypeопределяют общие свойства, которые связаны с объектами kobjectодного типа. Существует возможность объединить объекты одного типа ktypeв различные множества kset.
Читать дальше