自PC在1981年被IBM發明以來,主板上都有擴展槽用于擴充計算機功能?,F在最常見的擴展槽是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,防呆口靠下。
常見問題 :
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)搞混了,好在卡槽大小不一樣。
評論
查看更多