Linux

Linux 使用者空間 PCI 驅動程序選項?(uio_pci_generic)

  • August 12, 2015

我在 PCI 匯流排上有一個 Xilinx FPGA PCIe 端點。Linux 很好地拾取了設備,lspci 中的一切看起來都很完美。

我的問題是關於使用者空間的 PCI 訪問選項以及什麼是好/壞。

選項 1:通過 /sys/…/resource0 直接訪問

(到目前為止,我只有一個成功的工作)

我可以打開並 mmap 說 /sys/bus/pci/devices/XXXX:XX:XX.X/resource0 然後 mmap 並讀/寫。只需要先修復權限。我的問題是,這是一個好方法還是壞方法?感覺這可能不是訪問 PCI 地址空間的首選方法?

選項 2:使用 uio_pci_generic

我已經設法配置我的 FPGA,以便這個驅動程序真正連接,它需要中斷的事實真的很煩人。似乎這可以訪問任何接受中斷和配置記憶體空間?這對我來說似乎不是很有用?我錯過了什麼嗎?

選項 3:編寫我自己的 uio 驅動程序

這可能是一個合理的選擇?我不確定這有多難。這樣做的一個可能的好處是我可以訪問 DMA 並因此加快速度。

選項 4:編寫完全自定義的 linux PCI 驅動程序

如果可能的話,我想避免這個選項

我的問題是什麼是最好的方法,以及選項 1 的缺點是什麼。或者我應該考慮其他方法嗎?

(我正在執行核心 3.14.15 rt 修補的 debian)

選項 1(通過 /sys/…/resource0 直接訪問)

適合測試,功能上沒有問題,雖然不能做任何高級的事情,也沒有驅動層抽象。由於使用者程序與 sysfs 互動的方式,我發現這種方法很討厭,但這可能是我個人的看法。

選項 2(使用 uio_pci_generic)

我不知道 uio_pci_generic 做了什麼,但它似乎除了允許您的使用者程序訪問 pci 遺留中斷之外幾乎沒有添加任何功能。這是不好的,因為無論如何首選MSI。

選項 3(自定義 uio 驅動程序)

我沒有嘗試過,但我懷疑與選項 4 相比有點浪費時間

選項 4(自定義核心驅動程序)

這確實是最好的解決方案,也是正確做事的唯一方法。您需要一個驅動程序才能正確處理諸如 DMA 和 MSI 之類的事情,並能夠通過字元設備提供任意數量的抽象。然而,有大量關於如何線上為 PCI 卡編寫驅動程序的文件,並且核心為管理事物提供了很多支持。

引用自:https://unix.stackexchange.com/questions/219920