DMA是指外部設備不通過CPU而直接與系統內存交換數據的接口技術。
要把外設的數據讀入內存或把內存的數據傳送到外設,一般都要通過CPU控制完成,如CPU程序查詢或中斷方式。利用中斷進行數據傳送,可以大大提高CPU的利用率。
但是采用中斷傳送有它的缺點,對於一個高速I/O設備,以及批量交換數據的情況,只能采用DMA方式,才能解決效率和速度問題。DMA在外設與內存間直接進行數據交換,而不通過CPU,這樣數據傳送的速度就取決於存儲器和外設的工作速度。
通常系統的總線是由CPU管理的。在DMA方式時,就希望CPU把這些總線讓出來,即CPU連到這些總線上的線處於第三態--高阻狀態,而由DMA控制器接管,控制傳送的字節數,判斷DMA是否結束,以及發出DMA結束信號。DMA控制器必須有以下功能:
1. 能向CPU發出系統保持(HOLD)信號,提出總線接管請求;
2. 當CPU發出允許接管信號后,負責對總線的控制,進入DMA方式;
3. 能對存儲器尋址及能修改地址指針,實現對內存的讀寫操作;
4. 能決定本次DMA傳送的字節數,判斷DMA傳送是否結束
5. 發出DMA結束信號,使CPU恢復正常工作狀態。
如圖是DMA控制器硬件結構示意圖。
DMA的可能引腳說明:
數據總線:用於傳送數據。
地址總線:用於選擇存儲器地址。
數據傳送信號:MEMR為存儲器讀操作信號,MEMW為存儲器寫操作信號,IOR為外設讀操作信號,IOW為外設寫操作信號。
DRQ:DMA請求信號。是外設向DMA控制器提出要求DMA操作的申請信號。
DACK:DMA響應信號。是DMA控制器向提出DMA請求的外設表示已收到請求和正進行處理的信號。
HOLD:總線請求信號。是DMA控制器向CPU要求讓出總線的請求信號。
HLDA:總線響應信號,是CPU向DMA控制器表示允許總線請求的應答信號。
5.2 DMA工作方式
隨着大規模集成電路技術的發展,DMA傳送已不局限於存儲器與外設間的信息交換,而可以擴展為在存儲器的兩個區域之間,或兩種高速的外設之間進行DMA傳送,如圖所示。
DMAC是控制存儲器和外部設備之間直接高速地傳送數據的硬件電路,它應能取代CPU,用硬件完成數據傳送的各項功能。
各種DMAC一般都有兩種基本的DMA傳送方式:
1. 單字節方式:每次DMA請求只傳送一個字節數據,每傳送完一個字節,都撤除DMA請求信號,釋放總線。
2. 多字節方式:每次DMA請求連續傳送一個數據塊,待規定長度的數據塊傳送完以后,才撤除DMA請求,釋放總線。
在DMA傳送中,為了使源和目的間的數據傳送取得同步,不同的DMAC在操作時都受到外設的請求信號或准備就緒信號--Ready信號的限制。
5.3 DMA控制器8237
Intel 8237/8237-2是一種高功能的可編程的DMA控制器,采用5MHz的8237-2傳送,速度可達到1.6M字節/秒。
8237的DMA傳送有以下四種方式:
1. 單字節傳送方式
2. 數據塊傳送方式
3. 請求傳送方式
4. 級連方式
有一個結束處理的輸入信號EOP,允許外界用此輸入端結束DMA傳送或重新初始化。
8237可以級連,任意擴展通道數。
8237的系統結構圖如圖所示。 圖中的通道部分只畫出了一個通道的情況(其實每個通道都有一個一個基地址寄存器(16位)、基字節數計數器(16位)、現行地址寄存器(16位)和現行字節計數器(16位),每一個通道都有一個6位的模式寄存器以控制不同的工作模式)。 8237的結構中包含了三個基本的控制邏輯塊: 1. 時序控制邏輯塊;(根據編程規定的DMAC的工作模式,產生包括DMA請求、DMA傳送以及DMA結束所需要的內部時序和外部信號) 另外,緩沖器、8237的數據引線、地址引線都有三態緩沖器,因而可以接管也可以釋放總線。
|
1. 軟件命令
8237在編程狀態還有兩種軟件命令,軟件命令不需要通過數據總線寫入控制字,而由8237直接對地址和控制信號進行譯碼。命令的格式如下表所示。
1) 清除高/低觸發器
2) 主清除命令
信號 A3 A2 A1 A0 #IOR #IOW |
操作
|
1 0 0 0 0 1
|
讀狀態寄存器
|
1 0 0 0 1 0
|
寫命令寄存器
|
1 0 0 1 0 1
|
非法
|
1 0 0 1 1 0
|
寫請求寄存器
|
1 0 1 0 0 1
|
非法
|
1 0 1 0 1 0
|
寫單屏蔽寄存器位
|
1 0 1 1 0 1
|
非法
|
1 0 1 1 1 0
|
寫模式寄存器
|
1 1 0 0 0 1
|
非法
|
1 1 0 0 1 0
|
清高/低觸發器命令
|
1 1 0 1 0 1
|
讀臨時寄存器
|
1 1 0 1 1 0
|
主清除命令
|
1 1 1 0 0 1
|
非法
|
1 1 1 0 1 0
|
非法
|
1 1 1 1 0 1
|
非法
|
1 1 1 1 1 0
|
寫所有屏蔽位
|
2. 8237的編程步驟
1) 輸出主清除命令
2) 寫入基與現行地址寄存器
3) 寫入基與現行字節數寄存器
4) 寫入模式寄存器
5) 寫入屏蔽寄存器
6) 寫入命令寄存器
7) 寫入請求寄存器。若有軟件請求,就寫入指定通道,可以開始DMA傳送的過程。若無軟件請求,則在完成了(1)--(6)的請求后,由通道的DREQ啟動DMA傳送過程。
3. 編程舉例
若要利用通道0,由外設(磁盤)輸入32K字節的一個數據塊,傳送至內存8000H開始的區域(增量傳送),采用塊連續傳送的方式,傳送完不自動初始化,外設的DREQ和DACK都為高電平有效。
要編程首先要確定端口地址。地址的低4位用以區分8237的內部寄存器,高4位地址A7--A4經譯碼后,連至選片端#CS,假定選中時高4位為5。
初始化程序如下:
OUT 5DH, AL ;輸出主清除命令
MOV AL, 00H
OUT 50H, AL ;輸出基和現行地址的低8位
MOV AL, 80H
OUT 50H, AL ;輸出基和現行地址的高8位
MOV AL, 00H
OUT 51H, AL
MOV AL, 80H
OUT 51H, AL ;給基和現行字節數賦值
MOV AL, 84H
OUT 5BH, AL ;輸出模式字
MOV AL, 00H
OUT 5AH, AL ;輸出屏蔽字
MOV AL, 0A0H
OUT 58H, AL ;輸出命令字