Как понять поток обнаружения USB?

14

Я хотел бы понять поток событий USB из пространства ядра в пространство пользователя (просто из моего любопытства, зная, как все реализовано).

Чтобы быть более понятным, я хотел бы знать, как это всплывающее окно появляется на моем рабочем столе, когда я подключаю USB-накопитель к моей системе, и как подключается диск.

Я также хотел бы знать, как он узнает, присутствуют ли некоторые изображения на моем USB-устройстве, и, если "да", как он спрашивает меня, нужно ли мне открывать его в GIMP или каком-либо другом программном обеспечении?

Я знаю, что это очень большой и широкий вопрос, но, пожалуйста, объясните мне, как понять всю идею, стоящую за ним.

Я не делал больших просмотров кода, но уверяю вас, у меня нет проблем с этим, если я могу руководствоваться правильно.

сен
источник

Ответы:

16
  1. Устройство подключено, и программное обеспечение, управляющее аппаратной шиной для этого устройства, получает прерывание (или другое уведомление на аппаратном уровне), а драйвер шины перечисляет подключенные устройства или выполняет другие аппаратные действия для идентификации устройства.
  2. Ядро запрашивает загрузку драйвера для нового оборудования, вызывая / sbin / modprobe с идентификатором шины / устройства / etc оборудования.
  3. В пользовательском пространстве modprobe пытается найти соответствующий псевдоним, указанный драйвером. (См. /lib/modules/$(uname -r)/modules.aliasПолный список.) Они будут выглядеть по-разному в зависимости от аппаратного интерфейса. Например, pci:v0000102Bd00002527sv*sd*bc*sc*i*для устройства PCI поставщика 102B, устройства 2527, и что - нибудь для subvendor, и т.д., или USB: usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*.
  4. как только драйвер устройства загружен (или инициализировано новое устройство, в котором уже был драйвер), драйвер в ядре отправляет уведомление о загруженном устройстве udevв пользовательское пространство.
  5. udevсопоставляет уведомление с его списком правил в /lib/udev/rules.d/и /etc/udev/rules.d. Отсюда, поведение является чрезвычайно специализированным, основанным на правилах.
  6. В случае USB-диска, 80-udisks.rulesфайл, вероятно, является лучшим местом для работы. Эти правила будут использовать такие вещи, как blkid и другие помощники, для проверки типа и содержимого диска, заполняя всевозможные значения конфигурации, включая такие, как ENV{UDISKS_PRESENTATION_HIDE}="1"игнорирование диска по какой-либо причине. Смотрите "man 7 udisks" для деталей.
  7. Udisks-демон часов для устройств появятся в Udev базе данных, и представляет их их в качестве открываемого списка устройств по DBus. (См. «Udisks - перечислить».)
  8. В udisks настраиваются различные действия , а политику для разрешения этих действий можно увидеть в файле политики /usr/share/polkit-1/actions/org.freedesktop.udisks.policy. (Кто может смонтировать, размонтировать и т. Д.)
  9. Сервисы, которые заинтересованы в устройствах, будут прослушивать события DBus от udisks и предпринимать действия, когда видят определенные условия. Например, GNOME Nautilus (через gvfs volume-monitor) будет запрашивать автомонтирование для устройств (через udisks , который проверит свою политику, упомянутую выше).
  10. После монтирования файловой системы те же службы прослушивания будут выполнять больше действий. Например, Nautilus спросит, хотите ли вы открыть F-Spot, когда в DCIMфайловой системе найден общий каталог для хранения фотографий .
Кис Кук
источник
1
Может быть, вы знаете, как это отличается во время загрузки (я предполагаю, что только шаг 1 отличается)? Почему устройство не может быть обнаружено во время загрузки, но правильно загружено после повторного подключения вручную?
naktinis