когда Linux вызывает функцию проверки драйвера PCI?

Перед регистрацией драйвера PCI мы должны инициализировать struct pci_driver и передать его pci_register_driver. Одно из полей структуры - указатель на probe функцию драйвера.

У меня вопрос - когда ядро ​​вызывает процедуру проверки драйвера. Гарантируется ли это сразу после звонка pci_register_driver или может произойти в любое другое время? Что определяет это поведение?

ОБНОВЛЕНИЕ pci_register_driver - это макрос, преобразованный в __pci_register_driver, который, в свою очередь, вызывает driver_register, а driver_register вызывает bus_add_driver.

В bus_add_driver есть следующий код:

if (drv->bus->p->drivers_autoprobe) {
        error = driver_attach(drv);
        if (error)
            goto out_unregister;
}

driver_attach вызовет bus_for_each_dev с аргументом __driver_attach, который вызовет driver_probe_device

И driver_probe_device в конечном итоге вызывает really_probe:

if (dev->bus->probe) {
    ret = dev->bus->probe(dev);

Единственное, в чем я не уверен, это то, установлен ли флаг drivers_autoprobe для pci_bus.


person Mark    schedule 09.07.2015    source источник
comment
stackoverflow.com/questions/5059501/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 09.07.2017


Ответы (2)


После того, как ядро ​​PCI в вашем ядре Linux перечислит ваше устройство на этапе обучения связи (это происходит по умолчанию при загрузке), оно будет собирать информацию о подключенных к нему устройствах конечных точек, включая идентификатор поставщика и идентификатор устройства. Затем ядро ​​PCI будет перебирать все драйверы, которые были зарегистрированы для него с помощью функции pci_register_driver, и проверять, поддерживает ли драйвер эту комбинацию производитель / устройство.

Драйвер определяет, что он поддерживает эту комбинацию поставщик / устройство, используя поле struct pci_device_id id_table структуры pci_driver.

Типичная реализация будет выглядеть примерно так:

#define VENDOR 0xBEEF // vendor of EP device
#define DEVICE 0x1111 // device id of EP

static struct pci_device_id module_dev_table[] = {
    { PCI_DEVICE(VENDOR, DEVICE)},
    {0, },
};

// PCI driver structure used to register this driver with the kernel
static struct pci_driver fpga_driver = {
    .id_table   = module_dev_table,
    .probe      = module_probe,
    .remove     = module_remove,
    .suspend    = module_suspend,
    .resume     = module_resume,
};

Когда ядро ​​PCI идентифицирует ваш драйвер как драйвер, который поддерживает устройство на шине, тогда будет вызвана ваша функция проверки.

Итак, отвечая на ваш вопрос, НЕТ, ваша функция зондирования не гарантированно будет вызываться сразу после регистрации вашего драйвера, и почти наверняка не будет. Ваша функция проверки будет вызвана сразу после того, как перечисление ядер PCI / обучение связи идентифицируют устройство, которое поддерживает ваш драйвер.

person whh4000    schedule 14.07.2015

Когда ядро ​​обнаруживает устройство PCI на шине PCI, ядро ​​получает имя устройства на основе дерева устройств. После этого ядро ​​просматривает список зарегистрированных драйверов, если какой-либо из драйверов поддерживает это устройство. Если да, то ядро ​​вызовет проверку этого конкретного драйвера.

person Anup Kavari    schedule 10.07.2015
comment
при загрузке ядро ​​обнаруживает устройство на шине PCI, но драйвер не зарегистрирован; позже мы инсмодируем драйвер, как ядро ​​подберет функцию проверки драйвера, чтобы продолжить? Есть ли выделенная ветка? - person Mark; 10.07.2015
comment
В init () драйвера вы будете регистрировать свой драйвер для конкретной шины. Вашему водителю необходимо подключиться к конкретному автобусу. Затем этот драйвер шины вызывает зонд нового добавленного драйвера. - person Anup Kavari; 11.07.2015