我想了解 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.c
nvme_pci_reg_read32()
在结构中注册nvme_ctrl_ops
,命名为nvme_pci_ctrl_ops
core.c
implements nvme_init_ctrl()
,使用指向这些结构之一的指针调用core.c
保留对结构的引用core.c
实现nvme_init_identify()
,需要下级的帮助——pci.c
core.c
通过上面保留pci.c
的参考调用nvme_pci_reg_read32()
pci.c
如果我们要开发一种可以支持 NVMe 设备的新总线,那么我们可以在new_bus.c
不改变的情况下换掉core.c
(如上所述)。
检查这些文件也是值得的,Kconfig
因为它们可以暗示这样的事情 - 尽管有一定数量的心理体操可以通过Makefile
s. 将源文件与菜单选项联系起来。