Главная » Ядро Linux » Управление и манипуляции с объектами kobjec t

0

Теперь, когда у нас уже есть представление о внутреннем устройстве объектов kobjec t и связанных с ними структурах данных, самое время рассмотреть экспортируемые интерфейсы,  которые дают возможность управлять объектами kobjec t и выполнять с ними другие манипуляции. В основном, разработчикам драйверов непосредственно не приходится иметь дело с объектами kobject . Структуры kobjec t встраиваются в  некоторые специальные структуры данных (как это было в  примере структуры устройства посимвольного ввода-вывода)  и управляются "за  кадром" с помощью соответствующей подсистемы драйверов. Тем не менее, объекты kobjec t не всегда могут оставаться невидимыми, иногда с ними приходится иметь дело, как при разработке кода драйверов, так и при разработке кода управления подсистемами ядра.

Первый шаг при работе с объектами kobjec t это их декларация и инициализация. Инициализируются объекты kobjec t с помощью функции kobject_ini t () , которая определена в  файле <linux/kobject.h > следующим образом.

void kobject_init(struct kobject *kobj);

Единственным параметром этой функции является объект kobject , который необходимо проинициализировать. Перед вызовом этой функции область памяти, в которой хранится объект, должна быть заполнена нулевыми значениями.  Обычно это делается при инициализации  большой структуры данных, в  которую встраивается объект kobject . В  других случаях просто необходимо вызвать функцию memset ().

memset(kobj, 0, sizeof (*kobj));

После заполнения нулями безопасным будет инициализация  полей paren t и kset , как показано в следующем примере.

kobj = kmalloc(sizeof (*kobj), GFP_KERNEL);

if (!kobj)

return -ENOMEM; memset(kobj, 0, sizeof (*kobj)); kobj->ksct kset;

kobj->parent = parent_kobj;

kobject_init (kobj);

После  инициализации  необходимо установить имя  объекта  с  помощью функции kobject_set_name() , которая имеет  следующий  прототип.

intkobject_set_name(structkobject*kobj,constchar*fmt,,…) ;

Эта функция принимает переменное количество параметров, по аналогии с функциями print f ()   и print k () .  Как  уже  было  сказано, на имя  объекта  указывает поле k_name  структуры kobject .  Если  это  имя  достаточно короткое,  то  оно  хранится  в статически выделенном массиве name,  поэтому есть  смысл   без  необходимости  не указывать длинные  имена.

После   того  как  для  объекта   выделена память и  объекту  присвоено имя,  нужно установить значение  его  поля   kset , а также  опционально поле   ktype .  Последнее необходимо  делать  только   в  том  случае,  если  множество  kse t  не  предоставляет типа  ktyp e для  данного объекта,  в  противном случае  значение поля   ktype , которое указано  в  структуре  kset , имеет  преимущество.  Если  интересно,  почему   объекты kobjec t  имеют  свое  поле  ktype , то  добро  пожаловать в  клуб!

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии