2012-12-07 102 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