Вход/Регистрация
Разработка ядра Linux
вернуться

Лав Роберт

Шрифт:

Структура

attribute
используется для представления атрибутов, а структура
sysfs_ops
описывает, как эти атрибуты использовать. Поле
sysfs_ops
— это указатель на одноименную структуру, которая определена в файле
<linux/sysfs.h>
следующим образом.

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, связанным с родственными объектами.

Тем не менее иногда требуется, чтобы определенный экземпляр объекта

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

int sysfs_create_file(struct kobject *kobj, const struct attribute *attr);

Эта функция позволяет привязать структуру attribute, на которую указывает параметр

attr
, к объекту
kobject
, на который указывает параметр
kobj
. Перед тем как вызвать эту функцию, необходимо установить значение атрибута (заполнить поля структуры). Эта функция возвращает значение нуль в случае успеха и отрицательное значение в случае ошибки.

Обратите внимание, что для обработки указанного атрибута используется структура

sysfs_ops
, соответствующая типу
ktype
объекта. Иными словами, существующие функции
show
и
store
, которые используются для объекта по умолчанию, должны иметь возможность обработать вновь созданный атрибут.

Кроме того, существует возможность создавать символьные ссылки. Создать символьную ссылку на файловой системе sysfs можно с помощью вызова следующей функции.

int sysfs_create_link(struct kobject *kobj,

 struct kobject *target, char *name);

Эта функция создает символьную ссылку с именем

name
в каталоге объекта, соответствующего параметру
kobj
, на каталог, соответствующий параметру
target
. Эта функция возвращает нулевое значение в случае успеха и отрицательный код ошибки в противном случае.

Удаление созданного атрибута

Удаляется атрибут с помощью вызова функции

sysfs_remove_file
.

void sysfs_remove_file(struct kobject *kobj,

 const struct attribute *attr);

После возврата из этой функции указанный атрибут больше не отображается в каталоге объекта.

Символьная ссылка, созданная с помощью функции

sysfs_create_link
, может быть удалена с помощью функции
sysfs_remove_link
.

void sysfs_remove_link(struct kobject *kobj, char *name);

После возврата из функции символьная ссылка с именем name удаляется из каталога, на который отображается объект

kobj
.

  • Читать дальше
  • 1
  • ...
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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