LInux Путаница в слоях драйверов устройств - PullRequest
0 голосов
/ 15 апреля 2020

Я недавно читал о Linux Модель драйвера и устройства. Я хотел понять, как работает следующее в linux в подсистеме драйверов. Допустим, мое дерево устройств выглядит следующим образом:

enter image description here

В качестве примера давайте предположим, что Bus1 - это шина PCI, Bus2 - это ISA, а Bus3 - это USB. Автобусы соединяются друг с другом с помощью мостов.

Linux будет идентифицировать это дерево устройств посредством процесса перечисления и механизма перечисления и проверки, подходящий драйвер USB для оконечного устройства.

Теперь давайте предположим операцию Tx к этому терминальному устройству. Драйвер usb оконечного устройства в конечном итоге будет выполнять urb_submit (dev, write_buffer).

Мой вопрос заключается в том, чтобы URB достиг терминального устройства, теоретически его нужно будет заключить в конверты Bus2 и Bus1. Таким образом, теоретически говоря, исходящий пакет должен выглядеть примерно так:

enter image description here

Так что в некоторых случаях после того, как urb_submit происходит в драйвере, какой-то код ядра набирает обороты древовидную структуру устройства и вызовите драйверы шины по порядку (драйвер шины 2, а затем драйвер шины 1) для создания этой структуры огибающей.

Может кто-нибудь указать мне код в ядре linux, где это происходит? Я пытался следовать urb_submit, но не смог понять это.

Спасибо большое!

1 Ответ

0 голосов
/ 15 апреля 2020

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

Для драйверов устройств, которые go проходят через слои Как вы описали выше, перечисление сообщает каждому драйверу, кто является его родителем, и драйвер сохраняет это в своих личных данных, когда он создается. Затем вызов чтения или записи драйвера правильно форматирует запрос для типа устройства и вызывает метод чтения или записи родительского драйвера. Например, чтение с USB-диска может вызвать метод read в блоке file_operations его родителя, который будет https://elixir.bootlin.com/linux/v4.19.107/source/drivers/usb/core/devio.c#L2614

...