在電信、電力、國防等應用領(lǐng)域中,經(jīng)常要求其所用設備有極高的實(shí)時(shí)性。當需要在各個(gè)設備間進(jìn)行大容量的信息交換時(shí),傳統的網(wǎng)絡(luò )包交換模式已不能很好地滿(mǎn)足實(shí)時(shí)性的要求。而借助于CPCI總線(xiàn),兩個(gè)設備可以互訪(fǎng)對方的內存,具有傳輸速度快、傳輸容量大和高可靠性等特點(diǎn),非常適合大容量的信息傳遞。國家數字交換系統工程技術(shù)研究中心承擔的國家863計劃項目——“中國第三代移動(dòng)通信系統”CDMA2000系統集成就選擇基于CPCI總線(xiàn)的多SBC平臺。各個(gè)SBC間的通信效率直接決定了整個(gè)系統性能的高低。 目前常用的實(shí)時(shí)操作系統如VxWorks、Lynx等,都針對CPCI總線(xiàn)實(shí)現了消息隊列,可用于SBC間的消息通信。但VxWorks、Lynx中消息傳遞的實(shí)現方式很不靈活,一般是通過(guò)在一個(gè)特定的SBC(通常為system board)中開(kāi)啟一塊共享內存,其他各個(gè)SBC(通常為non system board)通過(guò)對共享內存的讀寫(xiě)交換信息;每完成一次兩個(gè)non system SBC間的信息交換,都要進(jìn)行一次PCI讀寫(xiě)操作,效率不高。另外VxWorks、Lynx中的消息長(cháng)度都有一個(gè)最大值,當要進(jìn)行大數據量(如1GB的內存數據庫)的信息傳輸時(shí),操作系統提供消息傳遞機制也無(wú)能為力。而以上這些問(wèn)題,都可以通過(guò)任意兩個(gè)SBC間的直接內存訪(fǎng)問(wèn)得到解決。本文首先介紹了PCI Bridge的工作原理;然后以Motorola公司提供的CPX8000系列工控機為例,討論了兩個(gè)SBC是如何基于背板(Backplane)上的CPCI總線(xiàn),并利用PCI Bridge的地址映射機制,通過(guò)互訪(fǎng)內存的方式最終實(shí)現雙機通信;最后介紹了實(shí)際應用時(shí)應注意的性能優(yōu)化問(wèn)題。 1 PCI Bridge的工作原理 在簡(jiǎn)單的計算機系統中,其擁有的外部設備較少,單級總線(xiàn)結構便能滿(mǎn)足系統的需要。但是由于單個(gè) PCI總線(xiàn)可支持的 PCI 設備數量有電氣限制,對擁有大量外設的計算機系統而言,單級總線(xiàn)結構已不能滿(mǎn)足系統的要求,因此便產(chǎn)生了橋接設備。通過(guò)PCI-to-PCI Bridge可擴展出新的PCI總線(xiàn),通過(guò)PCI-to-ISA Bridge可擴展出ISA總線(xiàn)。借助PCI Bridge這些特殊的PCI設備,系統中各級總線(xiàn)被粘和在一起,使整個(gè)系統成為一個(gè)有機整體。 每個(gè)PCI設備都有自己的PCI I/O空間、PCI內存空間和PCI配置空間(configuration space)。PCI設備的設備驅動(dòng)程序對PCI配置空間進(jìn)行初始化設置后,各個(gè)智能控制器如CPU、DMA控制器等,可以對PCI設備的PCI I/O空間、PCI內存空間進(jìn)行訪(fǎng)問(wèn)。在圖1中,CPU若要訪(fǎng)問(wèn)網(wǎng)卡,首先會(huì )在PCI Bus0上生成一個(gè)物理地址,這個(gè)地址經(jīng)PCI-to-PCI Bridge的過(guò)濾及轉換后,在PCI Bus1上產(chǎn)生一PCI Bus地址,網(wǎng)卡通過(guò)地址譯碼,響應對這個(gè)地址的訪(fǎng)問(wèn)。 圖1 基于PCI的系統 從這個(gè)過(guò)程可以了解到,PCI-to-PCI Bridge有兩種基本的功能: (1)地址映射功能。雖然同是對網(wǎng)卡進(jìn)行訪(fǎng)問(wèn),但PCI Bus0與PCI Bus1上的地址意義是不同的。兩個(gè)地址分屬各自的地址空間,通過(guò)PCI-to-PCI Bridge實(shí)現兩個(gè)地址的映射。根據這兩個(gè)地址是否相同,可將PCI-to-PCI Bridge區分為兩種類(lèi)型: ·PCI-to-PCI Transparent Bridge。PCI Bridge不對PCI Bus0上的地址進(jìn)行轉換,直接將其映射到PCI Bus1上。PCI Bus0與PCI Bus1上的地址是相同的。 ·PCI-to-PCI Non Transparent Bridge。PCI Bus0上的地址必須經(jīng)過(guò)PCI Bridge的轉換,才能映射到PCI Bus1上。PCI Bus0與PCI Bus1上的地址是不同的。 (2)地址過(guò)濾功能。PCI Bridge在把PCI Bus0上的地址向下游總線(xiàn)(ISA Bus、PCI Bus1)傳遞時(shí),具有選擇性。在圖1中,CPU在PCI Bus0上所產(chǎn)生的地址,只有對SCSI和Ethernet的訪(fǎng)問(wèn),PCI-to-PCI Bridge才予以接收;而對于PCI Bus0的其他地址,PCI-to-PCI Bridge均不予響應。每一個(gè)PCI Bridge所響應的地址范圍,可形象地稱(chēng)其為此PCI Bridge的地址窗口,只有當上游總線(xiàn)的地址落進(jìn)PCI Bridge的地址窗口中,PCI Bridge才響應此地址并向下游總線(xiàn)傳遞。 2 雙機通信的具體實(shí)現 本節以Motorola公司提供的CPX8000系列工控機為例,介紹了如何通過(guò)CPCI總線(xiàn)實(shí)現雙機間的通信。如圖2所示,兩個(gè)SBC通過(guò)背板上的CPCI總線(xiàn)實(shí)現了物理上的連接。如果兩個(gè)SBC能夠互相訪(fǎng)問(wèn)對方的內存,就可實(shí)現兩者間的數據交流。以系統處理機板(System Processor Board,又稱(chēng)主機板)訪(fǎng)問(wèn)非系統處理機板(Non-system Processor Board, 又稱(chēng)子機板)內存為例,介紹雙機通信的具體實(shí)現。本方案已在Lynx及VxWorks實(shí)時(shí)操作系統上實(shí)現。 在圖2中,主機板CPU若要訪(fǎng)問(wèn)子機板中的1MB內存單元,必須將這塊內存映射到主機板CPU的虛擬地址空間中,可以通過(guò)對主機板、子機板、主機板與子機板的接口配置來(lái)達到目的。此1MB的內存單元可被映射到不同的地址空間(如CPU虛擬地址空間、物理地址空間、本地PCI地址空間、系統CPCI地址空間等),映射地址也各不相同。在圖2中,對于此1MB內存的起始單元在不同地址空間中的映射地址,分別用符號A1、A2、…A7表示。 圖2 數據通信原理圖 2.1 子機板的配置 (1)調用內核內存分配函數申請1MB的內核虛擬地址空間,得到申請空間的開(kāi)始地址A7。 (2)根據操作系統的內存映射關(guān)系,得到虛擬地址A7的物理映射地址A6。 (3)Raven ASIC是一個(gè)Host-to-PCI Bridge,因為Processor Bus不是一個(gè)標準總線(xiàn),所以通過(guò)Raven將其轉換為PCI總線(xiàn),以?huà)旖痈黝?lèi)PCI設備。CPU和Raven一起構成了一組套片(chipset),配合使用。根據Raven的設置,獲得物理地址A6在Local PCI Bus的映射地址A5。 (4)21554是一PCI-to-PCI Non Transparent Bridge,并可進(jìn)行雙向數據傳遞。通過(guò)其內部的兩個(gè)配置寄存器,將其地址窗口的大小設為1MB;地址窗口的起始地址在Local PCI Bus端設為A5。 2.2 主機板的配置 (1)申請大小1MB的內核虛擬地址空間,得到其開(kāi)始地址A1。 (2)根據操作系統的內存映射關(guān)系,得到虛擬地址A1的物理映射地址A2。 (3)根據Raven的設置,得到物理地址A2在Local PCI Bus上的映射地址A3。 (4)21154是一PCI-to-PCI Transparent Bridge,它也可以在兩個(gè)方向上進(jìn)行數據訪(fǎng)問(wèn)。設置其內部的兩個(gè)配置寄存器,將其地址窗口的大小設為1MB;地址窗口的起始地址設置為A3。由于21154的透明性,地址A3與其在System CPCI Bus端的映射地址A4的值是相同的。 2.3 主機板與子機板的接口配置 在主機板端對子機板進(jìn)行配置,設置21554的配置寄存器,將其在System CPCI Bus端的地址窗口開(kāi)始地址設為A4。由于在Local PCI Bus端的地址窗口起始地址已設為A5,所以將地址A4映射到了地址A5?梢钥吹,由于21554的非透明性,使主機板與子機板的地址空間相互隔離,各自可獨立分配,并在System CPCI Bus級實(shí)現了對接。在主機板CPU看來(lái),整個(gè)子機板與主機板網(wǎng)卡一樣,都是掛在主機板Local PCI Bus下的一個(gè)外設。對子機板的訪(fǎng)問(wèn)與對主機板網(wǎng)卡的訪(fǎng)問(wèn)方式是一樣的,沒(méi)有什么不同。 2.4 地址轉換流程 當所有的配置完成后,主機板CPU只對地址A1進(jìn)行讀寫(xiě)操作,便可實(shí)現對子機板1MB內存起始單元的訪(fǎng)問(wèn);對1MB內存中其他單元的訪(fǎng)問(wèn),只要將地址A1加上相應的偏移量即可。通過(guò)下面的地址轉換流程,可以清楚地看到各級地址是如何通過(guò)一級級映射,最終命中指定單元的。 主機板CPU給出虛擬內存訪(fǎng)問(wèn)地址A1→主機板物理地址A2→主機板Local PCI Bus地址A3→System CPCI Bus地址A4→子機板Local PCI Bus地址A5→子機板物理地址A6→經(jīng)Falcon Memory Controller譯碼后,選中所申請的1MB內存的起始單元。 從上述介紹可以看出,要想實(shí)現雙機的內存互訪(fǎng),關(guān)鍵是要進(jìn)行正確的地址映射。當要實(shí)現多個(gè)SBC間的相互訪(fǎng)問(wèn)時(shí),地址的映射會(huì )更復雜,需要對操作系統的地址空間分配、各個(gè)SBC的PCI-to-PCI Bridge設置、System CPCI Bus地址空間分配等進(jìn)行通盤(pán)考慮。 ?圖3 在兩SBC間進(jìn)行讀操作時(shí)的時(shí)間圖 圖4 在兩SBC間進(jìn)行寫(xiě)操作時(shí)的時(shí)間圖 3 性能優(yōu)化 圖3、圖4是用VMETRO的總線(xiàn)分析儀截獲的數據。分別是在兩個(gè)SBC間進(jìn)行讀寫(xiě)訪(fǎng)問(wèn)時(shí),連續進(jìn)行100 Byte傳輸的時(shí)間圖。 從圖3可以看出,每進(jìn)行一次4Byte的讀操作,要花費956.8+4×149.5+179.4=1734.2ns,這相當于1734.2ns/29.9ns=58 PCI clock cycles。 從圖4可以看到,第一個(gè)4Byte的寫(xiě)操作花費了159.5ns,接著(zhù)是兩次猝發(fā)傳送,隨后一個(gè)4Byte寫(xiě)操作花費了119.6ns。進(jìn)行一次4Byte的寫(xiě)操作平均花費(159.5ns+2×29.9ns+119.6ns)/(4×29.9ns)=11 PCI clock cycles。 對比讀寫(xiě)兩種訪(fǎng)問(wèn)方式可以看出,寫(xiě)操作比讀操作的效率要高得多。這主要有以下一些原因: (1)當PCI上的一個(gè)主設備發(fā)起對一個(gè)目標設備的訪(fǎng)問(wèn)時(shí),讀和寫(xiě)操作的完成時(shí)間差別很大。目前的PCI設備中一般都有一個(gè)用于存儲器寫(xiě)的轉發(fā)(post)緩沖器。若要進(jìn)行寫(xiě)操作(如圖2中主機板對子機板的寫(xiě)操作),主設備只需將其寫(xiě)緩沖區數據復制到目標設備的轉發(fā)緩沖器中,便認為操作完成。例如在圖2中,主機板的Raven只要將數據發(fā)給21154,便認為寫(xiě)操作完成,后續的數據傳輸由21154驅動(dòng)完成?梢钥吹,寫(xiě)操作在目的總線(xiàn)上(子機板的Process Bus)完成之前可以先在源總線(xiàn)上(主機板的Local PCI Bus)完成,實(shí)際上是寄存器對寄存器的操作。而要實(shí)現一個(gè)讀操作,則必須經(jīng)過(guò)存儲器本身的訪(fǎng)問(wèn)和各級PCI接口的邏輯延遲才可完成。與寫(xiě)操作相比,讀操作在源總線(xiàn)上完成之前必須先在目的總線(xiàn)上完成,這導致了讀操作的效率很低。(2)從圖3、圖4中可以看到,PCI設備還可進(jìn)行寫(xiě)操作的猝發(fā)操作,但讀操作則無(wú)法進(jìn)行。這是由于猝發(fā)操作只有在前一事務(wù)是寫(xiě)事務(wù)時(shí)才能實(shí)現。猝發(fā)傳送取消了FRAME#、AD、C/BE#、IRDY#、TRDY#、DEVSEL#等總線(xiàn)信號的周轉周期,實(shí)現了每一個(gè)PCI clock cycle進(jìn)行一次數據傳送。 (3)猝發(fā)傳送操作不可能無(wú)限制地進(jìn)行下去。連續進(jìn)行猝發(fā)傳送的次數與轉發(fā)緩沖器的大小、Latency Timer的取值、總線(xiàn)的繁忙狀況都有關(guān)系。 由于以上原因,在兩個(gè)SBC間進(jìn)行數據傳送時(shí),應該采用如下方式: (1)提供數據的SBC應將數據直接寫(xiě)到消費數據的SBC內存中;而不是提供者將數據放在本地內存,再由消費者經(jīng)過(guò)PCI讀操作來(lái)實(shí)現。也就是說(shuō),總是進(jìn)行PCI寫(xiě)操作。(2)當需要在多個(gè)SBC間進(jìn)行數據互傳時(shí),要合理地設置Latency Timer的取值,以使各SBC公平使用PCI總線(xiàn)資源?紤]兩個(gè)子機板間的通信實(shí)現。若采用操作系統提供的消息傳遞機制,數據提供者必須先將數據寫(xiě)到主機板,數據消費者再從主機板讀取數據。對一個(gè)4 Byte的數據傳輸來(lái)說(shuō),平均要花費58+11=69 PCI clock cycles。若采用本文提供的方法,提供數據的SBC將數據直接寫(xiě)到消費數據的(接上頁(yè)) SBC內存中,則傳輸一個(gè)4 Byte的數據,平均只需11 PCI clock cycles?芍,后者比前者快了69/11≈6.3倍,極大提高了傳輸效率。 |