DMA介紹(BD的引入)
網絡設備的核心處理模塊是一個被稱作 DMA(Direct Memory Access)的控制器,DMA 模塊能夠協助處理器處理數據收發。對於數據發送來說,它能夠將組織好的數據自動發出,無需處理器干預;對於數據接收來說,它能夠將收到的數據以一定的格式組織起來,通知處理器,並等待處理器來取。
DMA 模塊收發數據的單元被稱為 BD(Buffer Description,緩存描述符),每個包都會被分成若干個幀,而每個幀則被保存在一個 BD 中。BD 結構通常包含有以下字段(正常應用肯定比下面這個數據結構要復雜得多):
<code class="hljs glsl has-numbering"> typedef <span class="hljs-keyword">struct</span> { <span class="hljs-keyword">void</span> *bufptr; <span class="hljs-comment">/* 保存當前 BD 對應緩存的起始地址 */</span> <span class="hljs-keyword">int</span> <span class="hljs-built_in">length</span>; <span class="hljs-comment">/* 保存緩存中存儲的數據包長度 */</span> <span class="hljs-keyword">int</span> sc; <span class="hljs-comment">/* 保存當前 BD 的狀態信息 */</span> } BD_STRUCT;</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
所有的 BD 就組成了一張 BD 表,如圖 1 所示,一般來說發送方向和接收方向的 BD 表是各自獨立的。
圖1
數據發送流程(發送 BD)
網絡設備通過 DMA 進行數據發送的流程如圖2所示。
圖2
圖中各步驟的具體含義描述如下:
(1)協議層通知處理器開始發送數據;
(2)處理器從 BD 表中取出一個 BD,將需要發送的數據拷貝至當前 BD 對應的緩存內,並設置好 BD 的狀態;
(3)處理器通知網絡設備開始發送數據;
(4)MAC 模塊通知 DMA 單元開始發送數據;
(5)DMA 模塊操作 BD 表,取出當前有效 BD;
(6)DMA 模塊將當前 BD 對應緩存內的數據發送至 MAC 模塊;
(7)MAC 模塊將這些數據發送到網絡中;
(8)網絡設備通知處理器數據發送完畢;
(9)處理器通知協議層發送下面一幀數據。
其中步驟(4)~(8)是硬件自動完成的,不需要軟件的干預,如此可以節省處理器的工作量。
數據接收流程(接收 BD)
網絡設備通過 DMA 進行數據接收的流程如圖 3 所示。
圖3
圖中各步驟的具體含義描述如下:
(1)處理器初始化 BD 表;
(2)處理器初始化網絡設備;
(3)MAC 模塊從網絡中接收數據;
(4)MAC 模塊通知 DMA 模塊來取數據;
(5)DMA 模塊從 BD 表中取出合適的 BD;
(6)MAC 模塊將數據發送至當前 BD 對應的緩存內;
(7)網絡設備通知處理器開始接收數據(以中斷方式或輪詢方式);
(8)協議層從當前的 BD 緩存內取走數據。
其中步驟(3)~(6)是硬件自動完成的,不需要軟件的干預,如此可以節省處理器的工作量。