2012-12-07 104 views
3

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

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

现在我已经研究了很多在互联网上了解如何模仿PCI设备,岗位如 Installing PCI driver without connection to deviceemulating a PCI device on linux 我不明白的想法如何在人口结构的pci_dev返回在函数调用的pci_set_drvdata(pdev, dev);

nvme_probe()如果你能提出一个教程,有关如何手动填充虚拟设备配置和用户空间程序函数指针的内存地址结构的pci_dev效仿与nvme驱动程序交互。

回答

1

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

因为在宏module_init()你告诉内核的PCI子系统加载操作处理程序(a.k.a - 通过函数指针回调)当某一设备是系统中存在的(通过id_table)。

因此,无论何时insmod模块,内核的PCI SUBSYTEM都会知道在每个匹配vid/pid的设备插入PCIe插槽时加载驱动程序。操作是像下面 -

  • 泰尔内核加载{my_driver.ko}当此{VID/PID} PCI设备 在宏module_init发现或_init
  • 内核知道后,每当一个匹配{VID/pid}设备连接到系统,它会调用.probe函数回调{my_driver.ko}
  • 您可以初始化设备(对于实际设备)或者只是返回true以告知已正确初始化的内核装置。 您也可以从此探测功能注册新的驱动程序类型(对于 可读/写)。

我不知道这会导致PCI SUBSYTEM总是加载驱动程序的任何魔法VID/PID号。

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

只需删除真实PCI设备的适当驱动程序即可。并使用它的VID & PID作为您的驱动程序的VID PID。然后,您可以加载您的驱动程序,然后测试您的驱动程序以模拟PCI设备。

希望这会有所帮助,

关于。

+0

感谢您的解释......它清楚了很多东西。现在我想我会删除所有对PCI子系统的调用。nvme驱动程序使用队列与PCI设备进行通信。我正在考虑将队列数据复制到用户空间,从那里触发模拟代码。请评论..并且请给我一个关于内核模块与用户空间程序通信的教程。 – hasanijaz

+0

你可以这样做来测试你的程序,(如果你只想与驱动程序交互)。我对nvme驱动没有任何经验,但一般所有驱动都会按照下面的模式 - [nvme-driver] <--- loads - [pci-driver] < - loads - [pci-总线驱动器] <----通知系统--- [设备]。箭头表示加载顺序。所以,如果您启用了一个fs驱动程序,我认为您必须将nvme-driver中使用的读/写功能短路(环回)。如果你只想从驱动程序获取数据,你可以使用netlink。我不确定你想使用哪条路径。希望这可以帮助 – fadedreamz

+0

谢谢这真的帮助... – hasanijaz