Разработка ядра Linux
Шрифт:
Типы
ktype
Объекты
kobject
могут быть связаны с определенным типом, который называется ktype
. Типы ktype
представляются с помощью структуры struct kobj_type
, определенной в файле <linux/kobject.h>
следующим образом. 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
Множества
kset
представляют собой коллекции объектов kobject
. Множество kset
работает как базовый контейнерный класс для объектов, например, "все блочные устройства". Множества kset
очень похожи на типы ktype
, и возникает вопрос: "Для чего нужны два разных обобщения?" Множество kset
объединяет несколько объектов kobject
, а типы ktype
определяют общие свойства, которые связаны с объектами kobject
одного типа. Существует возможность объединить объекты одного типа ktype
в различные множества kset
. Поле
kset
объекта kobject
указывает на связанное с данным объектом множество kset
. Множество объектов kset
представляется с помощью структуры kset
, которая определена в файле <linux/kobject.h>
следующим образом. struct kset {
struct subsystem *subsys;
struct kobj_type *ktype;
struct list_head list;
struct kobject kobj;
struct kset_hotplug_ops *hotplug_ops;
};
Указатель
ktype
указывает на структуру ktype
, которая определяет тип всех объектов данного множества, поле list
— список всех объектов kobject
данного множества, поле kobj
—
объект kobject
, который представляет базовый класс для всех объектов данного множества, а поле hotplug_ops
указывает на структуру, которая определяет поведение объектов kobject
при горячем подключении устройств, связанных с данным множеством. Наконец, поле
subsys
указывает на структуру struct subsystem
, которая связана с данным множеством kset
. Подсистемы
Подсистемы используются для представления высокоуровневых концепций ядра и являются коллекцией одного или нескольких множеств
kset
. Множества kset
содержат объекты kobject
, подсистемы — множества kset
, но связь между множествами в подсистеме значительно более слабая, чем связь между объектами kobject
в множестве. Множества kset
одной подсистемы могут иметь только наиболее общие объединяющие факторы. Несмотря на их важную роль, подсистемы представляются с помощью очень простой структуры данных —
struct subsystem
. struct subsystem {
struct kset kset;
struct rw_semaphore rwsem;
};
Структура
subsystem
содержит только одно множество kset
, тем не менее несколько множеств kset
могут указывать на общую структуру subsystem
с помощью поля subsys
. Такие однонаправленные взаимоотношения означают, что нет возможности определить все множества подсистемы, только имея ее структуру subsystem
. Поле
kset
, которое содержится в структуре subsystem
, — это множество kset
подсистемы, которое используется по умолчанию, чтобы зафиксировать положение этой подсистемы в иерархии объектов. Поле
rwsem
структуры subsystem
— это семафор чтения-записи (см. главу 9, "Средства синхронизации в ядре"), который используется для защиты подсистемы и ее множеств kset
от конкурентного доступа. Все множества kset
должны принадлежать какой-нибудь подсистеме, поскольку они используют семафор подсистемы для защиты своих данных от конкурентного доступа. Путаница со структурами
Те несколько структур, которые только что были описаны, приводят к путанице не потому, что их много (только четыре) или они сложные (все они достаточно просты), а потому что они сильно друг с другом переплетаются. При использовании объектов
kobject
достаточно сложно рассказать об одной структуре, не упоминая другие. Тем не менее, на основании рассмотренных особенностей этих структур можно построить прочное понимание их взаимоотношений. Самым важным является объект
kobject
, который представляется с помощью структуры struct kobject
. Структура kobject
используется для представления наиболее общих объектных свойств структур данных ядра, таких как счетчик ссылок, взаимоотношения родитель-порожденный и имя объекта. С помощью структуры kobject
эти свойства можно обеспечить одинаковым для всех стандартным способом. Сами по себе структуры kobject
не очень полезны, они обычно встраиваются в другие структуры данных.
Поделиться с друзьями: