新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > PCI總線的存儲器讀寫總線事務

PCI總線的存儲器讀寫總線事務

作者: 時間:2016-12-15 來源:網(wǎng)絡 收藏

下文以圖1?1的處理器系統(tǒng)中的PCI設備11向存儲器進行DMA寫操作為例,說明Posted傳送方式的實現(xiàn)過程。PCI設備11進行DMA寫操作時使用存儲器寫總線事務,當PCI設備11獲得PCI總線x1的使用權(quán)后,將發(fā)送存儲器寫總線事務到PCI總線x1。當PCI橋1發(fā)現(xiàn)這個總線事務的地址不在該橋管理的地址范圍內(nèi)將首先接收這個總線事務,并結(jié)束PCI總線x1的總線事務。

此時PCI總線x1使用的資源已被釋放,PCI設備11和PCI設備12可以使用PCI總線x1進行通信。PCI橋1獲得PCI總線x0的使用權(quán)后,將轉(zhuǎn)發(fā)這個存儲器寫總線事務到PCI總線x0,之后HOST主橋x將接收這個存儲器寫總線事務,并最終將數(shù)據(jù)寫入主存儲器。

由以上過程可以發(fā)現(xiàn),Posted數(shù)據(jù)請求在通過PCI總線之后,將逐級釋放總線資源,因此PCI總線的利用率較高。而使用Non-Posted方式進行數(shù)據(jù)傳送的處理過程與此不同,Non-Posted數(shù)據(jù)請求在通過PCI總線時,并不會及時釋放總線資源,從而在某種程度上影響PCI總線的使用效率和傳送帶寬。

1.3.3HOST處理器訪問PCI設備

HOST處理器對PCI設備的數(shù)據(jù)訪問主要包含兩方面內(nèi)容,一方面是處理器向PCI設備發(fā)起存儲器和I/O讀寫請求;另一方面是處理器對PCI設備進行配置讀寫。

在PCI設備的配置空間中,共有6個BAR寄存器。每一個BAR寄存器都與PCI設備使用的一組PCI總線地址空間對應,BAR寄存器記錄這組地址空間的基地址。本書將與BAR寄存器對應的PCI總線地址空間稱為BAR空間,在BAR空間中可以存放I/O地址空間,也可以存放存儲器地址空間。

PCI設備可以根據(jù)需要,有選擇地使用這些BAR空間。值得注意的是,在BAR寄存器中存放的是PCI設備使用的“PCI總線域”的物理地址,而不是“存儲器域”的物理地址,有關(guān)BAR寄存器的詳細介紹見第2.3.2節(jié)。

HOST處理器訪問PCI設備I/O地址空間的過程,與訪問存儲器地址空間略有不同。有些處理器,如x86處理器,具有獨立的I/O地址空間。x86處理器可以將PCI設備使用的I/O地址映射到存儲器域的I/O地址空間中,之后處理器可以使用IN,OUT等指令對存儲器域的I/O地址進行訪問,然后通過HOST主橋?qū)⒋鎯ζ饔虻腎/O地址轉(zhuǎn)換為PCI總線域的I/O地址,最后使用PCI總線的I/O總線事務對PCI設備的I/O地址進行讀寫訪問。在x86處理器中,存儲器域的I/O地址與PCI總線域的I/O地址相同。

對于有些沒有獨立I/O地址空間的處理器,如PowerPC處理器,需要在HOST主橋初始化時,將PCI設備使用的I/O地址空間映射為處理器的存儲器地址空間。PowerPC處理器對這段“存儲器域”的存儲器空間進行讀寫訪問時,HOST主橋?qū)⒋鎯ζ饔虻倪@段存儲器地址轉(zhuǎn)換為PCI總線域的I/O地址,然后通過PCI總線的I/O總線事務對PCI設備的I/O地址進行讀寫操作。

在PCI總線中,存儲器讀寫事務與I/O讀寫事務的實現(xiàn)較為類似。首先HOST處理器在初始化時,需要將PCI設備使用的BAR空間映射到“存儲器域”的存儲器地址空間。之后處理器通過存儲器讀寫指令訪問“存儲器域”的存儲器地址空間,HOST主橋?qū)?ldquo;存儲器域”的讀寫請求翻譯為PCI總線的存儲器讀寫總線事務之后,再發(fā)送給目標設備。

值得注意的是,存儲器域和PCI總線域的概念,PCI設備能夠直接使用的地址為PCI總線域的地址,在PCI總線事務中出現(xiàn)的地址也為PCI總線域的地址;而處理器能夠直接使用的地址為存儲器域的地址。理解存儲器域與PCI總線域的區(qū)別對于理解PCI總線至關(guān)重要,本篇將在第2.1節(jié)專門討論這兩個概念。

以上對PCI總線的存儲器與I/O總線事務的介紹并沒有考慮PCI橋的存在,如果將PCI橋考慮進來,情況將略微復雜一些。下文將以圖1?1為例說明處理器如何通過HOST主橋和PCI橋1對PCI設備11進行存儲器讀寫操作。當處理器對PCI設備11進行存儲器寫操作時,這些數(shù)據(jù)需要通過HOST主橋x和PCI橋x1,最終到達PCI設備11,其訪問步驟如下。值得注意的是,以下步驟忽略PCI總線的仲裁過程。

(1)首先處理器將要傳遞的數(shù)據(jù)放入通用寄存器中,之后向PCI設備11映射到的存儲器域的地址進行寫操作。值得注意的是,處理器并不能直接訪問PCI設備11的PCI總線地址空間,因為這些地址空間是屬于PCI總線域的,處理器所能直接訪問的空間是存儲器域的地址空間。處理器必須通過HOST主橋?qū)⒋鎯ζ饔虻臄?shù)據(jù)訪問轉(zhuǎn)換為PCI總線事務才能對PCI總線地址空間進行訪問。

(2)HOST主橋x接收來自處理器的存儲器寫請求,之后處理器結(jié)束當前存儲器寫操作,釋放系統(tǒng)總線。HOST主橋x將存儲器域的存儲器地址轉(zhuǎn)換為PCI總線域的PCI總線地址。并向PCI總線x0發(fā)起PCI寫請求總線事務。值得注意的是,雖然在許多處理器系統(tǒng)中,存儲器地址和PCI總線地址完全相等,但其含義完全不同。

(3)PCI總線x0上的PCI設備01、PCI設備02和PCI橋1將同時監(jiān)聽這個PCI寫總線事務。最后PCI橋x1接收這個寫總線事務,并結(jié)束來自PCI總線x0的PCI總線事務。之后PCI橋x1向PCI總線x1發(fā)起新的PCI總線寫總線事務。

(4)PCI總線x1上的PCI設備11和PCI設備12同時監(jiān)聽這個PCI寫總線事務。最后PCI設備11通過地址譯碼方式接收這個寫總線事務,并結(jié)束來自PCI總線x1上的PCI總線事務。

由以上過程可以發(fā)現(xiàn),由于存儲器寫總線事務使用Posted傳送方式,因此數(shù)據(jù)通過PCI橋后都將結(jié)束上一級總線的PCI總線事務,從而上一級PCI總線可以被其他PCI設備使用。如果使用Non-Posted傳送方式,直到數(shù)據(jù)發(fā)送到PCI設備11之后,PCI總線x1和x0才能依次釋放,從而在某種程度上將造成PCI總線的擁塞。

處理器對PCI設備11進行I/O寫操作時只能采用Non-Posted方式進行,與Posted方式相比,使用Non-Posted方式,當數(shù)據(jù)到達目標設備后,目標設備需要向主設備發(fā)出“回應[1]”,當主設備收到這個“回應”后才能結(jié)束整個總線事務。本節(jié)不再講述處理器如何對PCI設備進行I/O寫操作,請讀者思考這個過程。

處理器對PCI設備11進行存儲器讀時,這個讀請求需要首先通過HOST主橋x和PCI橋x1到達PCI設備,之后PCI設備將讀取的數(shù)據(jù)再次通過PCI橋x1和HOST主橋x傳遞給HOST處理器,其步驟如下所示。我們首先假設PCI總線沒有使用Delayed傳送方式處理Non-Posted總線事務,而是使用純粹的Non-Posted方式。

(1)首先處理器準備接收數(shù)據(jù)使用的通用寄存器,之后向PCI設備11映射到的存儲器域的地址進行讀操作,

(2)HOST主橋x接收來自處理器的存儲器讀請求。HOST主橋x進行存儲器地址到PCI總線地址的轉(zhuǎn)換,之后向PCI總線x0發(fā)起存儲器讀總線事務。

(3)PCI總線x0上的PCI設備01、PCI設備02和PCI橋x1將監(jiān)聽這個存儲器讀請求,之后PCI橋1接收這個存儲器讀請求。然后PCI橋x1向PCI總線x1發(fā)起新的PCI總線讀請求。

(4)PCI總線x1上的PCI設備11和PCI設備12監(jiān)聽這個PCI讀請求總線事務。最后PCI設備11接收這個存儲器讀請求總線事務,并將這個讀請求總線事務轉(zhuǎn)換為存儲器讀完成總線事務之后,將數(shù)據(jù)傳送到PCI橋x1,并結(jié)束來自PCI總線x1上的PCI總線事務。

(5)PCI橋x1將接收到的數(shù)據(jù)通過PCI總線x0,繼續(xù)上傳到HOST主橋x,并結(jié)束PCI總線x0上的PCI總線事務。

(6)HOST主橋x將數(shù)據(jù)傳遞給處理器,最終結(jié)束處理器的存儲器讀操作。

顯然這種方式與Posted傳送方式相比,PCI總線的利用率較低。因為只要HOST處理器沒有收到來自目標設備的“回應”,那么HOST處理器到目標設備的傳送路徑上使用的所有PCI總線都將被阻塞。因而PCI總線x0和x1并沒有被充分利用。

由以上例子,我們可以發(fā)現(xiàn)只有“讀完成”依次通過PCI總線x1和x0之后,存儲器讀總線事務才不繼續(xù)占用PCI總線x1和x0的資源,顯然這種數(shù)據(jù)傳送方式并不合理。因此PCI總線使用Delayed傳送方式解決這個總線擁塞問題,有關(guān)Delayed傳送方式的實現(xiàn)機制見第1.3.5節(jié)。

1.3.4PCI設備讀寫主存儲器

PCI設備與存儲器直接進行數(shù)據(jù)交換的過程也被稱為DMA。與其他總線的DMA過程類似,PCI設備進行DMA操作時,需要獲得數(shù)據(jù)傳送的目的地址和傳送大小。支持DMA傳遞的PCI設備可以在其BAR空間中設置兩個寄存器,分別保存這個目標地址和傳送大小。這兩個寄存器也是PCI設備DMA控制器的組成部件。

值得注意的是,PCI設備進行DMA操作時,使用的目的地址是PCI總線域的物理地址,而不是存儲器域的物理地址,因為PCI設備并不能識別存儲器域的物理地址,而僅能識別PCI總線域的物理地址。

HOST主橋負責完成PCI總線地址到存儲器域地址的轉(zhuǎn)換。HOST主橋需要進行合理設置,將存儲器的地址空間映射到PCI總線之后,PCI設備才能對這段存儲器空間進行DMA操作。PCI設備不能直接訪問沒有經(jīng)過主橋映射的存儲器空間。

許多處理器允許PCI設備訪問所有存儲器域地址空間,但是有些處理器可以設置PCI設備所能訪問的存儲器域地址空間,從而對存儲器域地址空間進行保護。例如PowerPC處理器的HOST主橋可以使用Inbound寄存器組,設置PCI設備訪問的存儲器地址范圍和屬性,只有在Inbound寄存器組映射的存儲器空間才能被PCI設備訪問,本篇將在第2.2節(jié)詳細介紹PowerPC處理器的這組寄存器。

由上所述,在一個處理器系統(tǒng)中,并不是所有存儲器空間都可以被PCI設備訪問,只有在PCI總線域中有映像的存儲器空間才能被PCI設備訪問。經(jīng)過HOST主橋映射的存儲器,具有兩個“地址”,一個是在存儲器域的地址,一個是在PCI總線域的PCI總線地址。當處理器訪問這段存儲器空間時,使用存儲器地址;而PCI設備訪問這段內(nèi)存時,使用PCI總線地址。在多數(shù)處理器系統(tǒng)中,存儲器地址與PCI總線地址相同,但是系統(tǒng)程序員需要正確理解這兩個地址的區(qū)別。

下文以PCI設備11向主存儲器寫數(shù)據(jù)為例,說明PCI設備如何進行DMA寫操作。

(1)首先PCI設備11將存儲器寫請求發(fā)向PCI總線x1,注意這個寫請求使用的地址是PCI總線域的地址。

(2)PCI總線x1上的所有設備監(jiān)聽這個請求,因為PCI設備11是向處理器的存儲器寫數(shù)據(jù),所以PCI總線x1上的PCI Agent設備都不會接收這個數(shù)據(jù)請求。

(3)PCI橋x1發(fā)現(xiàn)當前總線事務使用的PCI總線地址不是其下游設備使用的PCI總線地址,則接收這個數(shù)據(jù)請求,有關(guān)PCI橋的Secondary總線接收數(shù)據(jù)的過程見第3.2.1節(jié)。此時PCI橋x1將結(jié)束來自PCI設備11的Posted存儲器寫請求,并將這個數(shù)據(jù)請求推到上游PCI總線上,即PCI總線x0上。

(4)PCI總線x0上的所有PCI設備包括HOST主橋?qū)⒈O(jiān)聽這個請求。PCI總線x0上的PCI Agent設備也不會接收這個數(shù)據(jù)請求,此時這個數(shù)據(jù)請求將由HOST主橋x接收,并結(jié)束PCI橋x1的Posted存儲器寫請求。

(5)HOST主橋x發(fā)現(xiàn)這個數(shù)據(jù)請求發(fā)向存儲器,則將來自PCI總線x0的PCI總線地址轉(zhuǎn)換為存儲器地址,之后通過存儲器控制器將數(shù)據(jù)寫入存儲器,完成PCI設備的DMA寫操作。

PCI設備進行DMA讀過程與DMA寫過程較為類似。不過PCI總線的存儲器讀總線事務只能使用Non-Posted總線事務,其過程如下。



關(guān)鍵詞: PCI總線存儲器讀寫總

評論


技術(shù)專區(qū)

關(guān)閉