Чтение онлайн

на главную

Жанры

Разработка ядра Linux
Шрифт:

Несмотря на их важную роль, подсистемы представляются с помощью очень простой структуры данных —

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

С каждым объектом

kobject
связан один определенный тип данных —
ktype
, который представляется с помощью структуры
struct kobj_type
. На экземпляр такой структуры указывает поле
ktype
каждого объекта
kobject
. С помощью типов
ktype
определяются некоторые общие свойства объектов: поведение при удалении объекта, поведение, связанное с файловой системой sysfs, а также атрибуты объекта.

Объекты

kobject
группируются в множества, которые называются
kset
. Множества
kset
представляются с помощью структур данных
struct kset
. Эти множества предназначены для двух целей. Во-первых, они позволяют использовать встроенный в них объект
kobject
в качестве базового класса для группы других объектов
kobject
. Во-вторых, они позволяют объединять вместе несколько связанных между собой объектов
kobject
. На файловой системе sysfs объекты
kobject
представляются отдельными каталогами файловой системы. Связанные между собой каталоги, например все подкаталоги одного каталога, могут быть включены в одно множество
kset
.

Подсистемы соответствуют большим участкам ядра и являются набором множеств kset. Подсистемы представляются

с помощью структур
struct subsystem
. Все каталоги, которые находятся в корне файловой системы sysfs, соответствуют подсистемам ядра.

На рис. 17.1 показаны взаимоотношения между этими структурами данных.

Рис. 17.1. Взаимоотношения между объектами

kobject
, множествами
kset
и подсистемами

Управление и манипуляции с объектами

kobject

Теперь, когда у нас уже есть представление о внутреннем устройстве объектов

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

Первый шаг при работе с объектами

kobject
— это их декларация и инициализация. Инициализируются объекты
kobject
с помощью функции
kobject_init
, которая определена в файле
<linux/kobject.h>
следующим образом.

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, ...);

Эта функция принимает переменное количество параметров, по аналогии с функциями

printf
и
printk
. Как уже было сказано, на имя объекта указывает поле
k_name
структуры
kobject
. Если это имя достаточно короткое, то оно хранится в статически выделенном массиве
name
, поэтому есть смысл без необходимости не указывать длинные имена.

Поделиться:
Популярные книги

Возвращение Безумного Бога 5

Тесленок Кирилл Геннадьевич
5. Возвращение Безумного Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвращение Безумного Бога 5

Холодный ветер перемен

Иванов Дмитрий
7. Девяностые
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Холодный ветер перемен

Кровь, золото и помидоры

Распопов Дмитрий Викторович
4. Венецианский купец
Фантастика:
альтернативная история
5.40
рейтинг книги
Кровь, золото и помидоры

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Книга 5. Империя на марше

Тамбовский Сергей
5. Империя у края
Фантастика:
альтернативная история
5.00
рейтинг книги
Книга 5. Империя на марше

Генерал Скала и сиротка

Суббота Светлана
1. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Генерал Скала и сиротка

Мимик нового Мира 14

Северный Лис
13. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 14

Стрелок

Астахов Евгений Евгеньевич
5. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Стрелок

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Сержант. Назад в СССР. Книга 4

Гаусс Максим
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Боксер 2: назад в СССР

Гуров Валерий Александрович
2. Боксер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боксер 2: назад в СССР

Вопреки судьбе, или В другой мир за счастьем

Цвик Катерина Александровна
Любовные романы:
любовно-фантастические романы
6.46
рейтинг книги
Вопреки судьбе, или В другой мир за счастьем

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кротовский, сколько можно?