Главная » Ядро Linux » Объекты kobjec t

0

Сердцем модели представления устройств являются объекты kobject, которые представляются  с  помощью  структуры struc t   kobject , определенной в  файле

<linux/kobject.h> . Тип  kobjec t  аналогичен классу Objec t таких объектно-ориентированных языков программирования, как С# и Java. Этот тип определяет общую функциональность, такую как счетчик ссылок, имя, указатель на родительский объект, что позволяет создавать объектную иерархию.

Структура, с  помощью которой реализованы объекты 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 ноле knam e указывает на первый элемент этого массива. Если длина имени больше KOBJ_NAME_LEN  байт, то динамически выделяется буфер, размер которого достаточен для хранения строки символов имени, имя записывается в  этот буфер, а  поле k_name указывает на него.

Указатель paren t указывает на родительский объект данного объекта kobject . Таким образом, с  помощью структур kobjec t  может быть создана иерархия объектов в  ядре,  которая позволяет устанавливать соотношения  родства между различными объектами. Как будет видно дальше, с  помощью файловой системы sysfs осуществляется представление в  пространстве пользователя той иерархии объектов kobject , которая существует в  ядре.

Указатель dentr y  содержит  адрес  структуры  struc t   dentry , которая представляет этот объект в  файловой системе sysfs.

Поля  kref, ktype и kse t указывают на экземпляры структур, которые используются для поддержки объектов kobject . Поле entr y используется совместно с  полем kset . Сами эти структуры и их использование будут обсуждаться ниже.

Обычно структуры kobjec t встраиваются в  другие структуры данных и сами по себе не используются. Например, такая важная структура, как struc t   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.

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

По теме:

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