void kobject_del(struct kobject *kobj);
Функция kobject_unregister()
сочетает в себе выполнение функций kobject_del()
и kobject_put()
.
void kobject_unregister(struct kobject* kobj);
Все эти четыре функции определены в файле lib/kobject.c
и объявлены в файле .
Добавление файлов на файловой системе sysfs
Объекты kobject
отображаются на каталоги, и такое отображение выполняется естественным образом. А как насчет создания файлов? Файловая система sysfs — это не что иное, как дерево каталогов без файлов.
Атрибуты, используемые по умолчанию
Набор файлов, которые создаются в каталоге по умолчанию, определяется с помощью поля ktype
объектов kobject
и множеств kset
. Следовательно, все объекты kobject
одного типа имеют один и тот же набор файлов в каталогах, которые этим объектам соответствуют. Структура kobject_type
содержит поле default_attrs
, которое представляет собой массив структур attribute
. Атрибуты отображают данные ядра на файлы в файловой системе sysfs.
Структура attributes
определена в файле .
/* структура attribute - атрибуты позволяют отобразить данные ядра
на файлы файловой системы sysfs */
struct attribute {
char *name; /* имя атрибута */
struct module *owner; /* модуль, если есть, которому
принадлежат данные */
mode_t mode; /* права доступа к файлу */
};
Поле name
содержит имя атрибута. Такое же имя будет иметь и соответствующий файл на файловой системе sysfs. Поле owner
— это указатель на структуру module
, которая представляет загружаемый модуль, содержащий соответствующие данные. Если такого модуля не существует, то значение поля равно NULL
. Поле mode
имеет тип mode_t
и указывает права доступа к файлу на файловой системе sysfs. Если атрибут предназначен для чтения всеми, то флаг прав доступа должен быть установлен в значение S_IRUGO
, если атрибут имеет право на чтение только для владельца, то права доступа устанавливаются в значение S_IRUSR
. Атрибуты с правом на запись, скорее всего, будут иметь права доступа S_IRUGO | S_IWUSR
. Все файлы и каталоги на файловой системе sysfs принадлежат пользователю с идентификаторами пользователя и группы равными нулю.
Структура attribute
используется для представления атрибутов, а структура sysfs_ops
описывает, как эти атрибуты использовать. Поле sysfs_ops
— это указатель на одноименную структуру, которая определена в файле следующим образом.
struct sysfs_ops {
/* метод вызывается при чтении файла на файловой системе sysfs */
ssize_t (*show)(struct kobject *kobj,
struct attribute *attr, char *buffer);
/* метод вызывается при записи файла на файловой системе sysfs */
ssize_t (*store)(struct kobject *kobj,
struct attribute *attr, const char *buffer, size_t size);
};
Метод show()
вызывается при чтении файла. Он должен выполнить копирование значения атрибута, который передается в качестве параметра attr
, в буфер, на который указывает параметр buffer
. Размер буфера равен PAGE_SIZE
байт. Для аппаратной платформы значение PAGE_SIZE
равно 4096 байтов. Функция должна возвратить количество байтов данных, которые записаны в буфер в случае успешного завершения, и отрицательный код ошибки, если такая ошибка возникает.
Метод store()
вызывается при записи. Он должен скопировать size
байт данных из буфера buffer
в атрибут attr
. Размер буфера всегда равен PAGE_SIZE
или меньше. Функция должна возвратить количество байтов данных, которые прочитаны из буфера при успешном выполнении, и отрицательный код ошибки в случае неудачного завершения.
Так как этот набор функций должен выполнять операции ввода-вывода для всех атрибутов, то необходимо выполнить некоторые дополнительные действия, чтобы вызвать обработчик, специфичный для каждого атрибута.
Создание нового атрибута
Обычно атрибутов, которые используются по умолчанию и предоставляются типом ktype
, связанным с объектом kobject
, оказывается достаточно. Действительно, все объекты kobject
одного типа должны быть чём-то похожи друг на друга или даже быть идентичными по своей природе. Например, для всех разделов жестких дисков один и тот же набор атрибутов должен подходить для всех объектов kobject
. Это не просто упрощает жизнь, но и позволяет упорядочить код и получить одинаковый способ доступа ко всем каталогам файловой системы sysfs, связанным с родственными объектами.
Читать дальше