Подтвердить что ты не робот

Трудное время в понимании использования MODULE_DEVICE_TABLE (usb, id_table)

Мне трудно понять точное использование MODULE_DEVICE_TABLE(usb, id_table)

AFAIK это сгенерирует файлы карт, которые будут использоваться позже modprobe всякий раз, когда будет вставлено новое устройство, оно будет сопоставлять его с этими файлами карты и загружать модуль, если он соответствует.

Но мое недоразумение: "Разве модуль не загружен?"

Я имею в виду, что я уже загрузил его, когда сделал insmod module-name. или я чего-то не хватает?

4b9b3361

Ответ 1

Обычно он используется для поддержки горячего подключения, загружая/вставляя драйвер для устройства, если он еще не загружен.

Здесь есть аналогичный вопрос: Обнаружение присутствия устройства, когда он подключен к сети в Linux

(Из моих ans)

Он работает следующим образом:

  • Каждый драйвер кода обнаруживает свой идентификатор поставщика/устройства, используя:

      MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
    
  • Во время компиляции процесс сборки извлекает эту информацию из всех драйверов и подготавливает таблицу устройств.

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

Ответ 2

В соответствии с драйверами устройств Linux:

  • MODULE_DEVICE_TABLE используется для создания файлов карт программой depmod;
  • Когда устройство подключено к сети, драйвер шины генерирует событие hotplug. Ядро вызывает /sbin/hotplug с соответствующими настройками окружающей среды;
  • Учитывая файлы карт и информацию из среды, /sbin/hotplug решает, какой модуль загружает и фактически загружает его. Если модуль уже загружен, это нормально.

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

Чтобы проверить, нормально ли драйвер для конкретного устройства, используется функция match() из bus_type.

Ответ 3

Вот как я понимаю вещи [совместимый с Xbuntu 14.04].

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

  • Вручную → insmod modulename.ko или modprob modulename.ko
  • Автоматически → Существует несколько способов.

    • скопируйте в /lib/modules/`uname -r`/kernel/modulename.ko и обновите /etc/modules. Система загрузит модуль во время загрузки.

    • Напишите команду script/для загрузки module.ko для конкретного события harware add/change/remove в правиле udev /etc/udev/rules.d/10-local.rules. Вы можете выполнять загрузку и выгрузку с помощью этого метода.

    • Составьте свой модуль при регистрации MODULE_DEVICE_TABLE. Затем загрузите свой modulename.ko один раз и запустите команду depmod [sudo depmod -a], чтобы добавить новый модуль в файлы /lib/modules/3.16.0-34-generic/modules.alias /lib/modules/3.16.0-34-generic/modules.dep. Как я знаю, система будет загружаться, только если модуль не загружен.

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

Монитор

udevadm

команды.

Ответ 4

The MODULE_DEVICE_TABLE() macro allows depmod to extract
at compile time the relation between device identifiers and
drivers, so that drivers can be loaded automatically by udev