【问题标题】:Interfacing a linux device driver with dummy PCI device将 linux 设备驱动程序与虚拟 PCI 设备连接
【发布时间】:2012-11-25 12:04:19
【问题描述】:

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

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

现在我在互联网上研究了很多,以了解如何模拟 PCI 设备,例如 Installing PCI driver without connection to device, emulating a PCI device on linux 我不知道如何将填充的 struct pci_dev 返回到nvme_probe() ofpci_set_drvdata(pdev, dev); 中的函数调用

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    希望这会有所帮助,

    问候。

    【讨论】:

    • 感谢您的解释......它确实清楚了很多事情。现在我想我将删除对 PCI 子系统的所有调用。 nvme 驱动程序使用队列与 PCI 设备进行通信。我正在考虑将队列数据复制到将触发模拟代码的用户空间。请发表评论.. 并给我发一份关于内核模块与用户空间程序通信的教程。
    • 您可以这样做来测试您的程序,(如果您只想与驱动程序交互)。我对 nvme 驱动程序没有任何经验,但通常所有驱动程序都会遵循以下模式 - [nvme-driver]
    • 这个答案还成立吗?使用较新的内核对此有何更改?是否有任何选项可以模拟没有硬件的 PCIe 设备?
    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多