3

我想了解 nvme 驱动程序在 Linux 中的工作原理,

所以我在这里查看 nvme 驱动程序源代码

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

核心.c

module_init(nvme_core_init);

和 pci.c

module_init(nvme_init);

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

但是为什么nvme驱动程序中有两个条目

4

1 回答 1

2

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

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


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

  1. pci.c工具nvme_pci_reg_read32()
  2. pci.cnvme_pci_reg_read32()在结构中注册nvme_ctrl_ops,命名为nvme_pci_ctrl_ops
  3. core.cimplements nvme_init_ctrl(),使用指向这些结构之一的指针调用
  4. core.c 保留对结构的引用
  5. core.c实现nvme_init_identify(),需要下级的帮助——pci.c
  6. core.c通过上面保留pci.c的参考调用nvme_pci_reg_read32()

pci.c如果我们要开发一种可以支持 NVMe 设备的新总线,那么我们可以在new_bus.c不改变的情况下换掉core.c(如上所述)。


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

于 2018-03-17T15:06:34.940 回答