3

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

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

现在我在互联网上进行了大量研究以了解如何模拟 PCI 设备,如 安装 PCI 驱动程序而不连接到设备在 linux 上模拟PCI 设备等帖子 我不知道如何将填充的 struct pci_dev 返回到中nvme_probe()的函数调用pci_set_drvdata(pdev, dev);

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

4

1 回答 1

1

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

因为在 module_init() 中,当系统中存在某个设备(通过 id_table)时,您告诉内核的PCI SUBSYSTEM加载操作处理程序(又名 - 通过函数指针的回调)。

因此,每当您安装模块时,内核的PCI SUBSYTEM就会知道只要将匹配 vid/pid 的设备插入 PCIe 插槽就加载您的驱动程序。操作如下 -

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

我不确定任何会导致PCI SUBSYTEM始终加载驱动程序的魔术 VID/PID 编号。

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

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

希望这可以帮助,

问候。

于 2012-12-08T18:02:50.807 回答