linux下遍歷所有pci裝置

2021-06-04 06:11:24 字數 1013 閱讀 4380

在linux中,每乙個pci裝置都有乙個相應的結構體叫pci_dev,它用來記錄pci裝置的一些匯流排,配置資訊等等。所以要遍歷所有的pci裝置就相當於遍歷pci_dev結構體,程式只是遍歷pci的一種手段,而pci在計算機中是如何架構的,pci和pci之間有什麼關聯,才是遍歷所有pci裝置的精髓。

很多個pci裝置都是串在pci匯流排上,而這些匯流排又分為一級匯流排,二級匯流排,等等。二級匯流排是所屬一級匯流排的,也就是說匯流排下有若干個pci裝置和若干個pci匯流排,它之下匯流排又有pci裝置,pci匯流排在linux下對應的結構體是pci_bus,對應關係大概如下如

這樣的話,如果遍歷所有的pci_dev只需要找到根匯流排,然後運用搜尋演算法就可以遍歷所有的pci裝置了。

這副圖包含所有說明,pci_root_buses是乙個list結構體(相關list結構體,可以找一些linux方面的書了解),所有的pci_bus都掛在pci_root_buses上,這樣就能遍歷所有一級匯流排,而pci_bus結構體中的children欄位又可以訪問下層匯流排,dev欄位訪問所有的pci_dev結構體,這樣就完全解決了遍歷所有pci裝置的方法。(ps.這裡還涉及一些pci橋的東西,由於我沒有深入了解,所以可能沒有遍歷所有,但是通過這兩個結構體的一些其他字段,用這個方法就可以解決)。下面是經過我測試的**:

static void searchpcibus(struct list_head *tobus)

if(tobus->next==&tobus)

list_for_each(list,tobus)

list_for_each(list_pci_dev,&bus->devices)

if(bus->children.next!=&bus->children)

} }}

在程式中,只要searchpcibus(&pci_root_buses);就可以了。程式中我是用遞迴來實現搜尋,思想就是上面那張圖,很容易理解。

ps.  對linux和硬體了解不多,如果上面有什麼錯誤的地方,大家不要見怪,向大家多學習了

遍歷PCI裝置

pc機在啟動的時候,都會看到乙個pci裝置清單,可以看到機器中的所有pci裝置,其實搜尋pci裝置的程式並不難編,本文通過乙個例項說明如何遍歷pci裝置。工作環境 ms dos 6.22,djgpp rhide 1 了解pci裝置 pci的含義是外設部件互連 peripheral component...

遍歷PCI裝置

原文 該文在2011年3月11日做過修改,其中 已為完整 pc機在啟動的時候,都會看到乙個pci裝置清單,可以看到機器中的所有pci裝置,其實搜尋pci裝置的程式並不難編,本文通過乙個例項說明如何遍歷pci裝置。工作環境 ms dos 6.22,djgpp rhide 1 了解pci裝置 pci的含...

Linux 檢視PCI裝置命令 lspci

vv 比 v 還要更詳細的資訊 n 直接觀察 pci 的 id 而不是廠商名稱 lspci vlspci s 04 00.0 vv 或 lspci n d 8086 3002 vvv vv 使得 lspci 以過冗餘模式顯示更詳細的資訊 事實上是 pci 裝置能給出的所有東西 這些資料的確切意義沒有...