Linux Kernel (Ядро линукса) (часть 2)


Объекты kobject

Основной структурой данных в модели драйвера устройства является общая структура, называемая kobject и неразрывно связанная с файловой системой sysfs: каждый объект kobject соответствует каталогу в этой файловой системе. Объекты kobject вложены в более крупные объекты — так называемые контейнеры, которые описывают компоненты модели драйвера устройства. Дескрипторы шин, устройств и драйверов являются типичными контейнерами. Например, дескриптор первого раздела на первом IDE-диске соответствует каталогу /sys/block/hda/hdal.

Встраивание объекта kobject в контейнер позволяет ядру:

- поддерживать счетчик ссылок на контейнер;
- поддерживать иерархические списки или наборы контейнеров (например, каталог системы sysfs, ассоциированный с блочным устройством, включает в себя различные подкаталоги для каждого раздела на диске);
- обеспечивать пользовательское представление для атрибутов контейнера. Объекты kobject, наборы kset и подсистемы
Объект kobject представлен структурой kobject,
Поле ktype указывает на объект kobj type, представляющий тип” объекта kobject, точнее, тип контейнера, содержащего kobject. Структура kobj type состоит из трех полей: метода release (выполняемого, когда kobject освобождается), указателя sysfs ops на таблицу операций файловой системы sysfs и списка атрибутов по умолчанию этой файловой системы.

Поле kref является структурой типа k ref, состоящей из единственного поля ref count. Как можно догадаться по его имени, это счетчик ссылок на объект kobject, но оно может быть также использовано как счетчик ссылок на контейнер объекта. Функции kobject get о и kobj ect put , соответственно, увеличивают и уменьшают счетчик ссылок. Когда значение счетчика достигает нуля, ресурсы, используемые объектом kobject, освобождаются, и выполняется метод release объекта kobj type данного объекта kobject. Этот метод, обычно определяемый только, когда контейнер kobject выделяется динамически, освобождает сам контейнер.

Объекты kobject могут быть организованы в дерево с помощью наборов kset. kset — это собрание объектов kobject одного типа, т. е. входящих в контейнер этого типа.

Поле list является головой двунаправленного циклического списка объектов kobject, входящих в kset. Поле ktype указывает на дескриптор kobj type, используемый совместно всеми объектами kobject в kset.

Поле kobj является объектом kobject, встроенным в структуру kset. Поля parent объектов kobject, входящих в kset, указывают на этот встроенный kobject. Таким образом, kset является собранием объектов kobject, но он использует объект kobject более высокого уровня для подсчета ссылок и установления связей в дереве. Такой подход позволяет создавать высокоэффективный код и обеспечивает значительную гибкость. Например, функции kset get и kset put , которые, соответственно, увеличивают и уменьшают счетчик ссылок набора kset, просто вызывают функции kobject get о и kobject put о встроенного объекта kobject, поскольку счетчик ссылок kset является не более чем счетчиком ссылок объекта kobj, встроенного в этот kset. Более того, благодаря встроенному объекту, структура kset может быть встроена в объект-контейнер точно так же, как это делается для структуры kobject. Наконец, kset можно сделать элементом другого набора kset: достаточно вставить встроенный объект kobject в набор kset более высокого уровня.

Существуют также и собрания наборов kset, называемые подсистемами. Подсистема может включать в себя наборы kset разных типов, и она представлена структурой subsystem, состоящей всего из двух полей:
- kset — встроенный kset, содержащий наборы kset, входящие в подсистему;
- rwsem — семафор чтения/записи, защищающий все наборы и объекты, рекурсивно включенные в подсистему.
Даже структура subsystem может быть встроена в более крупный объект- контейнер. Счетчик ссылок такого контейнера является счетчиком ссылок встроенной подсистемы, т. е. счетчиком ссылок объекта kobject, встроенного в набор kset, встроенный в подсистему. Функции subsys get и subsys put , соответственно, увеличивают и уменьшают этот счетчик ссылок.

Подсистема bus включает в себя подсистему pci, которая, в свою очередь, содержит набор drivers. Этот набор содержит объект serial (соответствующий драйверу последовательного порта), у которого имеется ОДИН атрибут new id.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...