基礎命令學習目錄首頁html
最近常常用到 lspci -nn | grep Eth 命令,須要學習下PCI總線,找到一篇文章,雖然也是轉載,但寫的較清晰,再次轉載下。linux
http://blog.csdn.net/zhenhuakang/article/details/5463605數據庫
1、PCI簡介
PCI是一種外設總線規範。咱們先來看一下什麼是總線:總線是一種傳輸信號的路徑或信道。典型狀況是,總線是鏈接於一個或多個導體的電氣連線,總 線上鏈接的全部設備可在同一時間收到全部的傳輸內容。總線由電氣接口和編程接口組成。本文討論Linux 下的設備驅動,因此,重點關注編程接口。
PCI是Peripheral Component Interconnect(外圍設備互聯)的簡稱,是廣泛使用在桌面及更大型的計算機上的外 設總線。PCI架構被設計爲ISA標準的替代品,它有三個主要目標:得到在計算機和外設之間傳輸數據時更好的性能;儘量的平臺無關;簡化往系統中添加和 刪除外設的工做。
2、PCI尋址
從如今開始,我想盡量經過一些實際的例子來講明問題,而減小理論方面的問題的描述,由於,相關的理論的東西,能夠在其它地方找到。
咱們先來看一個例子,個人電腦裝有1G的RAM,1G之後的物理內存地址空間都是外部設備IO在系統內存地址空間上的映射。 /proc/iomem描述了系統中全部的設備I/O在內存地址空間上的映射。咱們來看地址從1G開始的第一個設備在/proc/iomem中是如何描述 的:
40000000-400003ff : 0000:00:1f.1
這是一個PCI設備,40000000-400003ff是它所映射的內存地址空間,佔據了內存地址空間的1024 bytes的位置,而 0000:00:1f.1則是一個PCI外設的地址,它以冒號和逗號分隔爲4個部分,第一個16位表示域,第二個8位表示一個總線編號,第三個5位表示一 個設備號,最後是3位,表示功能號。編程
由於PCI規範容許單個系統擁有高達256個總線,因此總線編號是8位。但對於大型系統而言,這是不夠的,因此,引入了域的概念,每一個 PCI域能夠擁有最多256個總線,每一個總線上可支持32個設備,因此設備號是5位,而每一個設備上最多可有8種功能,因此功能號是3位。由此,咱們能夠得 出上述的PCI設備的地址是0號域0號總線上的31號設備上的1號功能。bash
那上述的這個PCI設備究竟是什麼呢?下面是個人電腦上的lspci命令的輸出:
00:00.0 Host bridge: Intel Corporation 82845 845 (Brookdale) Chipset Host Bridge (rev 04)
00:01.0 PCI bridge: Intel Corporation 82845 845 (Brookdale) Chipset AGP Bridge(rev 04)
00:1d.0 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #1) (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #2) (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 42)
00:1f.0 ISA bridge: Intel Corporation 82801CAM ISA Bridge (LPC) (rev 02)
00:1f.1 IDE interface: Intel Corporation 82801CAM IDE U100 (rev 02)
00:1f.3 SMBus: Intel Corporation 82801CA/CAM SMBus Controller (rev 02)
00:1f.5 Multimedia audio controller:Intel Corporation 82801CA/CAM AC'97 Audio Controller (rev 02)
00:1f.6 Modem: Intel Corporation 82801CA/CAM AC'97 Modem Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 420 Go](rev a3)
02:00.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller(rev 46)
02:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+(rev 10)
02:04.0 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)
02:04.1 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)
lspci沒有標明域,但對於一臺PC而言,通常只有一個域,即0號域。經過這個輸出咱們能夠看到它是一個IDE interface。由上述的 輸出能夠看到,個人電腦上共有3個PCI總線(0號,1號,2號)。在單個系統上,插入多個總線是經過橋(bridge)來完成的,橋是一種用來鏈接總線 的特殊PCI外設。因此,PCI系統的總體佈局組織爲樹型,咱們能夠經過上面的lspci輸出,來畫出個人電腦上的PCI系統的樹型結構:
00:00.0(主橋)--00:01.0(PCI橋)-----01:00:0(nVidia顯卡)
|
|---00:1d(USB控制器)--00:1d:0(USB1號控制器)
| |
| |--00:1d:1(USB2號控制器) |
|-00:1e:0(PCI橋)--02:00.0(IEEE1394)
| |
| |-02:01.0(8139網卡)
| |
| |-02:04(CardBus橋)-02:04.0(橋1)
| |
| |--02:04.1(橋2)
|
|-00:1f(多功能板卡)-00:1f:0(ISA橋)
|
|--00:1f:1(IDE接口)
|
|--00:1f:3(SMBus)
|
|--00:1f:5(多媒體聲音控制器)
|
|--00:1f:6(調制解調器)
由上圖能夠得出,個人電腦上共有8個PCI設備,其中0號總線上(主橋)上連有4個,1號總線上連有1個,2號總線上連有3個。00:1f是一個連有5個功能的多功能板卡。
每個PCI設備都有它映射的內存地址空間和它的I/O區域,這點是比較容易理解的。除此以外,PCI設備還有它的配置寄存器。有了配置寄存器, PCI的驅動程序就不須要探測就能訪問設備。配置寄存器的佈局是標準化的,配置空間的4個字節含有一個獨一無二的功能ID,所以,驅動程序可經過查詢外設 的特定 ID來識別其設備。因此,PCI接口標準在ISA之上的主要創新在於配置地址空間。
前文已講過,PCI驅動程序不須要探測就能訪問設備,而這得益於配置地址空間。在系統引導階段,PCI硬件設備保持未激活狀態,但每一個PCI主板均配備有可以處理PCI的固件,固件經過讀寫PCI控制器中的寄存器,提供了對設備配置地址空間的訪問。
配置地址空間的前64字節是標準化的,它提供了廠商號,設備號,版本號等信息,惟一標識一個PCI設備。同時,它也提供了最多可多達6個的I/O 地址區域,每一個區域能夠是內存也能夠是I/O地址。這幾個I/O地址區域是驅動程序找到設備映射到內存和I/O空間的具體位置的惟一途徑。有了這兩點, PCI驅動程序就完成了至關於探測的功能。關於這64個字節的配置空間的詳細狀況,可參閱《Linux設備驅動程序第三版》P306,再也不詳述。
下面,咱們來看一下8139too網卡設備的配置空間的詳細狀況。在2.6內核的系統中,能夠在目錄/sys/bus/pci/drivers/ 下看到不少以PCI設備名命名的目錄,但不是說這些設備都存在於你的系統中。咱們進入8139too目錄,其中有一個以它的設備地址0000:02: 01.0命名的目錄。在這個目錄下能夠找到該網卡設備相關的不少信息。其中resource記錄了它的6個I/O地址區域。內容以下:
0x0000000000003400 0x00000000000034ff 0x0000000000000101
0x00000000e0000800 0x00000000e00008ff 0x0000000000000200
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
由該文件能夠看出,8139too設備使用了兩個I/O地址區域,第一個是它映射的I/O端口範圍,第二個是它映射的內存地址空間。關於這兩個值能夠在/proc/iomem和/proc/ioport中獲得驗證。架構
-[0000:00]-+-00.0
+-02.0
+-1d.0
+-1d.1
+-1d.2
+-1d.7
+-1e.0-[0000:01]--+-02.0
| /-05.0
+-1f.0
+-1f.1
+-1f.3
/-1f.5
00:00.0 Host bridge: Intel Corporation 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface (rev 03)
00:02.0 VGA compatible controller: Intel Corporation 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device (rev 03)
00:1d.0 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 82)
00:1f.0 ISA bridge: Intel Corporation 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge (rev 02)ide
(LPC Hub 控制器 1 )
00:1f.1 IDE interface: Intel Corporation 82801DB (ICH4) IDE Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (rev 02)
00:1f.5 Multimedia audio controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 02)
01:02.0 Communication controller: Conexant HSF 56k HSFi Modem (rev 01)
01:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)函數
lspci 是一個用來顯示系統中全部PCI總線設備或鏈接到該總線上的全部設備的工具。工具
AD:oop
PCI和PCI Express,是計算機常使用的一種高速總線。操做系統中的PCI/PCI-E設備驅動以及操做系統內核,都須要訪問PCI及PCI-E配置空間。PCI/PCI-E設備的正常運行,離不開PCI/PCI-E配置空間。
經過讀寫PCI/PCI-E配置空間,能夠更改設備運行參數,優化設備運行。本文介紹用戶空間能夠讀取、修改、掃描PCI/PCIE設備的用戶命令及使用。
在Linux內核中,爲PCI和PCI-E只適用了一種總線PCI(內核提供的總線系統),故訪問PCI-E配置空間,也包括了PCI設備配置空間
lspci 是一個用來顯示系統中全部PCI總線設備或鏈接到該總線上的全部設備的工具。
參數:
-v 使得 lspci 以冗餘模式顯示全部設備的詳細信息。 -vv 使得 lspci 以過冗餘模式顯示更詳細的信息 (事實上是 PCI 設備能給出的全部東西)。這些數據的確切意義沒有在此手冊頁中解釋,若是你想知道更多,請參照 /usr/include/linux/pci.h 或者 PCI 規範。 -n 以數字形式顯示 PCI 生產廠商和設備號,而不是在 PCI ID 數據庫中查找它們。 -x 以十六進制顯示 PCI 配置空間 (configuration space) 的前64個字節映像 (標準頭部信息)。此參數對調試驅動和 lspci 自己頗有用。 -xxx 以十六進制顯示全部 PCI 配置空間的映像。此選項只有 root 可用,而且不少 PCI 設備在你試圖讀取配置空間的未定義部分時會崩潰 (此操做可能不違反PCI標準,可是它至少很是愚蠢)。 -b 以總線爲中心進行查看。顯示全部 IRQ 號和記憶體地址,就像 PCI 總線上的卡看到的同樣,而不是核心看到的內容。 -t 以樹形方式顯示包含全部總線、橋、設備和它們的鏈接的圖表。 -s [[<bus>]:][<slot>][.[<func>]] 僅顯示指定總線、插槽上的設備或設備上的功能塊信息。設備地址的任何部分均可以忽略,或以「*」代替 (意味著全部值)。全部數字都是十六進制。例如:「0:」指的是在0號總線上的全部設備;「0」指的是在任意總線上0號設備的全部功能塊;「0.3」選擇 了全部總線上0號設備的第三個功能塊;「.4」則是隻列出每一設備上的第四個功能塊。 -d [<vendor>]:[<device>] 只顯示指定生產廠商和設備 ID 的設備。 這兩個 ID 都以十六進制表示,能夠忽略或者以「*」代替 (意味著全部值)。 -i <file> 使用 <file> 做爲 PCI ID 數據庫而不是使用預設的 /usr/share/hwdata/pci.ids。 -p <dir> 使用 <dir> 做爲包含 PCI 總線信息的目錄而不是使用預設的目錄 /proc/bus/pci。 -m 以機器可讀的方式轉儲 PCI 設備數據 (支持兩種模式:普通和冗餘),便於稿本解析。 -M 使用總線映射模式,這種模式對總線進行全面地掃描以查明總線上的全部設備,包括配置錯誤的橋以後的設備。請注意,此操做只應在調試時使 用,並可能形成系統崩潰 (只在設備有錯誤的時候,可是不幸的是它們存在),此命令只有 root 可使用。同時,在不直接接觸硬體的 PCI 訪問模式中使用 -M 參數沒有意義,由於顯示的結果 (排除 lspci 中的 bug 的影響) 與普通的列表模式相同。 --version 顯示 lspci 的版本。這個選項應當單獨使用。 PCILIB 選項 PCILIB OPTIONS PCI 工具使用 PCILIB (一種可移植的庫,提供平臺獨立的函數來訪問 PCI 配置空間)來和PCI卡交互。下面的選項用來控制庫參數,特別是所用訪問模式的指定。預設狀況下,PCILIB 使用第一種可用的訪問模式,不會顯示任何調試信息。每個開關選項都列出了一組它所支持的硬件/軟軟件列表。 -P <dir> 使用 linux 2.1 風格的配置,直接訪問目錄 <dir> 而非 /proc/bus/pci 目錄。(只能在linux 2.1或以上版本中使用)