我想了解nvme驱动程序如何在Linux中运行,
所以我查看了nvme驱动程序源代码here
令我困惑的是,有两个源文件包含“module_init()”
core.c
module_init(nvme_core_init);
和 pci.c
module_init(nvme_init);
我知道 module_init()函数是驱动程序的条目
但是如何在nvme驱动程序中有两个条目?
答案 0 :(得分:1)
module_init()
是模块的入口点,使用abstraction我们将模块分层以逻辑分离功能,改善代码重用等...
pci.c
提供PCI / PCIe接口/抽象层,用于通过PCI总线使用NVMe设备 - 它与管理有形设备有很多关系:
core.c
提供核心驱动程序,用于一般性地处理连接到系统的NVMe设备(它不关心如何)。该模块更关注提供标准化的块设备访问等...
这是整个内核中常见的习惯用法,如果NVMe设备可以通过另一条总线访问,那么core.c
将被重用,没有/最小的更改,new_bus.c
将是写到两者之间的接口。
如果您使用NVMe而非PCIe,那么以下链将有望帮助您理解:
pci.c
实施nvme_pci_reg_read32()
pci.c
在nvme_pci_reg_read32()
结构中注册nvme_ctrl_ops
,名为nvme_pci_ctrl_ops
core.c
实现nvme_init_ctrl()
,使用指向其中一个结构的指针调用core.c
keeps a reference到结构core.c
实施nvme_init_identify()
,需要较低级别的帮助 - pci.c
core.c
通过reference retained above pci.c
' nvme_pci_reg_read32()
醇>
如果我们要开发一个可以支持NVMe设备的新总线,那么我们可以将pci.c
替换为new_bus.c
而不更改core.c
(如上所述)。< / p>
它还值得检查Kconfig
文件,因为它们可以暗示这样的事情 - 尽管有一定数量的心理体操通过{{将源文件与菜单选项联系起来1}} S上。