什麼是DMA?

  DMA(Direct Memory Access)即直接存儲訪問,DMA傳輸方式無需CPU直接控制傳輸,通過硬件為RAM、I/O設備開闢一條直接傳輸數據的通路,能使CPU的效率大為提高。每一種體系結構DMA傳輸不同,編程接口也不同。



DMA的觸發方式

特定的通道來觸發DMA。每個通道專門用來管理來自於一個或多個外設對存儲器訪問的請求。(如stm32、2440等芯片)

  2. 每個通道對應四種傳輸模式:
                內存 —> 內存、內存 —> 外設、外設 —> 內存、外設 —> 外設

  3. 數據傳輸有兩種方式觸發:一種軟件請求(手動)數據,另一種由硬件異步(自動)傳輸。

在第一種情況下,調用的步驟可以概括如下(以read為例):

  1. 在進程調用 read 時,驅動程序的方法分配一個 DMA 緩衝區,隨後指示硬件傳送它的數據。進程進入睡眠。
  2. 硬件將數據寫入 DMA 緩衝區並在完成時產生一箇中斷。
  3. 中斷處理程序獲得輸入數據,應答中斷,最後喚醒進程,該進程現在可以讀取數據了。

第二種情形是在 DMA 被異步使用時發生的。以數據採集設備為例:

  1. 硬件發出中斷來通知新的數據已經到達。
  2. 中斷處理程序分配一個DMA緩衝區。
  3. 外圍設備將數據寫入緩衝區,然後在完成時發出另一箇中斷。
  4. 處理程序利用DMA分發新的數據,喚醒任何相關進程。

  網卡傳輸也是如此,網卡有一個循環緩衝區(通常叫做 DMA 環形緩衝區)建立在與處理器共享的內存中。每一個輸入數據包被放置在環形緩衝區中下一個可用緩衝區,並且發出中斷。然後驅動程序將網絡數據包傳給內核的其它部分處理,並在環形緩衝區中放置一個新的 DMA 緩衝區。驅動程序在初始化時分配DMA緩衝區,並使用它們直到停止運行。



DMA控制器中的寄存器常用參數配置

  1. DMA控制寄存器 【DCON0】
  2. DMA源地址寄存器 【DISR0】
  3. DMA源控制寄存器 【DISRCC0】
  4. DMA目標地址寄存器 【DIDST0】
  5. DMA目標控制寄存器 【DIDSTC0】
  6. DMA狀態寄存器 【DSTAT0】
  7. DMA觸發屏蔽寄存器 【DMASKTRIG0】


  以上寄存器包含對DMA的方向、DMA地址、總線寬度、DMA突發長度等等的配置



DMA與中斷的區別

  1. 中斷方式是在數據緩衝寄存器滿之後發出中斷,要求CPU進行中斷處理,而DMA方式則是在所要求傳送的數據塊全部傳送結束時要求CPU 進行中斷處理。這就大大減少了CPU進行中斷處理的次數。【中斷次數增多導致數據丟失】
  2. 中斷方式的數據傳送是在中斷處理時由CPU控制完成的,而DMA方式則是在DMA控制器的控制下,不經過CPU控制完成的。這就排除了 CPU因並行設備過多而來不及處理以及因速度不匹配而造成數據丟失等現象。