DMA方式
DMA方式
DMA方式,Direct Memory Access,也稱為成組數據傳送方式,有時也稱為直接內存操作。DMA方式在數據傳送過程中,沒有保存現場、恢復現場之類的工作。
由於CPU根本不參加傳送操作,因此就省去了CPU取指令、取數、送數等操作。內存地址修改、傳送字 個數的計數等等,也不是由軟體實現,而是用硬體線路直接實現的。所以DMA方式能滿足高速I/O設備的要求,也有利於CPU效率的發揮。
DMA方式
DMA方式的主要優點是速度快。
實現DMA傳送的基本操作如下:
1、外設可通過DMA控制器向CPU發出DMA請求;
2、CPU響應DMA請求,系統轉變為DMA工作方式,並把匯流排控制權交給DMA控制器;
3、由DMA控制器發送存儲器地址,並決定傳送數據塊的長度;
4、執行DMA傳送;
5、DMA操作結束,並把匯流排控制權交還CPU。
DMA方式主要適用於一些高速的I/O設備。這些設備傳輸位元組或字的速度非常快。對於這類高速I/O設備,如果用輸入輸出指令或採用中斷的方法來傳輸位元組信息,會大量佔用CPU的時間,同時也容易造成數據的丟失。而DMA方式能使I/O設備直接和存儲器進行成批數據的快速傳送。
DMA控制器或介面一般包括四個寄存器:
1:狀態控制寄存器、
2:數據寄存器、
3:地址寄存器、
4:位元組計數器。
這些寄存器在信息傳送之前需要進行初始化設置。即在輸入輸出程序中用彙編語言指令對各個寄存器寫入初始化控制字。
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傳送方式表
(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請求,申請主存匯流排。
數據傳送
輸入操作
①.首先從外部設備讀入一個字(設每字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傳送其他數據塊。
測試在傳送過程中是否發生錯誤。