将Linux设备驱动程序与虚拟PCI设备连接

时间:2012-12-07 10:07:42

标签: c linux-device-driver emulation pci-e

我有一个模拟PCI设备的用户空间程序。我已经下载了使用NVMe标准与PCI设备交互的nvme linux设备驱动程序。我必须验证我的用户空间程序是否与标准兼容。

nvme.c(linux设备驱动程序)包含nvme_probe()函数,该函数将在插入设备时调用。由于我没有设备所以我认为我将在nvme_init()中包含探测功能功能。

现在我已经在互联网上研究了很多,以了解如何模拟PCI设备,如     Installing PCI driver without connection to deviceemulating a PCI device on linux 我不明白如何将填充的struct pci_dev返回到nvme_probe()的{​​{1}}中的函数调用

如果您可以建议一个教程,关于如何使用虚拟设备配置和用户空间程序函数指针的内存地址手动填充pci_dev结构,以模拟与nvme驱动程序的交互。

1 个答案:

答案 0 :(得分:1)

我认为用标准的linux内核伪造这样的东西是不可能的。

因为在module_init()中,当系统中存在某个设备时(通过id_table),你告诉内核的 PCI SUBSYSTEM 加载操作处理程序(也称为 - 通过函数指针进行回调)。 / p>

所以每当你修改你的模块时,内核的 PCI SUBSYTEM 就会知道只要匹配vid / pid的设备插入PCIe插槽就加载你的驱动程序。操作如下 -

  • 当这个{vid / pid} pci设备出现时,告诉内核加载{my_driver.ko} 在module_init或_init
  • 中找到
  • 在内核知道之后,只要匹配的{vid / pid}设备连接到系统,它就会调用{my_driver.ko}的 .probe 函数回调
  • 您可以初始化设备(用于实际设备)或只返回true以告诉已正确初始化设备的内核。 您还可以从此探测功能注册新的驱动程序类型(for 读/写)。

我不确定是否有任何神奇的VID / PID编号导致 PCI SUBSYTEM 始终加载驱动程序。

但您实际上可以使用实际的PCI设备加载PCI驱动程序。

只需删除真实PCI设备的相应驱动程序即可。并使用它的VID& PID作为驱动程序的VID PID。然后 PCI SUBSYTEM 将加载您的驱动程序&您也可以测试您的驱动程序以便随后模拟PCI设备。

希望这有帮助,

问候。