Linux nvme 驱动中 core.c 和 pci.c 的区别

difference between core.c and pci.c in Linux nvme driver

我想了解 nvme 驱动程序在 Linux、

中的工作原理

所以我查看了nvme驱动源码here

让我困惑的是有两个源文件包含 "module_init()"

core.c

module_init(nvme_core_init);

和 pci.c

module_init(nvme_init);

我知道module_init()函数是驱动的入口

但是nvme驱动怎么会有两个条目

module_init() 模块 的入口点,使用 abstraction 我们将模块分层以在逻辑上分离功能,提高代码重用等。 ..

  • pci.c 提供 PCI / PCIe interface/abstraction 层,用于通过 PCI 总线使用 NVMe 设备 - 它与管理有形设备有更多关系:
  • core.c 提供 core 驱动程序,用于一般处理连接到系统的 NVMe 设备(它不关心 how).该模块更关心提供标准化的块设备访问等......

这是整个内核的一个常见习惯用法,这样做是为了如果 NVMe 设备可以通过另一条总线访问,那么 core.c 将在没有/最小更改的情况下被重用,并且 new_bus.c将写入两者之间的接口。


如果您在 PCIe 上使用 NVMe,那么以下链条有望帮助理解:

  1. pci.c 实施 nvme_pci_reg_read32()
  2. pci.cnvme_ctrl_ops结构中注册nvme_pci_reg_read32(),命名为nvme_pci_ctrl_ops
  3. core.c 实现了 nvme_init_ctrl(),它是用指向这些结构之一的指针调用的
  4. core.ckeeps a reference到结构
  5. core.c 实现 nvme_init_identify(),这需要 lower-level - pci.c
  6. 的帮助
  7. core.c 通过 reference retained above
  8. 调用 pci.cnvme_pci_reg_read32()

如果我们要开发一种可以支持 NVMe 设备的新总线,那么我们可以将 pci.c 换成 new_bus.c 而无需更改 core.c(如上所述) .


还值得检查 Kconfig 文件,因为它们可以暗示这样的事情 - 尽管有一定数量的心理体操可以通过 [=39= 将源文件与菜单选项联系起来]s.