2016-07-30 114 views
1

我對DMA有這個基本的疑問。當CPU放棄了DMA總線進行數據讀取/存儲時,它如何繼續處理?直接內存訪問

我的意思是,即使CPU得到它的指示,通過總線存儲回內存/ IOs,不是嗎?

回答

3

CPUs have cache,所以他們可以做很多沒有任何實際的主內存訪問。即使低功耗系統也傾向於擁有緩存,因爲芯片外驅動信號需要足夠的能量,以便緩存通過節省的能量爲緩存支付自己的能量。

更重要的是,DMA不會「接管」RAM,甚至不一定會使存儲器帶寬飽和。 CPU不會「放棄總線」;內存控制器接受來自CPU內核和其他系統設備的讀/寫請求。由於內存控制器或系統代理仲裁訪問內存,排隊來自所有源的讀取和寫入請求,因此在CPU上運行內存繁重的任務將減慢延遲DMA,反之亦然。

DMA對於仍然比內存帶寬慢得多的傳輸很好。例如SATAIII是6 G /s,而雙通道DDR3-1600MHz的主內存帶寬大約爲25 G Bytes/s。所以編程的io會花大部分時間等待來自SATA控制器的數據,甚至沒有存儲到RAM的瓶頸。


的部分是如何結合在一起的一個現代化的英特爾x86處理器中的一個例子: this diagram of Intel Skylake's system architecture (including eDRAM as memory-side cache)。對不起,我沒有找到更簡單的圖表,只顯示了核心和系統代理,但在沒有eDRAM的系統中,系統代理權限的唯一內容是內存控制器,其他所有內容都保持不變。

存儲器控制器是片內的,所以此圖中唯一的片外連接是PCIe總線。

Skylake system agent diagram, from IDF via ARStechnica

1

有兩種基本類型的DMA使用模式。首先是CPU等待DMA完成時 - 同步操作或阻塞DMA調用。另一種是當CPU發出ASYNC(或非阻塞)DMA請求時。這讓CPU繼續進行常規控制流程。這樣它可以將工作轉移到DMA來做更重要的事情。

如果我正確理解你的問題,並且正如彼得所說的那樣,當一個CPU發出了一個非阻塞的DMA請求,並且DMA正在總線上進行某種操作時,CPU仍然可以執行所有常規操作,包括訪問RAM,因爲總線可以有複用流量。換句話說,公交車可以同時處理多個主人。

一致性和一致性使事情變得更加複雜,通常使用基於硬件支持的正確編程範例來維護。