Разница между core.c и pci.c в драйвере Linux nvme

Я хочу узнать, как драйвер nvme работает в Linux,

Поэтому я смотрю исходный код драйвера nvme здесь

меня смущает то, что есть два исходных файла, содержащих "module_init()"

core.c

module_init(nvme_core_init);

и pci.c

module_init(nvme_init);

Я знаю, что функция module_init() является записью драйвера

но как же там две записи в драйвере nvme?

1 ответ

Решение

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

  • pci.c обеспечивает уровень интерфейса / абстракции PCI / PCIe для использования устройств NVMe по шине PCI - это гораздо больше связано с управлением материальными устройствами:
    • nvme_id_table
    • nvme_probe()
    • nvme_irq()
  • core.c предоставляет основной драйвер для общего взаимодействия с устройствами NVMe, подключенными к системе (не важно, как). Этот модуль больше заботится о предоставлении стандартизированного доступа к блочным устройствам и т. Д.
    • nvme_fops
    • nvme_submit_io()

Это общая идиома во всем ядре, и это делается для того, чтобы, если устройство NVMe стало доступным через другую шину, то core.c будет использоваться повторно без / минимальных изменений, и new_bus.c будет написано для интерфейса между ними.


Если вы используете NVMe поверх PCIe, то, надеюсь, поможет следующая цепочка:

  1. pci.c инвентарь nvme_pci_reg_read32()
  2. pci.c регистры nvme_pci_reg_read32() в nvme_ctrl_ops структура, названная nvme_pci_ctrl_ops
  3. core.c инвентарь nvme_init_ctrl(), который вызывается с указателем на одну из этих структур
  4. core.c сохраняет ссылку на структуру
  5. core.c инвентарь nvme_init_identify(), которая нуждается в помощи нижнего уровня - pci.c
  6. core.c звонки pci.c "s nvme_pci_reg_read32() через ссылку, сохраненную выше

Если бы мы разработали новую шину, которая могла бы поддерживать устройство NVMe, то мы могли бы поменяться pci.c за new_bus.c без изменений core.c (как уже упоминалось выше).


Также стоит проверить Kconfig файлы, так как они могут намекают на подобные вещи - хотя есть определенное количество умственной гимнастики, чтобы связать исходные файлы с опциями меню через Makefile s.

Другие вопросы по тегам