複製鏈接
請複製以下鏈接發送給好友

DMA方式

鎖定
DMA方式,Direct Memory Access,也稱為成組數據傳送方式,有時也稱為直接內存操作。DMA方式在數據傳送過程中,沒有保存現場、恢復現場之類的工作。
由於CPU根本不參加傳送操作,因此就省去了CPU取指令、取數、送數等操作。內存地址修改、傳送字 個數的計數等等,也不是由軟件實現,而是用硬件線路直接實現的。所以DMA方式能滿足高速I/O設備的要求,也有利於CPU效率的發揮。
中文名
直接內存操作
外文名
Direct Memory Access
常見芯片
Intel 8237A
優    點
速度快

DMA方式工作原理

DMA方式原理

一個設備接口試圖通過總線直接向另一個設備發送數據(一般是大批量的數據),它會先向CPU發送DMA請求信號。外設通過DMA的一種專門接口電路――DMA控制器(DMAC),向CPU提出接管總線控制權的總線請求,CPU收到該信號後,在當前的總線週期結束後,會按DMA信號的優先級和提出DMA請求的先後順序響應DMA信號。CPU對某個設備接口響應DMA請求時,會讓出總線控制權。於是在DMA控制器的管理下,外設和存儲器直接進行數據交換,而不需CPU干預。數據傳送完畢後,設備接口會向CPU發送DMA結束信號,交還總線控制權。
DMA方式的主要優點是速度快。

DMA方式基本操作

實現DMA傳送的基本操作如下:
1、外設可通過DMA控制器向CPU發出DMA請求;
2、CPU響應DMA請求,系統轉變為DMA工作方式,並把總線控制權交給DMA控制器;
3、由DMA控制器發送存儲器地址,並決定傳送數據塊的長度;
4、執行DMA傳送;
5、DMA操作結束,並把總線控制權交還CPU。

DMA方式用途

DMA方式主要適用於一些高速的I/O設備。這些設備傳輸字節或字的速度非常快。對於這類高速I/O設備,如果用輸入輸出指令或採用中斷的方法來傳輸字節信息,會大量佔用CPU的時間,同時也容易造成數據的丟失。而DMA方式能使I/O設備直接和存儲器進行成批數據的快速傳送。
DMA控制器或接口一般包括四個寄存器
1:狀態控制寄存器
4:字節計數器
這些寄存器在信息傳送之前需要進行初始化設置。即在輸入輸出程序中用彙編語言指令對各個寄存器寫入初始化控制字。

DMA方式方式特點

DMA 是所有現代電腦的重要特色,他允許不同速度的硬件裝置來溝通,而不需要依於 CPU 的大量 中斷 負載。否則,CPU 需要從 來源 把每一片段的資料複製到暫存器,然後把他們再次寫回到新的地方。在這個時間中,CPU 對於其他的工作來説就無法使用。
DMA 傳輸將一個內存區從一個裝置複製到另外一個, CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA控制器來實行和完成。典型的例子就是移動一個外部內存的區塊到芯片內部更快的內存去。像是這樣的操作並沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工作。DMA 傳輸對於高效能嵌入式系統算法和網絡是很重要的。
舉個例子,PC ISA DMA控制器擁有 8 個 DMA 通道,其中的 7 個通道是可以讓 PC 的 CPU 所利用。每一個 DMA 通道有一個 16位元 位址暫存器和一個 16 位元計數暫存器。要初始化資料傳輸時,裝置驅動程式一起設定 DMA 通道的位址和計數暫存器,以及資料傳輸的方向,讀取或寫入。然後指示 DMA 硬件開始這個傳輸動作。當傳輸結束的時候,裝置就會以中斷的方式通知 CPU。
但是,DMA傳輸方式只是減輕了CPU的工作負擔;系統總線仍然被佔用。特別是在傳輸大容量文件時,CPU的佔用率可能不到10%,但是用户會覺得運行部分程序時系統變得相當的緩慢。主要原因就是在運行這些應用程序(特別是一些大型軟件),操作系統也需要從系統總線傳輸大量數據;故造成過長的等待時間

DMA方式傳送方式

DMA傳送方式有3種:單元傳送方式、塊傳送方式和on-the-fly傳送方式。與外部DMA請求/應答協議不同的是,DMA傳送方式定義了每次傳送讀/寫的單元數,如表所示。
(1)單元傳送方式(單字節傳送方式)
單元傳送方式意味着每個DMA請求對應一對DMA讀/寫週期,即1個單元讀,然後1個單元寫。
(2)塊傳送方式(連續傳送方式)
塊傳送方式意味着在連續4個字的DMA寫週期前有連續的4個字的DMA讀週期,即4個字突發讀,然後4個字突發寫,因此傳輸的數據個數應該是16字節的倍數。
如果傳送大小或者DMA計數值不是16的倍數,則DMA將不能完整地傳送完數據。假設要傳送的數據為50個字節,則3*16=48字節,會導致2個字節不能被傳送,DMA在傳送48個字節後停止。所以,選擇DMA塊傳送方式時,一定要注意這一點。
(3)on-the-fly傳送方式(請求傳送方式)
在on-the-fly傳送方式下DMA讀/寫可以同時進行。DMA應答信號通知外部設備去讀或者寫。同時,存儲控制器將產生與讀/寫相關的控制信號外部存儲器。如果外部設備能夠支持on-the-fly傳送方式,將會使得外設的數據傳輸速率大大地增加。
停止CPU訪問內存
外圍設備要求傳送一批數據時,由DMA控制器發一個停止信號給CPU,要求CPU放棄對地址總線數據總線和有關控制總線的使用權。DMA控制器獲得總線控制權以後,開始進行數據傳送。在一批數據傳送完畢後,DMA控制器通知CPU可以使用內存,並把總線控制權交還給CPU。在這種DMA傳送過程 中,CPU基本處於不工作狀態或者説保持狀態。
優點:控制簡單,它適用於數據傳輸率很高的設備進行成組傳送
缺點:在DMA控制器訪內階段,內存的效能沒有充分發揮,相當一部分內存工作週期是空閒的。這是因為,外圍設備傳送兩個數據之間的間隔一般總是大於內存存儲週期,即使高速I/O設備也是如此。
當I/O設備沒有DMA請求時,CPU按程序要求訪問內存;一旦I/O設備有DMA請求,則由I/O設備挪用一個或幾個內存週期。
I/O設備要求DMA傳送時可能遇到兩種情況:
(1)此時CPU不需要訪內,如CPU正在執行乘法指令。由於乘法指令執行時間較長,此時I/O訪內與CPU訪內沒有衝突,即I/O設備挪用一二個內存週期對CPU執行程序沒有任何影響。
(2)I/O設備要求訪內時CPU也要求訪內,這就產生了訪內衝突,在這種情況下I/O設備訪內優先,因為I/O訪內有時間要求,前一個I/O數據必須在下一個訪內請求到來之前存取完畢。顯然,在這種情況下I/O設備挪用一二個內存週期,意味着CPU延緩了對指令的執行,或者更明確地説,在CPU執行訪內指令的過程中插入DMA請求,挪用了一二個內存週期。
與停止CPU訪內的DMA方法比較,週期挪用的方法既實現了I/O傳送,又較好地發揮了內存和CPU的效率,是一種廣泛採用的方法。但是I/O設備每一次週期挪用都有申請總線控制權、建立總線控制權和歸還總線控制權的過程,所以傳送一個字對內存來説要佔用一個週期,但對DMA控制器來説一般要2—5個 內存週期(視邏輯線路的延遲而定)。因此,週期挪用的方法適用於I/O設備讀寫週期大於內存存儲週期的情況。
DMA與CPU交替訪問
如果CPU的工作週期比內存存取週期長很多,此時採用交替訪內的方法可以使DMA傳送和CPU同時發揮最高的效率。假設CPU工作週期為 1.2μs,內存存取週期小於0.6μs,那麼一個CPU週期可分為C1和C2兩個分週期,其中C1供DMA控制器訪內,C2專供CPU訪內。
這種方式不需要總線使用權的申請、建立和歸還過程,總線使用權是通過C1和C2分時進行的。CPU和DMA控制器各自有自己的訪內地址寄存器、數據寄存 器和讀/寫信號等控制寄存器。在C1週期中,如果DMA控制器有訪內請求,可將地址、數據等信號送到總線上。在C2週期中,如CPU有訪內請求,同樣傳送 地址、數據等信號。事實上,對於總線,這是用C1,C2控制的一個多路轉換器,這種總線控制權的轉移幾乎不需要什麼時間,所以對DMA傳送來講效率是很高的。
這種傳送方式又稱為“透明的DMA”方式,其來由是這種DMA傳送對CPU來説,如同透明的玻璃一般,沒有任何感覺或影響。在透明的DMA方式下工作,CPU既不停止主程序的運行,也不進入等待狀態,是一種高效率的工作方式。當然,相應的硬件邏輯也就更加複雜。

DMA方式工作過程

預處理階段
測試設備狀態;向DMA控制器的設備地址寄存器中送入設備號,並啓動設備;向主存地址計數器中送入欲交換數據的主存起始地址;向字計數器中送入欲交換的數據個數 。
外部設備準備好發送的數據(輸入)或上次接收的數據已處理完畢(輸出)時,將通知DMA控制器發出DMA請求,申請主存總線。
數據傳送
輸入操作 
①.首先從外部設備讀入一個字(設每字16位)到DMA數據緩衝寄存器IODR中(如果設備是面向字節的,一次讀入一個字節,需要將兩個字節裝配成一個字)。
②.外部設備選通脈衝,使DMA控制器中的DMA請求標誌觸發器置“1”。
③.DMA控制器向CPU發出總線請求信號(HOLD)。
④.CPU在完成了現行機器週期後,即響應DMA請求,發出總線允許信號(HLDA),並由DMA控制器發出DMA響應信號,使DMA請求標記觸發器復位。此時,由DMA控制器接管系統總線
⑤.將DMA控制器中主存地址寄存器中的主存地址送地址總線
⑥.將DMA數據緩衝寄存器中的內容送數據總線
⑦.在讀/寫控制信號線上發出寫命令。
⑧.將DMA地址寄存器的內容加1,從而得到下一個地址,字計數器減1。
⑨.判斷字計數器的值是否為“0”。若不為“0”,説明數據塊沒有傳送完畢,返回⑤,傳送下一個數據;若為“0”,説明數據塊已經傳送完畢,則向CPU申請中斷處理
輸出操作
①.當DMA數據緩衝寄存器已將輸出數據送至I/O設備後,表示數據緩衝寄存器為“空”;
②.外部設備發選通脈衝,使DMA控制器中的DMA請求標誌觸發器置“1”;
③.DMA控制器向CPU發出總線請求信號(HOLD);
④.CPU在完成了現行機器週期後,即響應DMA請求,發出總線允許信號(HLDA),並由DMA控制器發出DMA響應信號,使DMA請求標記觸發器復位。此時,由DMA控制器接管系統總線;
⑤.將DMA控制器中主存地址寄存器中的主存地址送地址總線,在讀/寫控制信號線上發出讀命令;
⑥.主存將相應地址單元的內容通過數據總線讀入到DMA數據緩衝寄存器中;
⑦.將DMA數據緩衝寄存器的內容送到輸出設備
⑧.將DMA地址寄存器的內容加1,從而得到下一個地址,字計數器減1;
⑨.判斷字計數器的值是否為“0”。若不為“0”,説明數據塊沒有傳送完畢,返回到⑤,傳送下一個數據;若為“0”,説明數據塊已經傳送完畢,則向CPU申請中斷處理。
校驗送入主存的數據是否正確。
決定是否繼續用DMA傳送其他數據塊
測試在傳送過程中是否發生錯誤。