2.1 存儲器域與PCI總線域
HOST主橋的實現因處理器係統而異。PowerPC處理器和x86處理器的HOST主橋除了集成方式不同之外,其實現機製也有較大差異。但是這些HOST主橋所完成的最基本功能依然是分離存儲器域與PCI總線域,完成PCI總線域到存儲器域,存儲器域到PCI總線域之間的數據傳遞,並管理PCI設備的配置空間。
上文曾經多次提到在一個處理器係統中,存在PCI總線域與存儲器域,深入理解這兩個域的區別是理解HOST主橋的關鍵所在。在一個處理器係統中,存儲器域、PCI總線域與HOST主橋的關係如圖2?1所示。
上圖所示的處理器係統由一個CPU,一個DRAM控製器和兩個HOST主橋組成。在這個處理器係統中,包含CPU域、DRAM域、存儲器域和PCI總線域地址空間。其中HOST主橋x和HOST主橋y分別管理PCI總線x域與PCI總線y域。PCI設備訪問存儲器域時,也需要通過HOST主橋,並由HOST主橋進行PCI總線域到存儲器域的地址轉換;CPU訪問PCI設備時,同樣需要通過HOST主橋進行存儲器域到PCI總線域的地址轉換。
如果HOST主橋支持Peer-to-Peer傳送機製,PCI總線x域上的設備可以與PCI總線y域上的設備直接通信,如PCI設備x11可以直接與PCI設備y11通信。為簡化模型,在本書中,PCI總線僅使用32位地址空間。
2.1.1 CPU域、DRAM域與存儲器域
CPU域地址空間指CPU所能直接訪問的地址空間集合。在本書中,CPU、處理器與處理器係統的概念不同。如MPC8548處理器的內核是E500 V2,本書將這個處理器內核稱為CPU;處理器由一個或者多個CPU、外部Cache、中斷控製器和DRAM控製器組成;而處理器係統由一個或者多個處理器和外部設備組成。
在CPU域中有一個重要概念,即CPU域邊界,所謂CPU域邊界,即CPU所能控製的數據完整性邊界。CPU域的邊界由Memory Fence指令的作用範圍確定,CPU域邊界的劃分對數據完整性(Data Consistency)非常重要。與CPU域相關的數據完整性知識較為複雜,可以獨立出書,因此本篇對數據完整性不做進一步介紹。筆者有計劃再更新完PCIe總線部分的資料後,書體係結構的兩方麵內容,一個是Cache層次結構,一個是以Weakly Ordered Memory Modle為基礎書寫數據完整性。
嚴格的講CPU域僅在CPU內核中有效,CPU訪問主存儲器時,首先將讀寫命令放入讀寫指令緩衝中,然後將這個命令發送到DRAM控製器或者HOST主橋。DRAM控製器或者HOST主橋將CPU地址轉換為DRAM或者PCI總線地址,分別進入DRAM域或者PCI總線域後,再訪問相應的地址空間。
DRAM域地址空間指DRAM控製器所能訪問的地址空間集合。目前處理器係統的DRAM一般由DDR-SDRAM組成,有的書籍也將這部分內存稱為主存儲器。在有些處理器係統中,DRAM控製器能夠訪問的地址空間,並不能被處理器訪問,因此在這類處理器係統中,CPU域與DRAM域地址空間並不等同。
比如有些CPU可以支持36位的物理地址,而有些DRAM控製器僅支持32位的物理地址,此時CPU域包含的地址空間大於DRAM域地址空間。但是這並不意味著DRAM域一定包含在CPU域中,在某些處理器係統中,CPU並不能訪問在DRAM域中的某些數據區域。而CPU域中除了包含DRAM域外,還包含外部設備空間。
在多數處理器係統中,DRAM域空間是CPU域空間的一部分,但是也有例外。比如顯卡控製器可能會借用一部分主存儲器空間,這些被借用的空間不能被CPU訪問,而隻能被DRAM控製器,更為準確地說是顯卡通過DRAM控製器訪問,因此這段空間不屬於CPU域,嚴格地講,這段空間屬於外部設備域。
本書使用存儲器域統稱CPU域與DRAM域。存儲器域包括CPU內部的通用寄存器,存儲器映像尋址的寄存器,主存儲器空間和外部設備空間。在Intel的x86處理器係統中,外部設備空間與PCI總線域地址空間等效,因為在x86處理器係統中,使用PCI總線統一管理全部外部設備。為簡化起見,本書使用PCI總線域替代外部設備域。
值得注意的是,存儲器域的外部設備空間,在PCI總線域中還有一個地址映射。當處理器訪問PCI設備時,首先訪問的是這個設備在存儲器域上的PCI設備空間,之後HOST主橋將這個存儲器域的PCI總線地址轉換為PCI總線域的物理地址,然後再通過PCI總線事務訪問PCI總線域的地址空間。
2.1.2 PCI總線域
在x86處理器係統中,PCI總線域是外部設備域的重要組成部分。實際上在Intel的x86處理器係統中,所有的外部設備都使用PCI總線管理。而AMD的x86處理器係統中還存在一條HT(HyperTransport)總線,在AMD的x86處理器係統中還存在HT總線域。本書對HT總線不做進一步介紹。
PCI總線域(PCI Segment)由PCI設備所能直接訪問的地址空間組成。在一個處理器係統中,可能存在多個HOST主橋,因此也存在多個PCI總線域。如在圖2?1所示的處理器係統中,具有兩個HOST主橋,因而在這個處理器係統中存在PCI總線x和y域。
在多數處理器係統中,分屬於兩個PCI總線域的PCI設備並不能直接進行數據交換,而需要通過FSB進行數據交換。值得注意的是,如果某些處理器的HOST主橋支持Peer-to-Peer數據傳送,那麼這個HOST主橋可以支持不同PCI總線域間的數據傳送。
PowerPC處理器使用了OCeaN技術連接兩個HOST主橋,OCeaN可以將屬於x域的PCI數據請求轉發到y域,OCeaN支持PCI總線的Peer-to-Peer數據傳送。有關OCeaN技術的詳細說明見第2.2節。
2.1.3 處理器域
處理器域是指一個處理器係統能夠訪問的地址空間集合。處理器係統能夠訪問的地址空間由存儲器域和外部設備域組成。其中存儲器域地址空間較為簡單,而在不同的處理器係統中,外部設備域的組成結構並不相同。如在x86處理器係統中,外部設備域主要由PCI總線域組成,因為大多數外部設備都是掛接在PCI總線上的,而在PowerPC處理器和其他處理器係統中,有相當多的設備與FSB直接相連,而不與PCI總線相連。
本書僅介紹PCI總線域而不對其他外部設備域進行說明。其中存儲器域與PCI總線域之間由HOST主橋聯係在一起。深入理解這些域的關係是深入理解PCI體係結構的關鍵所在,實際上這也是理解處理器體係結構的基礎。
通過HOST主橋,處理器係統可以將處理器域劃分為存儲器域與PCI總線域。其中存儲器域與PCI總線域,彼此獨立,並通過HOST主橋進行數據交換。HOST主橋是聯係存儲器域與PCI總線域的橋梁,是PCI總線域實際的管理者。
有些書籍認為HOST處理器是PCI總線域的管理者,這種說法並不精確。假設在一個SMP(symmetric multiprocessing)處理器係統中,存在4個CPU而隻有一個HOST主橋,這4個CPU將無法判斷究竟誰是HOST處理器。不過究竟是哪個處理器作為HOST處理器並不重要,因為在一個處理器係統中,是HOST主橋管理PCI總線域,而不是HOST處理器。當一個處理器係統中含有多個CPU時,如果這些CPU都可以訪問HOST主橋,那麼這些CPU都可以作為這個HOST主橋所管理PCI總線樹的HOST處理器。
在一個處理器係統中,CPU所能訪問的PCI總線地址一定在存儲器域中具有地址映射;而PCI設備能訪問的存儲器域的地址也一定在PCI總線域中具有地址映射。當CPU訪問PCI域地址空間時,首先訪問存儲器域的地址空間,然後經過HOST主橋轉換為PCI總線域的地址,再通過PCI總線事務進行數據訪問。而當PCI設備訪問主存儲器時,首先通過PCI總線事務訪問PCI總線域的地址空間,然後經過HOST主橋轉換為存儲器域的地址後,再對這些空間進行數據訪問。
由此可見,存儲器域與PCI總線域的轉換關係由HOST主橋統一進行管理。有些處理器提供了一些寄存器進行這種地址映射,如PowerPC處理器使用Inbound和Outbound寄存器組保存存儲器域與PCI總線域的地址映射關係;而有些處理器並沒有提供這些寄存器,但是存儲器域到PCI總線域的轉換關係依然存在。
HOST主橋進行不同地址域間的數據交換時,需要遵循以下規則。為區別存儲器域到PCI總線域的地址映射,下文將PCI總線域到存儲器域的地址映射稱為反向映射。
(1) 處理器訪問PCI總線域地址空間時,首先需要訪問存儲器域的地址空間,之後通過HOST主橋將存儲器地址轉換為PCI總線地址,之後才能進入PCI總線域進行數據交換。PCI設備使用的地址空間保存在各自的PCI配置寄存器中,即BAR寄存器中。這些PCI總線地址空間需要在初始化時映射成為存儲器域的存儲器地址空間,之後處理器才能訪問這些地址空間。在有些處理器的HOST主橋中,具有獨立的寄存器保存這個地址映射規則,如PowerPC處理器的Outbound寄存器組;而有些處理器,如在x86處理器中,雖然沒有這樣的寄存器組,但是在HOST主橋的硬件邏輯中仍然存在這個地址轉換的概念。
(2) PCI設備訪問存儲器域時,首先需要訪問PCI總線域的地址空間,之後通過HOST主橋將PCI總線地址轉換為存儲器地址,之後才能穿越HOST主橋進行數據交換。為此處理器需要通過HOST主橋將這個PCI總線地址反向映射為存儲器地址。PCI設備不能訪問在PCI總線域中沒有進行這種反向映射的存儲器域地址空間。PowerPC處理器使用Inbound寄存器組存放PCI設備所能訪問的存儲器空間,而在x86處理器中並沒有這樣的寄存器組,但是依然存在這個地址轉換的概念。
(3) 如果HOST主橋不支持Peer-to-Peer傳送方式,那麼分屬不同PCI總線域的PCI設備間不能直接進行數據交換。在32位的PCI總線中,每一個PCI總線域的地址範圍都是0x0000-0000~0xFFFF-FFFF,但是這些地址沒有直接聯係。PCI總線x域上的PCI總線地址0x0000-0000與PCI總線y域上的PCI總線地址0x0000-0000並不相同,而且這兩個PCI總線地址經過HOST主橋反向映射後,得到的存儲器地址也不相同。
本篇在第2.2節中,主要以PowerPC處理器為例說明HOST主橋的實現機製,並在第2.2.4節簡要說明了x86處理器中的南北橋構架。盡管部分讀者對PowerPC處理器並不感興趣,筆者仍然強烈建議讀者仔細閱讀第2.2節的全部內容。
在PowerPC處理器中,HOST主橋的實現比較完整,尤其是PCI總線域與存儲器域的映射關係比較明晰,便於讀者準確掌握這個重要的概念。而x86處理器由於考慮向前兼容,設計中包含了太多的不得已,x86處理器有時不得不保留原設計中的不完美,向前兼容是Intel的重要成就,也是一個沉重的十字架。
最後更新:2017-04-03 16:48:39