“PCI”協議基本知識(2)

讀寫事務工作過程
PCI總線規(guī)范中規(guī)定了兩類數據傳送方式,Posted和Non-Posted(下文簡稱為P方式和NP方式),對應的有Posted總線事務和Non-Posted總線事務(下文簡稱P事務和NP事務)。
P事務是一種自頂向下逐級釋放資源的模式。當上游總線的數據傳輸事務到達下一級的PCI橋后,由該PCI橋接管事務,將事務轉發(fā)到下游總線,同時結束上游總線的事務。本質上,是該PCI橋重新開辟了一個事務轉發(fā)給下游總線,上游總線就不用管了。
NP事務,則在原則上需要等待數據最終傳送到目標設備,返回響應信息之后,才能結束當前的總線事務。
PCI規(guī)范中規(guī)定,只有存儲器寫請求可以使用P事務,而存儲器讀請求、I/O讀寫請求、配置讀寫請求只能采用NP事務。采用NP方式的數據傳輸將更可靠,但是數據傳輸中對PCI總線資源的占用也十分嚴重。在NP方式下,總線資源的釋放,也是在目標設備的響應信息回送過程中,進行的逐級釋放,因此很容易引起PCI總線的擁塞。對于這一特點,PCI橋對NP事務有優(yōu)化策略,即使用Delayed總線事務來處理NP事務。PCI總線的Delay總線事務由Delay讀寫請求和Delay讀寫完成總線事務組成。主要思想是在NP事務的過程中引入Retry周期。Retry周期指的是PCI橋重新發(fā)起相同的總線周期。當HOST主橋啟動NP方式的PCI讀寫總線事務后,期后的第一個PCI橋首先使用Retry周期,使HOST主橋擇時重新發(fā)起相同的總線周期,此時該PCI橋上游的PCI總線將被釋放。當該PCI橋繼續(xù)轉發(fā)讀寫請求時使用的便是Delayed總線請求。具體的一個示例過程見書中[P20]。
HOST處理器訪問PCI設備
對于I/O讀寫事務和存儲器讀寫事務,要搞清楚I/O地址空間和存儲器地址空間的區(qū)別。PCI總線域中,有PCI設備的存儲器地址空間和I/O地址空間;在存儲器域中,有存儲器的存儲器地址空間和I/O地址空間。但是,是否具有獨立的I/O地址空間,因處理器相異。在x86處理器中,是有獨立的I/O地址空間的,且存儲器域的I/O地址空間和PCI總線域的I/O地址空間相同。但是,仍然要知道區(qū)分這兩個概念。
處理器對于PCI設備發(fā)起的I/O讀寫請求和存儲器讀寫請求的處理過程是類似的,處理器將其可以訪問的存儲器域的I/O地址或者存儲器地址通過HOST主橋轉換為PCI總線域的I/O地址或者存儲器地址。書中的[P16下方→P17]詳細介紹了處理器訪問PCI設備的存儲器寫事務的處理過程;[P17下方→P18]詳細介紹了處理器使用純粹NP方式訪問PCI設備的存儲器讀事務的處理過程,這個過程清楚地展示了NP方式的一個特點,就是PCI總線在向上傳遞目標設備的響應時,后方不再使用的總線事務才會關閉(結束)。對于I/O寫事務的過程,則是留給讀者考慮(I/O讀事務和存儲讀事務的處理過程類似)。

?這里再次給出了圖1-1,接下來嘗試探討處理器向PCI設備發(fā)起I/O寫事務的過程。
以處理器向PCI設備11發(fā)起I/O讀寫操作為例。這里假設事務過程使用的是純粹的NP方式(沒有使用Delayed傳送方式)。I/O寫總線事務的處理過程如下:
a.??? 首先處理器將要傳遞的數據放入通用寄存器中,然后向PCI設備映射到存儲器域的地址進行I/O寫操作。對于有獨立I/O地址空間的處理器(如x86),在事務開始前,x86處理器會將PCI設備使用的I/O地址映射到存儲器域的I/O地址空間中,之后處理器可以通過IN、OUT等指令對存儲器域的I/O地址進行訪問,然后通過HOST主橋將PCI存儲器域的I/O地址轉換為PCI總線域的I/O地址;對于沒有獨立I/O地址的處理器,如PowerPC,在HOST主橋初始化的時候,將PCI設備使用的I/O地址空間映射為處理器的存儲器地址空間,在請求到來時,HOST主橋再進行地址的轉換。
b.??? HOST主橋x接收來自處理器的I/O寫請求(在HOST主橋x和y應該是經歷過一個地址范圍的判斷),HOST主橋x進行存儲器地址到PCI總線域的PCI總線地址的轉換,然后向PCI總線x0發(fā)起I/O寫總線事務;
c.???? PCI總線上的所有設備都將監(jiān)聽這個事務,最后PCI橋x1接收這個事務,然后該橋向PCI總線x1發(fā)起新的PCI總線I/O寫請求。
d.??? PCI總線x1上所有的設備都將監(jiān)聽此事務,最后PCI設備11接收此事務,通過設備的控制器接口將事務中的數據寫入到指定地址,并將這個寫請求總線事務轉換為I/O寫完成總線事務(回送響應,回應)?!盎貞毕蛏蟼鬟f。
e.??? “回應”上傳到PCI橋x1時,結束PCI總線x1上的PCI總線事務;
f.???? “回應”通過PCI總線x0繼續(xù)上傳到HOST主橋x時,結束PCI總線x0上的PCI總線事務。
g.??? HOst主橋x將“回應”傳遞給處理器,最終結束處理器的I/O寫操作。
PCI設備讀寫主存儲器
PCI讀寫主存儲器是DMA過程。在PCI設備的DMA過程中,使用的地址也是PCI總線域的地址,因此當DMA請求到達HOST主橋時候,也需要主橋將地址轉換為存儲器域的地址。書中[P18下方→P19]的內容詳細介紹了PCI設備向主存儲器發(fā)起DMA讀寫的過程。根據表1-2 “PCI總線事務”中的說明,PCI總線事務中的Memory Read/Write(存儲器讀/寫)可以是處理器向PCI設備發(fā)起的,也可以是PCI設備向處理器發(fā)起的。因此,這里的DMA讀寫操作對應的其實是一種PCI設備對處理器發(fā)起的存儲器讀寫總線事務。(I/O讀寫事務只能是處理器向PCI設備發(fā)起的?)
PCI設備處理可以向主存儲器發(fā)起DMA操作,還可以向其他的PCI設備發(fā)起讀寫操作,不過不常見(目前我的理解是,這中讀寫事務也算一種存儲器讀寫事務,同樣的寫事務將使用P方式,讀事務將使用NP方式)。
還是參考上面的圖1-1,書中介紹了PCI設備11向主存儲器發(fā)起DMA讀寫(PCI存儲器讀寫事務)的詳細過程[P18-19],以及PCI設備11將數據寫入PCI設備01的過程[P19下方],接下來嘗試探討PCI設備11從PCI設備01讀取數據的過程。
為方便說明,還是將圖1-1放在這里。

a.?????? PCI設備11將PCI讀總線事務發(fā)向PCI總線x1上,PCI橋x1和PCI設備12同時監(jiān)聽此總線事務。
b.?????? PCI橋x1將接收這個總線事務,并將此PCI讀總線事務上推到PCI總線x0。
c.?????? PCI總線x0上的所有設備將監(jiān)聽此PCI讀總線事務,最后由PCI設備01接收這個數據請求,并將所需數據通過PCI總線x0傳輸到PCI橋x1,此時結束PCI總線x0上的讀請求總線事務。
d.?????? PCI橋x1將收到的數據通過PCI總線x1傳輸給PCI設備11,此時結束PCI總線x1上的總線事務。
總結
好的,PCI總線的知識介紹,告一段落。我把《PCI Express體系結構導讀》中第一章關于PCI協議的知識基本都覆蓋到了。這個總結的過程對知識有很好的鞏固作用,但是效率也低,之后我不會再做這么詳細的總結了,而打算采取更為抽象的腦圖模式,或者是邊看便總結。不過這個付出是值得的,因為PCI協議的知識作為PCIe協議的重要基礎,學得再怎么扎實都不過分。