Как libusb получает доступ к ядру?

10

Из того, что я понимаю:

  • Вообще говоря, драйвер работает в пространстве ядра и может быть вызван из пространства пользователя.
  • Только код в пространстве ядра может вызывать вещи низкого уровня usb / ioctl
  • libusb это библиотека, поэтому она будет компилироваться и запускаться в пространстве пользователя

Так как же libusbдобиться низкого уровня USB?

Томас
источник

Ответы:

10

Libusb - это библиотека для взаимодействия с USB-устройствами таким же образом, как curses - это библиотека для взаимодействия с текстовыми терминалами, ALSA (точнее, ее компонент libasound) - это библиотека для взаимодействия с устройствами audi и т. Д. Ядро обрабатывает аппаратные взаимодействия. Он предоставляет файлы устройств , что приложения могут открывать для взаимодействия с аппаратными средствами, через read, writeи системные вызовы .ioctl

ioctl это системный вызов: он позволяет приложениям (пользовательскому коду) выдавать запросы, которые обрабатываются ядром.

Libusb позволяет приложениям регистрировать функции обратного вызова, которые выполняются, когда устройству есть, что сообщить. Вот приблизительный обзор потока информации под капотом:

  • Электрический сигнал на шине запускает событие на контроллере USB.
  • Контроллер USB генерирует сигнал прерывания на главном процессоре.
  • Процессор выполняет обработчик прерываний в ядре операционной системы.
  • Извещения ядра , что процесс находится в настоящее время в блокировании read, writeили ioctlсистемный вызов на файл устройства и причины, системный вызов к возвращению.
  • В процессе пользовательской земли, когда системный вызов возвращается, выполняется код библиотеки.
  • Код библиотеки выполняет функцию обратного вызова, зарегистрированную программистом приложения.
Жиль "ТАК - перестань быть злым"
источник
так нет необходимости писать драйверы устройств для USB-устройств? (если не возможно для оптимизации скорости)
Томас
@Thomas Вам нужно написать драйвер ядра, если вы хотите подключиться к инфраструктуре, которая не зависит от транспорта: клавиатура, хранилище, Ethernet и т. Д. В противном случае, я думаю, что вам нужен драйвер, только если задержка пользовательской программы слишком высока.
Жиль "ТАК ... перестать быть злым"
Если устройство не распознается компьютером (для него нет драйвера), все libusbравно будет доступ к нему?
Томас
@ Томас Я не знаю, сможет ли libusb справиться со всеми аспектами протокола USB, но в принципе да. Пользовательская программа может связываться с любым последовательным устройством RS232 через /dev/ttyS*. USB тот же принцип, только быстрее и сложнее.
Жиль "ТАК - перестань быть злым"
3

Linux использует два кольца, кольцо 0 называется уровнем ядра, кольцо 3 называется уровнем пользователя. Соединение пользователя с ядром осуществляется (как уже было сказано) через системные вызовы. Между ними находятся библиотеки, как видно из пользовательского пространства. Таким образом, самый низкий уровень доступа к ядру реализован в библиотеках по соображениям стабильности, безопасности, синхронизации, интервалов сохранения и так далее. Драйвер ядра предоставляет различные интерфейсы для пользовательского пространства: (ioctl, sysfs, сокеты, символьные и блочные устройства и т. Д.) Интерфейсы пространства пользователя . Поэтому, если вы хотите, вы можете реализовать свой доступ к драйверу ядра, не используя библиотеки, или значительно упростить компиляцию двоичного файла со статическими связанными библиотеками.

Хорошей отправной точкой является чтение исходных текстов libusb, они хорошо документированы.


источник
0

Он использует syscalls (2) и файлы устройств, подготовленные ядром ( /dev/bus/usb/*)

УВВ
источник
Так что все работает так, как будто ядро ​​создало специальный драйвер для неизвестных устройств, который принимает чтение и запись? Как мы узнаем о прерываниях и так далее?
Томас