15

Мне интересно, как распознавание USB-устройств работает в Windows. Я представляю, что-то вроде этого:

  • Когда вы подключаете устройство, оно говорит Windows «вот мой идентификатор устройства, чтобы сказать вам, кто я»
  • Windows проверяет, установлены ли какие-либо драйверы, соответствующие этому идентификатору устройства. Драйвер, вероятно, сообщает Windows, как должно называться устройство - например, "BlackBerry Curve" или "Canon Printer".
  • Если так, то это как-то связывает это устройство с этим драйвером
  • В противном случае он ищет подходящий драйвер онлайн (если вы позволите)

Я прав? Если так, то это все еще оставляет некоторые вопросы.

  • Когда вы устанавливаете драйверы, куда они идут? Это файлы в папке или они добавлены в реестр?
  • Что делает Windows, когда она сначала распознает устройство, думает и, наконец, говорит: «Ваше новое устройство установлено и готово к использованию?"
  • Где Windows ищет отсутствующие драйверы? Это в их собственной базе данных? Производители устройств отправляют драйверы в Microsoft для включения туда?

Кто-нибудь может объяснить, как этот процесс действительно работает? Кроме того, другие ОС делают это по-другому?

3 ответа3

22

Шина USB физически разработана таким образом, что хост-контроллер может распознать действие по вставке (и снятию) вилки. Когда происходит это событие "plug", хост-контроллер информирует свой драйвер устройства, который сканирует шину, и просит каждое устройство идентифицировать себя.

Все USB-устройства содержат набор информации об устройстве, называемый дескрипторами. Дескрипторы устройства извлекаются со всех устройств одной и той же командой. Это позволяет драйверу устройства для самой шины USB эффективно спрашивать вновь подключенное устройство, что это такое, и ожидать разумного ответа.

Из всех дескрипторов только немногие напрямую используются для сопоставления драйверов с большинством устройств. Это связано с тем, что USB определяет классы устройств, и обычно системного драйвера для каждого класса устройств достаточно для обработки любых устройств, которые утверждают, что находятся в этом классе.

Все клавиатуры будут принадлежать к классу HID (Human Interface), как, например, мыши, планшеты и игровые контроллеры. Класс HID имеет несколько подклассов (клавиатуры, мыши и т.д.), Поэтому каждый из них обрабатывается ожидаемым образом.

Большинство дискообразных устройств будут претендовать на класс Mass Storage, и системный драйвер работает только для них.

В дополнение к классу и подклассу дескрипторы также включают идентификатор поставщика (VID), идентификатор продукта (PID) и редакцию. Идентификаторы поставщиков назначаются комитетом по стандартам (в основном в порядке выдачи, но некоторые компании получают специальные запросы: например, intel - 0x8086). Идентификаторы продукта назначаются каждым поставщиком, и комбинация VID и PID должна быть уникальной для каждого выпущенного продукта.

Когда устройство впервые установлено, VID, PID, редакция, класс и подкласс используются предсказуемым образом для выбора загружаемого драйвера устройства. Наличие названий поставщиков и конкретных продуктов позволяет поставщику настроить устройство, которое в противном случае могло бы быть обработано (почти) корректно драйвером стандартной системы.

Другим важным дескриптором является серийный номер устройства. Если у устройства есть серийный номер, то при повторном подключении его можно распознать и обработать одинаково, даже если используется другой физический порт USB. Это важно для устройств хранения, чтобы им назначалась одинаковая буква диска, и для устройств, таких как адаптеры последовательного порта и модемы, чтобы им было назначено одинаковое обозначение COM-порта.

Весь этот процесс задокументирован в MSDN, но детали разбросаны по разным местам.

6

Вопросы :

  • Каталоги: драйверы установлены в 2 каталогах. Работающая часть (в большинстве случаев) устанавливается в% RootDir%\system32, информационная часть устройства устанавливается в% RootDir%\inf. В директории inf для установленного / зарегистрированного драйвера создается файл oem * .inf. (* это число). В Vista драйвер копируется в каталог% RootDir%\system32\driverstore в качестве справки при установке еще не обнаруженных устройств.
  • Реестр: драйвер устанавливается как служба режима ядра. Для этого создаются определенные ключи реестра для службы драйверов. Под драйвером шины есть еще одно место, где соответствующие устройства получают индивидуальный ключ экземпляра устройства. В этом ключе устройство имеет ссылку на текущий используемый драйвер для этого устройства.
  • «Прибытие» устройства: когда драйвер шины находит новое устройство в своей шине, он создает реестр ключей под своим собственным ключом, который соответствует уникальному идентификатору экземпляра устройства, который можно использовать для уникальной идентификации устройства в системе. Если этот ключ уже существует, драйвер шины пытается загрузить устройство, на которое ссылается этот узел. Если этот узел не существует или драйвер не загружается, система пытается найти совместимый драйвер для устройства путем сканирования зарегистрированных драйверов устройств в папке% RootDir%\inf. Драйверы, которые соответствуют данному устройству, перечисляются и сортируются. Лучший драйвер затем выбирается и загружается для устройства.
  • Поиск драйверов : драйверы сначала ищутся в каталоге inf. Когда драйвер не найден, Windows спрашивает пользователя, может ли он предоставить драйверы или он должен выглядеть на сервере Microsoft. Производители драйверов могут представить свои драйверы для включения на сервер драйверов устройств Microsoft.

У Лунатика есть первая часть ответа, как так называемый драйвер автобуса находит устройство.

3

Я хотел бы порекомендовать хорошую книгу о USB:

  • USB Complete от Ян Аксельсон

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .