Хотя изначально целью создания модели представления устройств было описание топологии устройств системы для управления электропитанием, файловая система sysfs стала удачным продолжением этой идеи. Для того чтобы упростить отладку, разработчик унифицированной модели устройств решил экспортировать дерево устройств в виде файловой системы. Такое решение показало свою полезность вначале в качестве замены файлов, связанных с устройствами, которые раньше экспортировались через файловую систему /proc
, а позже в качестве мощного инструмента просмотра информации о системной иерархии объектов. Вначале, до появления объектов kobject
, файловая система sysfs называлась driverfs. Позже стало ясно — новая объектная модель была бы очень кстати, и в результате этого появилась концепция объектов kobject
. Сегодня каждая система, на которой работает ядро 2.6, имеет поддержку файловой системы sysfs, и практически во всех случаях эта файловая система монтируется.
Основная идея работы файловой системы sysfs — это привязка объектов kobject
к структуре каталогов с помощью поля dentry
, которое есть в структуре kobject
. Вспомните из материала главы 12, "Виртуальная файловая система", что структура dentry
используется для представления элементов каталогов. Связывание объектов с элементами каталогов проявляется в том, что каждый объект просто видится как каталог файловой системы. Экспортирование объектов kobject
в виде файловой системы выполняется путем построения дерева элементов каталогов в оперативной памяти. Но обратите внимание, объекты kobject
уже образуют древовидную структуру — нашу модель устройств! Поэтому простое назначение каждому объекту иерархии, которые уже образуют дерево в памяти, соответствующего элемента каталога позволяет легко построить файловую систему sysfs.
На рис. 17.2 показан частичный вид файловой системы sysfs, которая смонтирована на каталог /sys
.
Рис. 17.2. Содержимое части каталога /sys
Корневой каталог файловой системы sysfs содержит семь подкаталогов: block
, bus
, class
, devices
, firmware
, module
и power
. В каталоге block
содержатся каталоги для каждого зарегистрированного в системе устройства блочного ввода-вывода.
Каждый из каталогов в свою очередь содержит подкаталоги, соответствующие разделам блочного устройства. Каталог bus
позволяет просматривать информацию о системных шинах. В каталоге class
представлена информация о системных устройствах, которая организована в соответствии с высокоуровневыми функциями этих устройств. Каталог devices содержит информацию о топологии устройств в системе. Она отображается непосредственно на иерархию структур устройств ядра. Каталог firmware
содержит специфичное для данной системы дерево низкоуровневых подсистем, таких как ACPI, EDD, EFT и т.д. В каталоге power
содержатся данные по управлению электропитанием всех устройств системы.
Наиболее важным является каталог devices
, который экспортирует модель устройств ядра во внешний мир. Структура каталога соответствует топологии устройств в системе. Большинство информации, которая содержится в других каталогах, — это просто другое представление данных каталога devices. Например, в каталоге /sys/class/net/
информация представлена в соответствии с высокоуровневым представлением зарегистрированных сетевых устройств. В этом каталоге может содержаться подкаталог eth0
, который содержит символьную ссылку device на соответствующее устройство каталога devices
.
Посмотрите на содержимое каталога /sys
той системы Linux, к которой вы имеете доступ. Такое представление системных устройств является очень четким и ясным. Оно показывает взаимосвязь между высокоуровневым представлением информации в каталоге class
, низкоуровневым представлением в каталоге devices и драйверами устройств — в каталоге bus
. Такое представление взаимосвязи между устройствами очень информативно. Оно становится еще более ценным, если осознать, что все эти данные свободно доступны и описывают все то, что происходит внутри ядра[89].
Добавление и удаление объектов на файловой системе sysfs
Инициализированные объекты kobject
автоматически не экспортируются через файловую систему sysfs. Для того чтобы сделать объект видимым через sysfs, необходимо использовать функцию kobject_add()
.
int kobject_add(struct kobject *kobj);
Положение объекта на файловой системе sysfs зависит от его положения в объектной иерархии. Если установлен указатель parent
объекта, то объект будет отображен внутри каталога, соответствующего объекту, на который указывает указатель parent. Если указатель parent
не установлен, то объект будет отображен в каталоге, соответствующем значению переменной kset->kobj
. Если для некоторого объекта не установлены ни значение поля parent, ни значение поля kset
, то считается, что данный объект не имеет родительского и будет отображаться в корневом каталоге файловой системы sysfs
. Такое поведение практически всегда соответствует тому, что нужно. Поэтому одно из полей parent или kset
(или оба) должно быть установлено правильным образом перед вызовом функции kobject_add()
. Имя каталога, который представляет объект kobject
в файловой системе sysfs, будет определяться значением поля kobj->name
.
Вместо того чтобы последовательно вызывать функции kobject_init()
и kobject_add()
, можно вызвать функцию kobject_register()
.
int kobject_register(struct kobject *kobj);
Удаление объекта из файловой системы sysfs выполняется с помощью функции kobject_del()
.
void kobject_del(struct kobject *kobj);
Функция kobject_unregister()
сочетает в себе выполнение функций kobject_del()
и kobject_put()
.
void kobject_unregister(struct kobject* kobj);
Все эти четыре функции определены в файле lib/kobject.c
и объявлены в файле <linux/kobject.h>
.
Добавление файлов на файловой системе sysfs
Объекты kobject
отображаются на каталоги, и такое отображение выполняется естественным образом. А как насчет создания файлов? Файловая система sysfs — это не что иное, как дерево каталогов без файлов.
Набор файлов, которые создаются в каталоге по умолчанию, определяется с помощью поля ktype
объектов kobject
и множеств kset
. Следовательно, все объекты kobject
одного типа имеют один и тот же набор файлов в каталогах, которые этим объектам соответствуют. Структура kobject_type
содержит поле default_attrs
, которое представляет собой массив структур attribute
. Атрибуты отображают данные ядра на файлы в файловой системе sysfs.
Структура attributes
определена в файле <linux/sysfs.h>
.
/* структура attribute - атрибуты позволяют отобразить данные ядра
на файлы файловой системы sysfs */
struct attribute {
char *name; /* имя атрибута */
struct module *owner; /* модуль, если есть, которому
принадлежат данные */
mode_t mode; /* права доступа к файлу */
89
Если вас заинтересовала информация о файловой системе sysfs, то, вероятно, вам будет интересно также ознакомиться с HAL, hardware abstraction layer (уровень абстракции аппаратного обеспечения), информация о котором доступна по адресу http://hal.freedesktop.org/
. Подсистема HAL позволяет создать в оперативной памяти базу данных на основании информации файловой системы sysfs, объединяя вместе понятия классов, устройств и драйверов. На основании этих данных уровень HAL предоставляет API, которое позволяет разрабатывать более интеллектуальные программы.