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

Почему метод зонда необходим в драйверах устройств Linux в дополнение к init?

В ядре linux, что делает метод probe(), который предоставляет драйвер? Насколько это отличается от функции драйвера init, то есть почему функции драйвера probe() не могут выполняться в функции драйвера init?

4b9b3361

Ответ 1

Различные типы устройств могут иметь функции probe(). Например, устройства PCI и USB имеют функции probe().

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

Более короткий ответ, предполагая, что PCI: функция инициализации драйвера вызывает pci_register_driver(), которая дает ядру список устройств, которые он может обслуживать, а также указатель на функцию probe(). Затем ядро ​​вызывает драйвер probe() для каждого устройства.

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

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

Ответ 2

@Bandicoot: будет вызван пробник(), чтобы убедиться, что устройство существует, и функциональность прекрасна. Если устройство не является "горячим" подключением, функция probe() может быть помещена внутри init(). Это уменьшит время работы памяти во время работы драйвера. P.S ссылка

Зонд() происходит во время загрузки устройства или при подключении устройства. Для "платформенного" устройства функция зонда вызывается, когда зарегистрировано платформенное устройство, и имя устройства совпадает с именем, указанным в драйвере устройства. P.S ссылка

Функция i2c_detect проверяет адаптер I2C, ища разные адреса, указанные в структуре addr_data. Если устройство найдено, функция chip_detect вызывается. P.S ссылка.

Одна ссылка, которая, несомненно, очистит ваши сомнения. P.S ссылка

В ядре 2.4.29 я могу показать вам, как происходит зондирование? См. Ниже (Имя файла: драйверы /acorn/ char/pcf8583.c)

static struct i2c_driver pcf8583_driver = {
name:       "PCF8583",
id:     I2C_DRIVERID_PCF8583,
flags:      I2C_DF_NOTIFY,
attach_adapter: pcf8583_probe, /* This will be called from i2c-core.c P.S see below function i2c_add_driver()*/
detach_client:  pcf8583_detach,
command:    pcf8583_command

};

Имя файла: драйверы /i 2c/i2c-core.c

int i2c_add_driver(struct i2c_driver *driver)
{
    ........................
    ........................

    /* now look for instances of driver on our adapters
     */
    if (driver->flags& (I2C_DF_NOTIFY|I2C_DF_DUMMY)) {
        for (i=0;i<I2C_ADAP_MAX;i++)
            if (adapters[i]!=NULL)
                /* Ignore errors */
                driver->attach_adapter(adapters[i]); /*This is a location from where probe is called. Pointer **driver** is of type **pcf8583_driver** which you have passed into this function*/
    }
    ADAP_UNLOCK();
    return 0;
}

Несколько важных ссылок:

1) http://www.slideshare.net/varunmahajan06/i2c-subsystem-in-linux2624

2) http://www.programering.com/a/MjNwcTMwATM.html

3) http://www.linuxjournal.com/article/6717

4) http://www.developermemo.com/2943157/

5) http://free-electrons.com/doc/kernel-architecture.pdf

6) http://www.techques.com/question/1-3014627/Probe-problem-when-writing-a-I2C-device-driver

В PCI для ядра 2.4.29 он вызывается при идентификации идентификатора поставщика и устройства. Драйвер шины PCI сделает это за вас. См. Ниже код:

Имя файла: drivers/pci/pci.c

static int pci_announce_device(struct pci_driver *drv, struct pci_dev *dev)
{
   const struct pci_device_id *id;
   int ret = 0;
   if (drv->id_table) {
    id = pci_match_device(drv->id_table, dev); /* check for device presence*/
    if (!id) {
     ret = 0;
     goto out;
    }
   } else
  id = NULL;
  dev_probe_lock();
  if (drv->probe(dev, id) >= 0) { /* This is a location from where probe is called*/
   dev->driver = drv;
   ret = 1;
   }
   dev_probe_unlock();
  out:
  return ret;
}

Ответ 3

Init (void)//запускается один раз при вызове драйвера/модуля и устанавливает настройки для машины драйвера ядра.

Probe (* pdev)//используется машиной драйвера ядра при необходимости для обнаружения и установки реальных устройств

Ответ 4

Драйвер xxx_init_module() вызывает вызовы pci_register_driver(struct pci_driver *drv), передавая ссылку на структуру типа pci_driver. struct pci_driver - важная структура, которую должны иметь все PCI-драйверы, которые инициализируются такими переменными, как имена драйверов, список таблиц PCI-устройств, которые может поддерживать драйвер, процедуры обратного вызова для основной подсистемы PCI.

Структура драйверов pci_driver имеет важные поля участников, перечисленные ниже:

  • name - Имя драйвера, который является уникальным среди всех драйверов PCI в ядре. Он появится под /sys/bus/pci/drivers.

  • pci_device_id - Таблица идентификационных данных устройства состоит из чипов, поддерживаемых этим драйвером.

  • probe - Адрес функции xxx_probe().

  • remove/suspend/resume/shutdown - обратитесь к функции, которую вызывает система ядра PCI, когда устройство PCI удалено/приостановлено/возобновлено/выключено соответственно. Обычно используется верхними уровнями для управления питанием.

Для получения дополнительной информации о том, как исследование драйвера, выполненного из ядра PCI, ссылается на Linux Device Driver Init.

Ответ 5

Несколько устройств и hotplug

  • У вас работает большой сервер со многими PICe-совместимыми GPU-ускорителями. В какой-то момент вы решили купить больше графических процессоров для бесплатных слотов.

    Если мы использовали init, тогда нам пришлось бы rmmod и insmod модуль. Но это потребует остановки всех подключенных графических процессоров, что приводит к простою.

    С probe мы просто подключаем новые графические процессоры, чтобы выполнить повторное сканирование.

  • PCIe hotplug не будет возможен иначе: https://electronics.stackexchange.com/questions/208767/does-pcie-hotplug-actually-work-in-practice

Пример устройства PCI QEMU edu

QEMU имеет обучающее устройство PCI edu, которое позволяет нам легко тестировать, когда вызывается probe.

Во-первых, для этого нам нужен минимальный драйвер PCI для ядра Linux, который я здесь написал.

Мы можем начать с устройства, подключенного с помощью:

-device edu

но еще более интересно, мы можем подключить и удалить устройство с монитора QEMU, а также Ctrl + Alt + 2 в SDL GUI или -monitor telnet::45454,server,nowait в CLI с помощью команд:

device_add edu
device_del edu

Если устройство загружено при загрузке:

  • probe вызывается, как только мы insmod модуль

  • dmesg содержит строку типа: pci 0000:00:04: [1234:11e8] ..., которая показывает, что наше устройство было проверено на BDF 0000:00:04.

    Мы знаем, что это наше устройство, потому что поставщик - 0x1234 и идентификатор устройства 11e8 в источнике QEMU.

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

Если мы подключаем устройство после загрузки с монитора:

  • ничего не происходит, пока мы не делаем:

    echo 1 > /sys/bus/pci/rescan
    

    См. также: Как заставить ядро ​​linux перечислить шину PCI-e?

  • после повторного сканирования:

    • Если мы уже включили, probe вызывается сразу.

      Итак, в этом случае probe произошло отдельно от insmod, показывая, как они отличаются.

    • если у нас нет: probe вызывается сразу после insmod

Ответ 6

Проверка выполняется, когда метод probe() вызывается указателем функции внутри структуры, которая используется для привязки устройства к данным по умолчанию или пользовательской платформе, относящимся к устройству. драйверы используют большое количество информации об устройстве, так что зондирование предоставляет такую ​​информацию драйверам, когда запись в поле имени id_table совпадает с именем устройства будет зоной.

Ответ 7

Ядро Linux использует аппаратное устройство, совпадающее с процессом программного драйвера. init вызывается очень рано, и регистрирует функцию probe и имя аппаратного устройства, например, "taiko_sound_card", в ядре. Это говорит ядру, что "я являюсь драйвером sw для этого устройства с таким именем". Когда ядро проходит через устройства hw (дерево устройств или перечисление шины) и находит совпадение, оно вызывает вашу зарегистрированную функцию probe. Теперь ваш драйвер устройства владеет устройством hw.

Если не найдено подходящего устройства, ваш зонд может никогда не позвонить. Вот почему обычно init крошечный и probe выполняет всю работу по инициализации.