Книга: Разработка ядра Linux
Управление и манипуляции с объектами kobject
Управление и манипуляции с объектами 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
, поэтому есть смысл без необходимости не указывать длинные имена.
После того как для объекта выделена память и объекту присвоено имя, нужно установить значение его поля kset
, а также опционально поле ktype
. Последнее необходимо делать только в том случае, если множество kset
не предоставляет типа ktype
для данного объекта, в противном случае значение поля ktype
, которое указано в структуре kset
, имеет преимущество. Если интересно, почему объекты kobject
имеют свое поле ktype
, то добро пожаловать в клуб!
- Глава 17 Объекты kobject и файловая система sysfs
- Операторы, применяемые с объектами
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- УПРАВЛЕНИЕ РЕПУТАЦИЕЙ В ИНТЕРНЕТЕ
- Глава 7 Управление хранилищем данных
- Глава 11 Корпоративное управление и стратегия
- 5.7 Устройства NAS под управлением Windows и моментальные снимки
- 7.8 Управление иерархическим хранилищем
- Управление файлами занятий
- Управление пользователями и разрешениями узла
- Управление функциями узла
- Управление объединением содержимого узлов