Start of topic | Skip to actions
Linux kernel 2.6: первые шаги к sysfsАктивные разработки в направлении совершенствования ядра Linux привели к появлению большого количества нововведений, полезных и удобных не только пользователю, но и многочисленной армии программистов. Одним из таких нововведений является Unified Device Model Of Kernel (далее UDM). Речь идет о некоей обобщенной модели взаимодействия устройств и драйверов в ядре линукс, абстрактном механизме взаимодействия между ядром, устройствами, драйверами и пользовательским уровнем. Использование этой модели тесно связано с новой файловой системой - sysfs, которая также появилась в новом ядре с целью частично вытеснить файловую систему /proc. В этой статье я хотел рассказать о своих первых впечатлениях от работы с UDM & Sysfs. Суть UDM состоит в том, что в ядре объявляется несколько объектов (device, device_driver, bus_type, etc..) и набор функций для работы с ними. С их помощью разработчик модулей ядра (драйверов устройств) может построить взаимосвязанную, масштабируемую систему. Среди преимуществ UDM можно выделить следующие:
Каждый объект в UDM представляет собой структуру (struct). Взаимосвязь объектов происходит через связные списки. Но от программиста это тщательно скрывается (до разумных пределов, ведь все ядро есть в исходном коде), то есть напрямую работать с объектами UDM как с элементами связного списка не приходится. Каждый объект UDM, попадающий в список, отображается в виртуальной файловой системе sysfs. И это - как оказалось - действительно удобно. Поскольку алгоритмы создания файлов и директорий в sysfs неразрывно следуют за созданием древовидной структуры и также хорошо скрыты от программиста. Я хорошо это ощутил, так как раньше разрабатывал модули под linux 2.4 и использовал procfs для взаимодействия пользователького уровня с уровнем ядра. Так вот в linux 2.4 все приходилось делать самому - создание файлов и директорий было специальной задачей. Основные объекты UDM:
/sys/bus/my_bus
device_driver. Некая абстракция драйвера устройства. Драйвер
регистрируется в шине. Освновная задача - выполнить необходимые действия при подключении устройства (probe) и его отключении (remove). После подключения к шине создаются директории /sys/bus/drivers/my_driver, /sys/drivers/my_driver.
device. Структура, характеризующая подключаемое устройство.
После подключения создаются директории /sys/bus/devices/my_device, /sys/devices/my_device
device_attribute, driver_attribute, bus_attribute. Это структуры, содержащие callback'и read & write. Каждый атрибут представляет собой файл в sysfs. В зависимости от типа атрибута (bus_, device_, driver_), файл будет находиться либо в каталоге для устройства, либо в каталоге для драйвера, либо - для шины. Основное назначение атрибутов - обеспечение взаимодействия ядра и пользовательского уровня. С помощью них пользователь или пользовательская программа может настраивать параметры устройства, драйвера, и т.п.
Алгоритмически взаимодействие вышеописанных объектов (структур) выглядит так:
/sys/bus/my_bus/devices/my_device/some_attr ) записывается информация пользователем. Show - когда считывается.
Процедура отключения устройства имеет обратный порядок. Сначала вызывается device_unregister(). После этого ядро автоматически вызывает driver->remove(device) и из sysfs удаляется соответствующий каталог. Ко всему сказано необходимо добавить, что:
| |