天天看點

深入PCI與PCIe之一:硬體篇

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之一:硬體篇

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

深入PCI與PCIe之一:硬體篇

PCI和PCIe架構

1。PCI架構

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

深入PCI與PCIe之一:硬體篇

如圖,桌面系統一般隻有一個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與PCIe之一:硬體篇

從圖中我們可以看出 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範圍,其構成可以表示成如下圖:

深入PCI與PCIe之一:硬體篇

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

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

深入PCI與PCIe之一:硬體篇

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

PCI标準有什麼特點嗎?

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

深入PCI與PCIe之一:硬體篇

位址和資料在一個時鐘周期内按照協定,分别一次被傳輸。

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與PCIe之一:硬體篇

相同内容通過一正一反鏡像傳輸,幹擾可以很快被發現和糾正,進而可以将傳輸頻率大幅提升。加上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系統框圖如下:

深入PCI與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。

深入PCI與PCIe之一:硬體篇

後記

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

深入PCI與PCIe之一:硬體篇

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

深入PCI與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)搞混了,好在卡槽大小不一樣。