Те несколько структур, которые только что были описаны, приводят к путанице не потому, что их много (только четыре) или они сложные (все они достаточно просты), а потому что они сильно друг с другом переплетаются. При использовании объектов kobject
Самым важным является объект kobject
struct kobject
. Структура kobject
используется для представления наиболее общих объектных свойств структур данных ядра, таких как счетчик ссылок, взаимоотношения родитель-порожденный и имя объекта. С помощью структуры kobject
эти свойства можно обеспечить одинаковым для всех стандартным способом. Сами по себе структуры kobject
не очень полезны, они обычно встраиваются в другие структуры данных.С каждым объектом kobject
ktype
, который представляется с помощью структуры struct kobj_type
. На экземпляр такой структуры указывает поле ktype
каждого объекта kobject
. С помощью типов ktype
определяются некоторые общие свойства объектов: поведение при удалении объекта, поведение, связанное с файловой системой sysfs, а также атрибуты объекта.Объекты kobject
kset
. Множества kset
представляются с помощью структур данных struct kset
. Эти множества предназначены для двух целей. Во-первых, они позволяют использовать встроенный в них объект kobject
в качестве базового класса для группы других объектов kobject
. Во-вторых, они позволяют объединять вместе несколько связанных между собой объектов kobject
. На файловой системе sysfs объекты kobject
представляются отдельными каталогами файловой системы. Связанные между собой каталоги, например все подкаталоги одного каталога, могут быть включены в одно множество kset
.Подсистемы соответствуют большим участкам ядра и являются набором множеств kset. Подсистемы представляются с помощью структур struct subsystem
На рис. 17.1 показаны взаимоотношения между этими структурами данных.
Рис. 17.1
. Взаимоотношения между объектамиkobject
, множествами kset
и подсистемамиУправление и манипуляции с объектами kobject
Теперь, когда у нас уже есть представление о внутреннем устройстве объектов kobject
kobject
и выполнять с ними другие манипуляции. В основном, разработчикам драйверов непосредственно не приходится иметь дело с объектами kobject
. Структуры kobject
встраиваются в некоторые специальные структуры данных (как это было в примере структуры устройства посимвольного ввода-вывода) и управляются "за кадром" с помощью соответствующей подсистемы драйверов. Тем не менее, объекты kobject
не всегда могут оставаться невидимыми, иногда с ними приходится иметь дело, как при разработке кода драйверов, так и при разработке кода управления подсистемами ядра.Первый шаг при работе с объектами kobject
kobject
с помощью функции kobject_init()
, которая определена в файле
следующим образом.void kobject_init(struct kobject *kobj);
Единственным параметром этой функции является объект kobject
kobject
. В других случаях просто необходимо вызвать функцию memset()
.memset(kobj, 0, sizeof(*kobj));
После заполнения нулями безопасным будет инициализация полей parent
kset
, как показано в следующем примере.kobj = kmalloc(sizeof(*kobj), GFP_KERNEL);
if (!kobj)
return -ENOMEM;
memset(kobj, 0, sizeof(*kobj));
kobj->kset = kset;
kobj->parent = parent_kobj;
kobject_init(kobj);
После инициализации необходимо установить имя объекта с помощью функции kobject_set_name()
int kobject_set_name(struct kobject* kobj,
const char* fmt, ...);