自PC在1981年被IBM發(fā)明以來,主板上都有擴(kuò)展槽用于擴(kuò)充計(jì)算機(jī)功能?,F(xiàn)在最常見的擴(kuò)展槽是PCIe插槽,實(shí)際上在你看不見的計(jì)算機(jī)主板芯片內(nèi)部,各種硬件控制模塊大部分也是以PCIe設(shè)備的形式掛載到了一顆或者幾顆PCI/PCIe設(shè)備樹上。固件和操作系統(tǒng)正是通過枚舉設(shè)備樹們才能發(fā)現(xiàn)絕大多數(shù)即插即用(PNP)設(shè)備的。那究竟什么是PCI呢?
PCI/PCIe的歷史
在我們看PCIe是什么之前,我們應(yīng)該要了解一下PCIe的祖先們,這樣我們才能對PCIe的一些設(shè)計(jì)有了更深刻的理解,并感嘆計(jì)算機(jī)技術(shù)的飛速發(fā)展和工程師們的不懈努力。
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)
科技的每一步前進(jìn)都是為了解決前一代中出現(xiàn)的問題,這里的問題就是速度。作為擴(kuò)展接口,它主要用于外圍設(shè)備的連接和擴(kuò)展,而外圍設(shè)備吞吐速度的提高,往往會倒推接口速度的提升。第一代ISA插槽出現(xiàn)在第一代IBM PC XT機(jī)型上( 1981 ),作為現(xiàn)代PC的盤古之作,8位的ISA提供了4.77MB/s的帶寬(或傳輸率)。到了1984年,IBM就在PC AT上將帶寬提高了幾乎一倍,16位ISA第二代提供了8MB/s的傳輸率。但其對傳輸像圖像這種數(shù)據(jù)來說還是杯水車薪。
IBM自作聰明在PS/2產(chǎn)品線上引入了MCA總線,迫使其他幾家PC兼容機(jī)廠商聯(lián)合起來搗鼓出來EISA。因?yàn)閮烧叨计诖嫒軮SA,導(dǎo)致速度沒有多大提升。真正的高速總線始于VLB,它綁定自己的頻率到了當(dāng)時486 CPU內(nèi)部總線頻率:33MHz。而到了奔騰時代,內(nèi)部總線提高到了66MHz,給VLB帶來了嚴(yán)重的兼容問題,造成致命一擊。
Intel在1992年提出PCI(Peripheral Component Interconnect)總線協(xié)議,并召集其它的小伙伴組成了名為 PCI-SIG (PCI Special Interest Group)(PCI 特殊興趣組J)的企業(yè)聯(lián)盟。從那以后這個組織就負(fù)責(zé)PCI和其繼承者們(PCI-X和PCIe的標(biāo)準(zhǔn)制定和推廣。
不得不點(diǎn)贊下這種開放的行為,相對IBM當(dāng)時的封閉,合作共贏的心態(tài)使得PCI標(biāo)準(zhǔn)得以廣泛推廣和使用。有似天雷勾動地火,統(tǒng)一的標(biāo)準(zhǔn)撩撥起了外圍設(shè)備制造商的創(chuàng)新,從那以后各種各樣的PCI設(shè)備應(yīng)運(yùn)而生,豐富了PC的整個生態(tài)環(huán)境。
PCI總線標(biāo)準(zhǔn)初試啼聲就提供了133MB/s的帶寬(33MHz時鐘,每時鐘傳送32bit)。這對當(dāng)時一般的臺式機(jī)已經(jīng)是超高速了,但對于服務(wù)器或者視頻來說還是不夠。于是AGP被發(fā)明出來專門連接北橋與顯卡,而為服務(wù)器則提出PCI-X來連接高速設(shè)備。
2004年,Intel再一次帶領(lǐng)小伙伴革了PCI的命。PCI express(PCIe,注意官方寫法是這樣,而不是PCIE或者PCI-E)誕生了,其后又經(jīng)歷了兩代,現(xiàn)在是第三代(gen3,3.0),gen4有望在2017年公布,而gen5已經(jīng)開始起草中。
下面這個大表列出所有的速度比較。其中一些x8,x16的概念后面細(xì)節(jié)部分有介紹。
從下面的主頻變化圖中,大家可能注意到更新速度越來越快。
PCI和PCIe架構(gòu)
1
PCI架構(gòu)
一個典型的桌面系統(tǒng)PCI架構(gòu)如下圖:
如圖,桌面系統(tǒng)一般只有一個Host Bridge用于隔離處理器系統(tǒng)的存儲器域與PCI總線域,并完成處理器與PCI設(shè)備間的數(shù)據(jù)交換。每個Host Bridge單獨(dú)管理獨(dú)立的總線空間,包括PCI Bus, PCI I/O, PCI Memory, and PCI
Prefetchable Memory Space。桌面系統(tǒng)也一般只有一個Root Bridge,每個Root Bridge管理一個Local Bus空間,它下面掛載了一顆PCI總線樹,在同一顆PCI總線樹上的所有PCI設(shè)備屬于同一個PCI總線域。一顆典型的PCI總線樹如圖:
從圖中我們可以看出 PCI 總線主要被分成三部分:
1. PCI 設(shè)備 。符合 PCI 總線標(biāo)準(zhǔn)的設(shè)備就被稱為 PCI 設(shè)備,PCI 總線架構(gòu)中可以包含多個 PCI 設(shè)備。圖中的 Audio、LAN 都是一個 PCI 設(shè)備。PCI 設(shè)備同時也分為主設(shè)備和目標(biāo)設(shè)備兩種,主設(shè)備是一次訪問操作的發(fā)起者,而目標(biāo)設(shè)備則是被訪問者。
2. PCI 總線 。PCI 總線在系統(tǒng)中可以有多條,類似于樹狀結(jié)構(gòu)進(jìn)行擴(kuò)展,每條 PCI 總線都可以連接多個 PCI 設(shè)備/橋。上圖中有兩條 PCI 總線。
3. PCI 橋 。當(dāng)一條 PCI 總線的承載量不夠時,可以用新的 PCI 總線進(jìn)行擴(kuò)展,而 PCI 橋則是連接 PCI 總線之間的紐帶。
服務(wù)器的情況要復(fù)雜一點(diǎn),舉個例子,如Intel志強(qiáng)第三代四路服務(wù)器,共四顆CPU,每個CPU都被劃分了共享但區(qū)隔的Bus, PCI I/O, PCI Memory范圍,其構(gòu)成可以表示成如下圖:
可以看出,只有一個Host Bridge,但有四個Root Bridge,管理了四顆單獨(dú)的PCI樹,樹之間共享Bus等等PCI空間。
在某些時候,當(dāng)服務(wù)器連接入大量的PCI bridge或者PCIe設(shè)備后,Bus數(shù)目很快就入不敷出了,這時就需要引入Segment的概念,擴(kuò)展PCI Bus的數(shù)目。如下例:
如圖,我們就有了兩個Segment,每個Segment有自己的bus空間,這樣我們就有了512個Bus數(shù)可以分配,但其他PCI空間因?yàn)橹挥幸粋€Host Bridge所以是共享的。會不會有更復(fù)雜的情況呢? 在某些大型服務(wù)器上,會有多個Host bridge的情況出現(xiàn),這里我們就不展開了。
PCI標(biāo)準(zhǔn)有什么特點(diǎn)嗎?
1. 它是個并行總線 。在一個時鐘周期內(nèi)32個bit(后擴(kuò)展到64)同時被傳輸。引腳定義如下:
地址和數(shù)據(jù)在一個時鐘周期內(nèi)按照協(xié)議,分別一次被傳輸。
2. PCI空間與處理器空間隔離。 PCI設(shè)備具有獨(dú)立的地址空間,即PCI總線地址空間,該空間與存儲器地址空間通過Host bridge隔離。處理器需要通過Host bridge才能訪問PCI設(shè)備,而PCI設(shè)備需要通過Host bridge才能主存儲器。在Host bridge中含有許多緩沖,這些緩沖使得處理器總線與PCI總線工作在各自的時鐘頻率中,彼此互不干擾。Host bridge的存在也使得PCI設(shè)備和處理器可以方便地共享主存儲器資源。處理器訪問PCI設(shè)備時,必須通過Host bridge進(jìn)行地址轉(zhuǎn)換;而PCI設(shè)備訪問主存儲器時,也需要通過Host bridge進(jìn)行地址轉(zhuǎn)換。
深入理解PCI空間與處理器空間的不同是理解和使用PCI的基礎(chǔ)。
3.擴(kuò)展性強(qiáng)。 PCI總線具有很強(qiáng)的擴(kuò)展性。在PCI總線中,Root Bridge可以直接連出一條PCI總線,這條總線也是該Root bridge所管理的第一條PCI總線,該總線還可以通過PCI橋擴(kuò)展出一系列PCI總線,并以Root bridge為根節(jié)點(diǎn),形成1顆PCI總線樹。在同一條PCI總線上的設(shè)備間可以直接通信,并不會影響其他PCI總線上設(shè)備間的數(shù)據(jù)通信。隸屬于同一顆PCI總線樹上的PCI設(shè)備,也可以直接通信,但是需要通過PCI橋進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)。
2
PCIe架構(gòu)
PCI后期越來越不能適應(yīng)高速發(fā)展的數(shù)據(jù)傳輸需求,PCI-X和AGP走了兩條略有不同的路徑,PCI-x不斷提高時鐘周期,而AGP通過在一個時鐘周期內(nèi)傳輸多次數(shù)據(jù)來提速。隨著頻率的提高,PCI并行傳輸遇到了干擾的問題:高速傳輸?shù)臅r候,并行的連線直接干擾異常嚴(yán)重,而且隨著頻率的提高,干擾(EMI)越來越不可跨越。
亂入一個話題,經(jīng)常有朋友問我為什么現(xiàn)在越來越多的通訊協(xié)議改成串行了,SATA/SAS,PCIe,USB,QPI等等,經(jīng)典理論不是并行快嗎?一次傳輸多個bit不是效率更高嗎?從PCI到PCIe的歷程我們可以一窺原因。
PCIe和PCI最大的改變是由并行改為串行,通過使用差分信號傳輸(differential transmission),如圖
相同內(nèi)容通過一正一反鏡像傳輸,干擾可以很快被發(fā)現(xiàn)和糾正,從而可以將傳輸頻率大幅提升。加上PCI原來基本是半雙工的(地址/數(shù)據(jù)線太多,不得不復(fù)用線路),而串行可以全雙工。綜合下來,如果如果我們從頻率提高下來得到的收益大于一次傳輸多個bit的收益,這個選擇就是合理的。我們做個簡單的計(jì)算:
**PCI傳輸: **33MHz x 4B = 133MB/s
**PCIe 1.0 x1: ** 2.5GHz x 1b = 250MB/s (知道為什么不是2500M / 8=312.5MB嗎?)
速度快了一倍!我們還得到了另外的好處,例如布線簡單,線路可以加長(甚至變成線纜連出機(jī)箱?。?,多個lane還可以整合成為更高帶寬的線路等等。
PCIe還在很多方面和PCI有很大不同:
1. PCI是總線結(jié)構(gòu),而PCIe是點(diǎn)對點(diǎn)結(jié)構(gòu) 。一個典型的PCIe系統(tǒng)框圖如下:
一個典型的結(jié)構(gòu)是一個root port和一個endpoint直接組成一個點(diǎn)對點(diǎn)連接對,而Switch可以同時連接幾個endpoint。一個root port和一個endpoint對就需要一個單獨(dú)的PCI bus。而PCI是在同一個總線上的設(shè)備共享同一個bus number。過去主板上的PCI插槽都公用一個PCI bus,而現(xiàn)在的PCIe插槽卻連在芯片組不同的root port上。
2. PCIe的連線是由不同的lane來連接的 ,這些lane可以合在一起提供更高的帶寬。譬如兩個1lane可以合成2lane的連接,寫作x2。兩個x2可以變成x4,最大直到x16,往往給帶寬需求最大的顯卡使用。
3. PCI配置空間從256B擴(kuò)展為4k ,同時提供了PCIe memory map訪問方式,我們在軟件部分會詳細(xì)介紹。
4.PCIe提供了很多特殊功能 ,如Complete Timeout(CTO),MaxPayload等等幾十個特性,而且還在隨著PCIe版本的進(jìn)化不斷增加中,對電源管理也提出了單獨(dú)的State(L0/L0s/L1等等)。這些請參見PCIe 3.0 spec,本文不再詳述。
5. 其他VC的內(nèi)容,和固件理解無關(guān),本文不再提及。INT到MSI的部分會在將來介紹PC中斷系統(tǒng)時詳細(xì)講解。
PCIe 1.0和2.0采用了8b/10b編碼方式,這意味著每個字節(jié)(8b)都用10bit傳輸,這就是為什么2.5GHz和5GHz時鐘,每時鐘1b數(shù)據(jù),結(jié)果不是312.5MB/s和625MB/s而是250MB/s和500MB/s。PCIe 3.0和4.0采用128b/130b編碼,減小了浪費(fèi)(overhead),所以才能在8GHz時鐘下帶寬達(dá)到1000MB/s(而不是800MB/s)。即將于今年發(fā)布的PCIe 4.0還會將頻率提高一倍,達(dá)到16GHz,帶寬達(dá)到2GB/s每Lane。
后記
對于一般用戶來說,PCIe對用戶可見的部分就是主板上大大小小的PCIe插槽了,有時還和PCI插槽混在一起,造成了一定的混亂,其實(shí)也很好區(qū)分:
如圖,PCI插槽都是等長的,防呆口位置靠上,大部分都是純白色。PCIe插槽大大小小,最小的x1,最大的x16,防呆口靠下。
常見問題 :
Q:我主板上沒有x1的插槽,我x1的串口卡能不能插在x4的插槽里。
A: 可以,完全沒有問題。除了有點(diǎn)浪費(fèi)外,串口卡也將已x1的方式工作。
Q:我主板上只有一個x16的插槽,被我的顯卡占據(jù)了。我還有個x16的RAID卡可以插在x8的插槽內(nèi)嗎?
A: 你也許會驚訝,但我的答案同樣是:可以!你的RAID卡將以x8的方式工作。實(shí)際上來說,你可以將任何PCIe卡插入任何PCIe插槽中! PCIe在鏈接training的時候會動態(tài)調(diào)整出雙方都可以接受的寬度。最后還有個小問題,你根本插不進(jìn)去!呵呵,有些主板廠商會把PCIe插槽尾部開口,方便這種行為,不過很多情況下沒有。這時怎么辦?你懂的。。。。
Q: 我的顯卡是PCIe 3.0的,主板是PCIe2.0的,能工作嗎?
A: 可以,會以2.0工作。反之,亦然。
Q: 我把x16的顯卡插在主板上最長的x16插槽中,可是benchmark下來卻說跑在x8下,怎么回事?!
A: 主板插槽x16不見得就連在支持x16的root port上,最好詳細(xì)看看主板說明書,有些主板實(shí)際上是x8。有個主板原理圖就更方便了。
Q: 我新買的SSD是Mini PCIe的,Mini PCIe是什么鬼?
A: Mini PCIe接口常見于筆記本中,為54pin的插槽。多用于連接wifi網(wǎng)卡和SSD,注意不要和mSATA弄混了,兩者完全可以互插,但大多數(shù)情況下不能混用(除了少數(shù)主板做了特殊處理),主板設(shè)計(jì)中的防呆設(shè)計(jì)到哪里去了!請仔細(xì)閱讀主板說明書。另外也要小心不要和m.2(NGFF)搞混了,好在卡槽大小不一樣。
評論
查看更多