Зачем нужен метод исследования в драйверах устройств Linux в дополнение к init? - PullRequest
45 голосов
/ 20 февраля 2011

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

Ответы [ 7 ]

71 голосов
/ 21 февраля 2011

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

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

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

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

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

9 голосов
/ 03 марта 2015

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

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

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

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

В ядре 2.4.29 я могу показать вам, как происходит зондирование? Пожалуйста, смотрите ниже (Имя файла: drivers / 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

};

Имя файла: drivers / i2c / 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;
}
8 голосов
/ 17 июля 2012

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

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

1 голос
/ 16 февраля 2015

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

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

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

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

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

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

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

0 голосов
/ 17 октября 2018

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

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

0 голосов

Несколько устройств и горячее подключение

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

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

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

  2. В противном случае горячее подключение PCIe было бы невозможным: https://electronics.stackexchange.com/questions/208767/does-pcie-hotplug-actually-work-in-practice

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

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

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

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

-device edu

, но что еще более интересно, мы можем подключить и удалить устройство из монитора QEMU, Ctrl + Alt + 2 на SDLGUI или -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?

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

    • , если у нас есть alrПри любом добавлении probe вызывается немедленно.

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

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

0 голосов
/ 30 августа 2015

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

...