深入PCI與PCIe之一:硬件篇

最近在學習驅動開發過程中涉及到PCI相關知識,在網上看了很多文章,良莠不齊,我總結一下比較好的文章分享給大家,那就從源頭開始說起。


PCI總線和設備樹是X86硬件體系內很重要的組成部分,幾乎所有的外圍硬件都以這樣或那樣的形式連接到PCI設備樹上。雖然Intel爲了方便各種IP的接入而提出IOSF總線,但是其主體接口(primary interface)還依然是PCIe形式。我們下面分成兩部分介紹PCI和他的繼承者PCIe(PCI express):第一部分是歷史沿革和硬件架構;第二部分是軟件界面和UEFI中的PCI/PCe。

自PC在1981年被IBM發明以來,主板上都有擴展槽用於擴充計算機功能。現在最常見的擴展槽是PCIe插槽,實際上在你看不見的計算機主板芯片內部,各種硬件控制模塊大部分也是以PCIe設備的形式掛載到了一顆或者幾顆PCI/PCIe設備樹上。固件和操作系統正是通過枚舉設備樹們才能發現絕大多數即插即用(PNP)設備的。那究竟什麼是PCI呢?

PCI/PCIe的歷史

在我們看PCIe是什麼之前,我們應該要了解一下PCIe的祖先們,這樣我們才能對PCIe的一些設計有了更深刻的理解,並感嘆計算機技術的飛速發展和工程師們的不懈努力。

1. ISA (Industry Standard Architecture)

2. MCA (Micro Channel Architecture)

3. EISA (Extended Industry Standard Architecture)

4. VLB (VESA Local Bus)

5. PCI (Peripheral Component Interconnect)

6. PCI-X (Peripheral Component Interconnect eXtended)

7. AGP (Accelerated Graphics Port)

8. PCI Express (Peripheral Component Interconnect Express)

科技的每一步前進都是爲了解決前一代中出現的問題,這裏的問題就是速度。作爲擴展接口,它主要用於外圍設備的連接和擴展,而外圍設備吞吐速度的提高,往往會倒推接口速度的提升。第一代ISA插槽出現在第一代IBM PC XT機型上(1981),作爲現代PC的盤古之作,8位的ISA提供了4.77MB/s的帶寬(或傳輸率)。到了1984年,IBM就在PC AT上將帶寬提高了幾乎一倍,16位ISA第二代提供了8MB/s的傳輸率。但其對傳輸像圖像這種數據來說還是杯水車薪。

IBM自作聰明在PS/2產品線上引入了MCA總線,迫使其他幾家PC兼容機廠商聯合起來搗鼓出來EISA。因爲兩者都期待兼容ISA,導致速度沒有多大提升。真正的高速總線始於VLB,它綁定自己的頻率到了當時486 CPU內部總線頻率:33MHz。而到了奔騰時代,內部總線提高到了66MHz,給VLB帶來了嚴重的兼容問題,造成致命一擊。

Intel在1992年提出PCI(Peripheral Component Interconnect)總線協議,並召集其它的小夥伴組成了名爲 PCI-SIG (PCI Special Interest Group)(PCI 特殊興趣組J)的企業聯盟。從那以後這個組織就負責PCI和其繼承者們(PCI-X和PCIe的標準制定和推廣。

不得不點贊下這種開放的行爲,相對IBM當時的封閉,合作共贏的心態使得PCI標準得以廣泛推廣和使用。有似天雷勾動地火,統一的標準撩撥起了外圍設備製造商的創新,從那以後各種各樣的PCI設備應運而生,豐富了PC的整個生態環境。

PCI總線標準初試啼聲就提供了133MB/s的帶寬(33MHz時鐘,每時鐘傳送32bit)。這對當時一般的臺式機已經是超高速了,但對於服務器或者視頻來說還是不夠。於是AGP被髮明出來專門連接北橋與顯卡,而爲服務器則提出PCI-X來連接高速設備。

2004年,Intel再一次帶領小夥伴革了PCI的命。PCI express(PCIe,注意官方寫法是這樣,而不是PCIE或者PCI-E)誕生了,其後又經歷了兩代,現在是第三代(gen3,3.0),gen4有望在2017年公佈,而gen5已經開始起草中。

下面這個大表列出所有的速度比較。其中一些x8,x16的概念後面細節部分有介紹。


從下面的主頻變化圖中,大家可能注意到更新速度越來越快。


PCI和PCIe架構

1。PCI架構

一個典型的桌面系統PCI架構如下圖:


如圖,桌面系統一般只有一個Host Bridge用於隔離處理器系統的存儲器域與PCI總線域,並完成處理器與PCI設備間的數據交換。每個Host Bridge單獨管理獨立的總線空間,包括PCI Bus, PCI I/O, PCI Memory, and PCI
Prefetchable Memory Space。桌面系統也一般只有一個Root Bridge,每個Root Bridge管理一個Local Bus空間,它下面掛載了一顆PCI總線樹,在同一顆PCI總線樹上的所有PCI設備屬於同一個PCI總線域。一顆典型的PCI總線樹如圖:


從圖中我們可以看出 PCI 總線主要被分成三部分:

1. PCI 設備。符合 PCI 總線標準的設備就被稱爲 PCI 設備,PCI 總線架構中可以包含多個 PCI 設備。圖中的 Audio、LAN 都是一個 PCI 設備。PCI 設備同時也分爲主設備和目標設備兩種,主設備是一次訪問操作的發起者,而目標設備則是被訪問者。

2. PCI 總線。PCI 總線在系統中可以有多條,類似於樹狀結構進行擴展,每條 PCI 總線都可以連接多個 PCI 設備/橋。上圖中有兩條 PCI 總線。

3. PCI 橋。當一條 PCI 總線的承載量不夠時,可以用新的 PCI 總線進行擴展,而 PCI 橋則是連接 PCI 總線之間的紐帶。

服務器的情況要複雜一點,舉個例子,如Intel志強第三代四路服務器,共四顆CPU,每個CPU都被劃分了共享但區隔的Bus, PCI I/O, PCI Memory範圍,其構成可以表示成如下圖:


可以看出,只有一個Host Bridge,但有四個Root Bridge,管理了四顆單獨的PCI樹,樹之間共享Bus等等PCI空間。

在某些時候,當服務器連接入大量的PCI bridge或者PCIe設備後,Bus數目很快就入不敷出了,這時就需要引入Segment的概念,擴展PCI Bus的數目。如下例:


如圖,我們就有了兩個Segment,每個Segment有自己的bus空間,這樣我們就有了512個Bus數可以分配,但其他PCI空間因爲只有一個Host Bridge所以是共享的。會不會有更復雜的情況呢? 在某些大型服務器上,會有多個Host bridge的情況出現,這裏我們就不展開了。

PCI標準有什麼特點嗎?

1. 它是個並行總線。在一個時鐘週期內32個bit(後擴展到64)同時被傳輸。引腳定義如下:


地址和數據在一個時鐘週期內按照協議,分別一次被傳輸。

2. PCI空間與處理器空間隔離。PCI設備具有獨立的地址空間,即PCI總線地址空間,該空間與存儲器地址空間通過Host bridge隔離。處理器需要通過Host bridge才能訪問PCI設備,而PCI設備需要通過Host bridge才能主存儲器。在Host bridge中含有許多緩衝,這些緩衝使得處理器總線與PCI總線工作在各自的時鐘頻率中,彼此互不干擾。Host bridge的存在也使得PCI設備和處理器可以方便地共享主存儲器資源。處理器訪問PCI設備時,必須通過Host bridge進行地址轉換;而PCI設備訪問主存儲器時,也需要通過Host bridge進行地址轉換。

深入理解PCI空間與處理器空間的不同是理解和使用PCI的基礎。

3.擴展性強。PCI總線具有很強的擴展性。在PCI總線中,Root Bridge可以直接連出一條PCI總線,這條總線也是該Root bridge所管理的第一條PCI總線,該總線還可以通過PCI橋擴展出一系列PCI總線,並以Root bridge爲根節點,形成1顆PCI總線樹。在同一條PCI總線上的設備間可以直接通信,並不會影響其他PCI總線上設備間的數據通信。隸屬於同一顆PCI總線樹上的PCI設備,也可以直接通信,但是需要通過PCI橋進行數據轉發。

2。PCIe架構

PCI後期越來越不能適應高速發展的數據傳輸需求,PCI-X和AGP走了兩條略有不同的路徑,PCI-x不斷提高時鐘頻率,而AGP通過在一個時鐘週期內傳輸多次數據來提速。隨着頻率的提高,PCI並行傳輸遇到了干擾的問題:高速傳輸的時候,並行的連線直接干擾異常嚴重,而且隨着頻率的提高,干擾(EMI)越來越不可跨越。

亂入一個話題,經常有朋友問我爲什麼現在越來越多的通訊協議改成串行了,SATA/SAS,PCIe,USB,QPI等等,經典理論不是並行快嗎?一次傳輸多個bit不是效率更高嗎?從PCI到PCIe的歷程我們可以一窺原因。

PCIe和PCI最大的改變是由並行改爲串行,通過使用差分信號傳輸(differential transmission),如圖


相同內容通過一正一反鏡像傳輸,干擾可以很快被發現和糾正,從而可以將傳輸頻率大幅提升。加上PCI原來基本是半雙工的(地址/數據線太多,不得不復用線路),而串行可以全雙工。綜合下來,如果如果我們從頻率提高下來得到的收益大於一次傳輸多個bit的收益,這個選擇就是合理的。我們做個簡單的計算:

PCI傳輸: 33MHz x 4B = 133MB/s

PCIe 1.0 x1: 2.5GHz x 1b = 250MB/s (知道爲什麼不是2500M / 8=312.5MB嗎?)

速度快了一倍!我們還得到了另外的好處,例如佈線簡單,線路可以加長(甚至變成線纜連出機箱!),多個lane還可以整合成爲更高帶寬的線路等等。

PCIe還在很多方面和PCI有很大不同:

1. PCI是總線結構,而PCIe是點對點結構。一個典型的PCIe系統框圖如下:


一個典型的結構是一個root port和一個endpoint直接組成一個點對點連接對,而Switch可以同時連接幾個endpoint。一個root port和一個endpoint對就需要一個單獨的PCI bus。而PCI是在同一個總線上的設備共享同一個bus number。過去主板上的PCI插槽都公用一個PCI bus,而現在的PCIe插槽卻連在芯片組不同的root port上。

2. PCIe的連線是由不同的lane來連接的,這些lane可以合在一起提供更高的帶寬。譬如兩個1lane可以合成2lane的連接,寫作x2。兩個x2可以變成x4,最大直到x16,往往給帶寬需求最大的顯卡使用。

3. PCI配置空間從256B擴展爲4k,同時提供了PCIe memory map訪問方式,我們在軟件部分會詳細介紹。

4.PCIe提供了很多特殊功能,如Complete Timeout(CTO),MaxPayload等等幾十個特性,而且還在隨着PCIe版本的進化不斷增加中,對電源管理也提出了單獨的State(L0/L0s/L1等等)。這些請參見PCIe 3.0 spec,本文不再詳述。

5. 其他VC的內容,和固件理解無關,本文不再提及。INT到MSI的部分會在將來介紹PC中斷系統時詳細講解。


PCIe 1.0和2.0採用了8b/10b編碼方式,這意味着每個字節(8b)都用10bit傳輸,這就是爲什麼2.5GHz和5GHz時鐘,每時鐘1b數據,結果不是312.5MB/s和625MB/s而是250MB/s和500MB/s。PCIe 3.0和4.0採用128b/130b編碼,減小了浪費(overhead),所以才能在8GHz時鐘下帶寬達到1000MB/s(而不是800MB/s)。即將於今年發佈的PCIe 4.0還會將頻率提高一倍,達到16GHz,帶寬達到2GB/s每Lane。


後記

對於一般用戶來說,PCIe對用戶可見的部分就是主板上大大小小的PCIe插槽了,有時還和PCI插槽混在一起,造成了一定的混亂,其實也很好區分:


如圖,PCI插槽都是等長的,防呆口位置靠上,大部分都是純白色。PCIe插槽大大小小,最小的x1,最大的x16,防呆口靠下。各種PCIe插槽大小如下:


常見問題

Q:我主板上沒有x1的插槽,我x1的串口卡能不能插在x4的插槽裏。

A: 可以,完全沒有問題。除了有點浪費外,串口卡也將已x1的方式工作。

Q:我主板上只有一個x16的插槽,被我的顯卡佔據了。我還有個x16的RAID卡可以插在x8的插槽內嗎?

A: 你也許會驚訝,但我的答案同樣是:可以!你的RAID卡將以x8的方式工作。實際上來說,你可以將任何PCIe卡插入任何PCIe插槽中! PCIe在鏈接training的時候會動態調整出雙方都可以接受的寬度。最後還有個小問題,你根本插不進去!呵呵,有些主板廠商會把PCIe插槽尾部開口,方便這種行爲,不過很多情況下沒有。這時怎麼辦?你懂的。。。。

Q: 我的顯卡是PCIe 3.0的,主板是PCIe2.0的,能工作嗎?

A: 可以,會以2.0工作。反之,亦然。

Q: 我把x16的顯卡插在主板上最長的x16插槽中,可是benchmark下來卻說跑在x8下,怎麼回事?!

A: 主板插槽x16不見得就連在支持x16的root port上,最好詳細看看主板說明書,有些主板實際上是x8。有個主板原理圖就更方便了。

Q: 我新買的SSD是Mini PCIe的,Mini PCIe是什麼鬼?

A: Mini PCIe接口常見於筆記本中,爲54pin的插槽。多用於連接wifi網卡和SSD,注意不要和mSATA弄混了,兩者完全可以互插,但大多數情況下不能混用(除了少數主板做了特殊處理),主板設計中的防呆設計到哪裏去了!請仔細閱讀主板說明書。另外也要小心不要和m.2(NGFF)搞混了,好在卡槽大小不一樣。





轉自;https://zhuanlan.zhihu.com/p/26172972

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章