Структура, с помощью которой реализованы объекты 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
.
Читать дальше