асинхронные уведомления и udev
Добавлено: 27 окт 2012, 10:37
Понадобилось мне поразбираться (сделать для своих тестов) асинхронные уведомления из ядра Linux в свой пользовательский процесс. То, на чём работает udev и динамическая система devfs.
А заодно, раз уж выпала такая оказия, уточниться в деталях как работает udev.
Вот есть здесь на сайте свеже выложенный перевод Некоторые замечательные правила и примеры использования udev. Никаких "замечательных" правил там не ищите (статья довольно поверхностная) ... и вообще удивляет, что недавно написанная (28 Июня 2012 г. - это дата написания, а не перевода) статья описывает многие совершенно устаревшие команды, например... И тем не менее, для "освежить в памяти" сами основы udev вполне годится:
netlink (PF_NETLINK) - очень старая выдумка в Linux, начиная с ядра 2.2, но которая очень мало описана, особенно о своём API использования из программного кода. Это такой "локальный сетевой сокет", используемый для посылки сообщений между ядром и пользовательскими процессами. Кой-какая информация может быть почерпнута из man-ов и пересказов man-ов: netlink, PF_NETLINK - установка связи между ядром и пользователем , Протокол netlink в Linux ... Но главным образом, кому будет нужно, придётся разгребаться с заголовочными файлами, кодом ядра и комментариями в коде там и там
Население использует netlink для слежения (нотификации за изменениями) в сетевой системе (интерфейсы, аблица роутинга, ...), выложено несколько публикаций с примерами кода на этот счёт ... вот например Простой монитор сетевых интерфейсов Linux, с помощью netlink.
- для получения в свой процесс асинхронных уведомлений из ядра о происходящих там событиях;
- для отправки из кода своих модулей ядра нотификации пользовательским процессам;
По части udev ... он меня сейчас не сильно занимает, но это самая известная и самая крупная система, работающая на асинхронных уведомлениях ... Интересны именно сами принципы, которые они там используют. Но, может, и с ней будет случай и время разобраться детально, вплоть до их правил составления правил .
А заодно, раз уж выпала такая оказия, уточниться в деталях как работает udev.
Вот есть здесь на сайте свеже выложенный перевод Некоторые замечательные правила и примеры использования udev. Никаких "замечательных" правил там не ищите (статья довольно поверхностная) ... и вообще удивляет, что недавно написанная (28 Июня 2012 г. - это дата написания, а не перевода) статья описывает многие совершенно устаревшие команды, например... И тем не менее, для "освежить в памяти" сами основы udev вполне годится:
Служба udevd слушает netlink-сокет в ожидании событий, генерируемых ядром при подключении или отключении устройства. Вы можете наблюдать за этими событиями при помощи команды udevmonitor - запустите ее, подключите USB-устройство, например, flash-накопитель, и отключите его (в новейших дистрибутивах может не быть программы udevmonitor - в этом случае используйте udevadm.)
По поводу D-Bus здесь тоже выложен совершенно недавно перевод Разбираемся с D-BUS статьи, написанной Р.Лав (вот это отличная публикация, вполне достаточная для первого поверхностного представления о D-Bus).Для устройств, использующих горячее подключение, udevd принимает события ядра при помощи D-Bus, после чего получает атрибуты нового устройства из файловой системы /sys и применяет правила в зависимости от атрибутов - после этого создается файл устройства в файловой системе /dev. Udev также позволяет подгружать предназначенные для этого драйверы устройств при помощи механизма "modalias".
Вот этих зацитированных мной фраз уже достаточно для представления о полной логике работы системы udev, которая с внешней стороны пользователя выглядит мудрёной и загадочной.Каждое событие уровня событий ядра моделируется таким образом, что в качестве инициатора приводится путь в файловой системе sysfs. Таким образом, события выглядят как инициированные объектами ядра. Пути из файловой системы sysfs легко приводятся к путям объектов D-BUS, связывая уровень событий ядра и систему D-BUS естественным образом. Уровень событий ядра был впервые представлен в ядре версии 2.6.10-rc1.
netlink (PF_NETLINK) - очень старая выдумка в Linux, начиная с ядра 2.2, но которая очень мало описана, особенно о своём API использования из программного кода. Это такой "локальный сетевой сокет", используемый для посылки сообщений между ядром и пользовательскими процессами. Кой-какая информация может быть почерпнута из man-ов и пересказов man-ов: netlink, PF_NETLINK - установка связи между ядром и пользователем , Протокол netlink в Linux ... Но главным образом, кому будет нужно, придётся разгребаться с заголовочными файлами, кодом ядра и комментариями в коде там и там
Население использует netlink для слежения (нотификации за изменениями) в сетевой системе (интерфейсы, аблица роутинга, ...), выложено несколько публикаций с примерами кода на этот счёт ... вот например Простой монитор сетевых интерфейсов Linux, с помощью netlink.
Из таких публикаций можно почерпнуть подсказки прямо из их кода... Пишущие подобные заметки тоже замечают все:14 июня 2011
Вот и интересует меня состояние дел с этими механизмами:К сожалению, у библиотеки оказался не особо удобный и довольно сложный API, требовавший совершать множество непонятных действий. Особого веселья добавляло практически полное отсутствие документации и вообще любых материалов на эту тему.
- для получения в свой процесс асинхронных уведомлений из ядра о происходящих там событиях;
- для отправки из кода своих модулей ядра нотификации пользовательским процессам;
По части udev ... он меня сейчас не сильно занимает, но это самая известная и самая крупная система, работающая на асинхронных уведомлениях ... Интересны именно сами принципы, которые они там используют. Но, может, и с ней будет случай и время разобраться детально, вплоть до их правил составления правил .