2014-06-05 111 views
3

我已經完成了在Linux下的FPGA開發FPGA的pcie驅動程序。一切正常。但是我想知道FPGA的PCI端點中的基址寄存器在哪裏得到基地址。當我生成PCIe端點時,我可以設置BAR的長度,但不能更多。基地址寄存器如何獲取地址?

在PCIe驅動程序我做的標準功能,如pci_enable_device,但我不設立專門的基址。

如此做操作系統設定開機時的基地址?或者它是如何工作的? 旁邊,我想知道如果連接一個pcie pcie設備,操作系統一般會做什麼初始化。由於我確實在lspci中看到了我的pci設備,即使驅動程序已卸載。

親切的問候 托馬斯

回答

0

在大多數消費級電腦,BAR分配似乎在BIOS中進行。

我想,在一個熱插拔能力架構這是一定要做或操作系統至少觸發。

1

的PCI設備的地址分配在BIOS級別一般都做。讓我們參考x86平臺。如果我們的系統地址映射仔細一看,它會是這樣(圖片由Darmawan Salihun從BIOS拆卸忍術,採取)

在地址映射,有一個專門的空間來映射PCI內存區域。使用/proc/iomem的輸出可以複製相同的結果。

這個實現是與平臺相關的,並且在BIOS「知道」的平臺,這將預留專用的PCI插槽的地址。當設備插入插槽時,BIOS將與設備上的固件進行交互,並實際設置設備的內存區域,以便操作系統可以使用它。

現在來到驅動程序部分。在Linux中,驅動程序遵循構成核心層(PCI核心),主控制器驅動程序(PCI控制器/主設備)和客戶端驅動程序(PCI設備)的稱爲「Linux設備模型」的特定標準。當PCI設備(客戶端)插入插槽時,相應的主控制器知道附件,並進一步通知PCI核心,因此出現在lspci的輸出中。

lspci示出了由主控制器所識別的設備,在這種情況下,它可以或者可以不被綁定到的驅動器。內核進一步遍歷系統中的驅動程序,找到匹配的驅動程序,並附加到該設備。

因此,您在lspci的輸出中看到設備的原因是因爲主控制器已識別設備並已通知PCI內核。即使有任何驅動程序連接到設備也沒關係。