Разница между 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, то, надеюсь, поможет следующая цепочка:
pci.c
инвентарьnvme_pci_reg_read32()
pci.c
регистрыnvme_pci_reg_read32()
вnvme_ctrl_ops
структура, названнаяnvme_pci_ctrl_ops
core.c
инвентарьnvme_init_ctrl()
, который вызывается с указателем на одну из этих структурcore.c
сохраняет ссылку на структуруcore.c
инвентарьnvme_init_identify()
, которая нуждается в помощи нижнего уровня -pci.c
core.c
звонкиpci.c
"snvme_pci_reg_read32()
через ссылку, сохраненную выше
Если бы мы разработали новую шину, которая могла бы поддерживать устройство NVMe, то мы могли бы поменяться pci.c
за new_bus.c
без изменений core.c
(как уже упоминалось выше).
Также стоит проверить Kconfig
файлы, так как они могут намекают на подобные вещи - хотя есть определенное количество умственной гимнастики, чтобы связать исходные файлы с опциями меню через Makefile
s.