2006-01-24 09:39:08熟女RD

直接記憶體存取(direct memory access,DMA)

資料來源: http://www.ltivs.ilc.edu.tw/kocp/mpu/m5/m5-7.htm
直接記憶體存取(direct memory access,DMA)為一個特殊的硬體結構,它允許介面裝置與記憶體之間直接轉移資料,而不需經由CPU的參與。在週邊與記憶體之間需要大量資料轉移時,此種方式是一種不需要中斷服務程式的中斷服務,直接由硬體完成此特定的工作,節省了許多程式執行的時間。

在個人電腦當中如果是使用Windows系統的話,在系統裝置當中應該能看得到"直接記憶體存取控制器"(DMAC)這一個裝置;DMAC是這個架構中負責行使直接記憶體存取的控制晶片,整個DMA的工作程序描述如下:

(1)一個週邊的I/O裝置須要直接記憶體存取時,以DRQ=1向DMAC提出DMA請求。

(2)DMAC以HRQ=1通知CPU 的HOLD端。

(3)CPU執行完畢目前的匯流排週期,將位址匯流排、資料匯流排以及控制匯流排置於高阻抗狀態,亦即與CPU接腳中分離,然後啟動HLDA=1告知DMAC可以使用系統匯流排了。

(4)DMAC將事先以程式規劃好的位址計數器內容轉移至位址匯流排。

(5)接著以DACK=1通知I/O裝置位址線已備妥。

(6)啟動記憶體及I/O裝置的讀或寫控制線,完成第一筆資料的轉移。如果DMAC設定在區段模式,DMAC會將位址計數器加一,語句計數器減一,再回到前一個步驟,直到DMAC中的語句計數器等於零。

(7)DMAC釋放控制權將所有匯流排開路,移除DMA請求,以HRQ=0通知 DMA工作已經結束,CPU得知後以HLDA=0回應,並收回匯流排控制權繼續原先的工作。

由於DMAC通常是一只IC,為了適合各種場合的需要,在設計時就規劃了多種工作模式,只要在使用前以程式寫入一些資料至它的內部暫存器,就可以選擇工作模式,典型的DMAC晶片82C37A就有以下四種工作模式。
1. 單一轉移模式(single transfer mode)
2. 區段轉移模式(block transfer mode)
3. 要求轉移模式(demand transfer)
4. 串接模式(cascade mode)

單一轉移模式中,週邊設備每啟動一次DRQ,DMAC僅轉移一筆資料就把匯流排控制權交回CPU。

區段轉移模式時,DRQ只需維持啟動狀態到DACK回應為止,DMAC就可以將整個區段的資料轉移完畢。

要求轉移模式與區段轉移模式類似,但每轉移一筆資料都重新檢查DRQ,若DRQ不在啟動狀態則暫停DMA的工作,並將匯流排控制權交還CPU,直到DRQ再啟動時,再從上次暫停的位址繼續轉移至最後一筆資料。

由以上所知,降低的並不是處理器的速度,而是佔據系統匯流排的時間,處理器由DMAC發出匯流排使用請求一直到將控制權交回給處理器,較為忙碌的應該是DMAC而非處理器,了不起只佔據處理器四個時脈週期的時間而已,並不會降低處理器的速度喔!