我想了解 nvme 驱动程序在 Linux 中的工作原理,
所以我在这里查看 nvme 驱动程序源代码
让我困惑的是有两个源文件包含“module_init()”
核心.c
module_init(nvme_core_init);
和 pci.c
module_init(nvme_init);
我知道module_init()函数是驱动程序的入口
但是为什么nvme驱动程序中有两个条目?
module_init()是模块的入口点,通过抽象我们将模块分层以在逻辑上分离功能,提高代码重用等......
pci.c为通过 PCI 总线使用 NVMe 设备提供 PCI / PCIe 接口/抽象层 - 它与管理有形设备有更多关系:
core.c为一般处理连接到系统的 NVMe 设备提供核心驱动程序(它不关心如何)。该模块更关心提供标准化的块设备访问等...
这是整个内核中的一个常见习惯用法,这样做是为了如果 NVMe 设备可以通过另一条总线访问,那么core.c将在没有/最少更改的情况下被重用,new_bus.c并将被写入两者之间的接口。
如果您在 PCIe 上使用 NVMe,那么以下链有望帮助您理解:
pci.c工具nvme_pci_reg_read32()pci.cnvme_pci_reg_read32()在结构中注册nvme_ctrl_ops,命名为nvme_pci_ctrl_opscore.cimplements nvme_init_ctrl(),使用指向这些结构之一的指针调用core.c 保留对结构的引用core.c实现nvme_init_identify(),需要下级的帮助——pci.ccore.c通过上面保留pci.c的参考调用nvme_pci_reg_read32()pci.c如果我们要开发一种可以支持 NVMe 设备的新总线,那么我们可以在new_bus.c不改变的情况下换掉core.c(如上所述)。
检查这些文件也是值得的,Kconfig因为它们可以暗示这样的事情 - 尽管有一定数量的心理体操可以通过Makefiles. 将源文件与菜单选项联系起来。