Linux nvme驱动程序中core.c和pci.c之间的区别

时间:2018-03-17 14:12:12

标签: linux driver pci nvme

我想了解nvme驱动程序如何在Linux中运行,

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

令我困惑的是,有两个源文件包含“module_init()”

core.c

module_init(nvme_core_init);

和 pci.c

module_init(nvme_init);

我知道 module_init()函数是驱动程序的条目

但是如何在nvme驱动程序中有两个条目

1 个答案:

答案 0 :(得分:1)

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

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

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

如果您使用NVMe而非PCIe,那么以下链将有望帮助您理解:

  1. pci.c实施nvme_pci_reg_read32()
  2. pci.cnvme_pci_reg_read32()结构中注册nvme_ctrl_ops,名为nvme_pci_ctrl_ops
  3. core.c实现nvme_init_ctrl(),使用指向其中一个结构的指针调用
  4. core.c keeps a reference到结构
  5. core.c实施nvme_init_identify(),需要较低级别的帮助 - pci.c
  6. core.c通过reference retained above
  7. 致电pci.c' nvme_pci_reg_read32()

    如果我们要开发一个可以支持NVMe设备的新总线,那么我们可以将pci.c替换为new_bus.c而不更改core.c(如上所述)。< / p>

    它还值得检查Kconfig文件,因为它们可以暗示这样的事情 - 尽管有一定数量的心理体操通过{{将源文件与菜单选项联系起来1}} S上。