PCIe調試心得_DMA part2


作者:East  FPGA那點事兒

上一章講述了PCIe總線DMA的原理和XAPP1052存在的問題。

本章以服務器常用的4通道1000M以太網卡為例講述如何提高DMA的效率。

1.內存重分配
Windows操作系統會划分一部分硬盤空間作為虛擬內存,將長時間不用得應用程序或內存交換到硬盤中,而釋放出一部分內存空間供其他應用程序使用,提高計算機的性能。

 

或者操作系統會定進行內存碎片整理,將應用程序中零散的內存收集起來重新分配,減少內存碎片。

但是如果被交換或整理的是DMA使用的內存就麻煩了。操作系統已經為該內存重新分配了物理地址,而原內存分配給了其他應用程序,此時DMA再使用該內存,必然導致死機藍屏現象。XAPP1052就沒有很好的解決該問題,在程序中設置禁止將該內存交換到硬盤或整理。

2.內存大小
XAPP1052中申請到的物理連續內存大小為4KB。因為DDR內存內部是以塊為單位,最小塊為4KB,所以在操作系統中比較容易申請到4KB的物理連續內存。

4KB這個大小太小了。以太網數據小包為64B,大包為1512B,假如連續收到3個大包,那么應該怎樣利用4KB的內存呢?

一種方式是一片4KB內存只存放2包數據,剩余內存浪費,第二片4KB內存存放第三包數據;另一種方式是將第三包數據拆分,前一半數據存放在第一片內存,后一半數據存放在第二片內存。

第一種方式將浪費976B,內存利用率非常低;而第二種方式對內存管理和數據處理帶來了更高的要求,可靠性肯定降低了。

如果能申請到更大的物理連續內存,比如4MB,那么采用第一種方式浪費的字節數就可以接受。有沒有辦法申請更大的物理連續內存呢?就留給讀者自己去查閱資料了。

3.申請內存
操作系統中有內存管理單元,應用程序申請的內存片是邏輯連續,但不一定物理連續。對於上層軟件來說由操作系統屏蔽了硬件特性,看不到任何區別;但是DMA使用必須物理連續。隨着計算機運行時間增加,操作系統中的內存碎片也會增加,或其他應用程序占用了內存,導致最后連4KB的物理連續內存都很難申請到。

所以建議:
由驅動程序申請內存,不要在應用程序中申請。
開始工作時就申請足夠的內存。
該內存必須妥善管理。
該內存只作為中間轉存,數據應拷貝到應用程序的內存中再使用。

4.內存管理
XAPP1052中一次DMA操作完成會產生一個中斷。下面簡單計算一下:當網絡數據量較大時,例如達到4MB/s,那么4KB的內存塊完全填滿需要:
4KB/40MB/s=100us

中斷的頻率遠遠高於任務調度的周期(10ms),這將導致驅動程序不停的處理中斷,CPU使用率非常高,而DMA性能非常低。

即使使用大內存,例如4MB,但是4路1000M網最大流量為500MB/s也是相同的情況。

我們提出的解決方案如下:

 

驅動程序申請大量內存片,一開始在內存池1中進行管理。程序開始運行時,將部分內存片指針寫入FIFO1中;FPGA從FIFO1中取得內存地址,並開始向該地址寫入數據,當該片內存寫滿后,將該內存地址寫入FIFO2,並從FIFO1中取出下一個地址。驅動程序可定期或以FIFO2半滿中斷等形式,從FIFO2中讀回內存指針放入內存池2中。然后將數據可拷貝給應用程序,就可以“釋放”這片內存,放入內存池1中。驅動程序檢測到FIFO1中使用量較少時立即向FIFO1寫入一批內存地址。達到內存循環使用的目的。而驅動程序只需要做內存的調度和管理。FPGA的處理上也沒有特殊要求,而且對FPGA中數據緩存的要求也非常低,我們實際應用中只使用了16KB的數據緩存。

假如內存片大小為4MB,兩個FIFO深度為32,在500MB/s的數據流量下,使用半滿中斷處理方式。中斷頻率為:
16*4MB/500MB/s=128ms

CPU不用頻繁處理中斷,自然可以將更多的CPU資源用於處理其他任務。而windows任務調度時間約10ms,遠小於128ms,完全不用擔心因為任務調度延遲導致FIFO溢出而丟包現象。

轉載:http://xilinx.eetrend.com/blog/9832


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM