2010-10-03 129 views
20

DMA和內存映射IO之間有什麼區別?他們都和我很相似。DMA和內存映射IO之間有什麼區別?

+0

也有關:[Linux設備驅動程序,第2版:第13章:mmap和DMA](http://www.xml.com/ldd/chapter/book/ch13.html);不過,首先閱讀這裏的答案幫助了我很多。 – sdaau 2014-01-22 12:29:18

回答

31

內存映射I/O允許CPU通過讀寫特定內存地址來控制硬件。通常這將用於低帶寬操作,例如更改控制位。

DMA允許硬件直接讀取和寫入內存沒有涉及CPU。通常這將用於高帶寬操作,如磁盤I/O或攝像機視頻輸入。

+0

所以他們基本上是一樣的東西,但方向相反? – f126ck 2017-01-23 21:25:03

+0

不完全。 DMA是當兩個不是CPU的設備使用內存總線進行通信時(一個設備通常是主內存,並且該過程由CPU編排)。內存映射IO是CPU在不是主內存的內存總線上與設備交談。 – jdizzle 2017-07-30 04:11:43

+0

即使dma引擎在設備中,爲什麼還需要映射dma緩衝區? – ransh 2018-02-07 12:50:28

10

內存映射IO意味着設備寄存器映射到機器的內存空間 - 當這些內存區域被CPU讀取或寫入時,它從設備讀取或寫入設備,而不是實際內存。爲了將數據從設備傳輸到實際的內存緩衝區,CPU必須從內存映射設備寄存器讀取數據並將其寫入緩衝區(並將數據傳輸到設備)。

通過DMA傳輸,器件能夠直接向真實存儲器緩衝區本身傳輸數據或從其中傳輸數據。 CPU通知設備緩衝區的位置,然後可以在設備直接訪問內存時執行其他工作。

17

由於其他人已經回答了這個問題,我只是補充一點歷史。

回到過去,在x86(PC)硬件上,只有I/O空間和內存空間。這些是兩個不同的地址空間,通過不同的總線協議和不同的CPU指令訪問,但能夠通過相同的插卡槽進行通信。

大多數設備使用控制接口和批量數據傳輸接口的I/O空間。訪問數據的簡單方法是執行大量的CPU指令從一個I/O地址一次一個字地傳輸數據到一個內存地址(有時稱爲「位撞」)。

爲了移動從設備到主機內存的數據自主,ISA總線協議中不支持設備啓動傳輸。發明了一種折中解決方案:DMA控制器。這是一塊硬件,由CPU坐起來,發起傳輸以將數據從設備的I/O地址移動到內存,反之亦然。因爲I/O地址是相同的,所以DMA控制器完成與CPU相同的操作,但效率更高一些,並允許一些自由來保持在後臺運行(儘管可能不會持續很長時間與記憶交談)。

快速進入PCI時代,總線協議變得更加智能:任何設備都可以啓動傳輸。因此,例如,RAID控制卡可以在任何喜歡的時間移動喜歡的任何數據或從主機移動。這被稱爲「總線主控」模式,但由於沒有特殊原因,即使舊的DMA控制器早已不存在,人們仍將此模式稱爲「DMA」。與舊的DMA傳輸不同,通常根本不存在相應的I/O地址,並且總線主控模式通常是設備上唯一存在的接口,根本沒有CPU「比特砰擊」模式。

+3

在Linux內核中'DMA'被超過5000個C文件提及,這可能是每個人都在談論DMA的原因。 – JohnnyFromBF 2015-06-17 16:35:20

0

直接內存訪問(DMA)是一種將數據從I/O傳輸到內存和從內存傳輸到I/O而無需CPU干預的技術。爲此,使用名爲DMA控制器的特殊芯片來控制數據的所有活動和同步。因此,與其他數據傳輸技術相比,DMA要快得多。

另一方面,虛擬內存充當主內存和輔助內存之間的緩存。預先將數據從輔助存儲器(硬盤)提取到主存儲器中,以便在需要時可以在主存儲器中使用數據。它允許我們在系統上運行更多的應用程序,而不是有足夠的物理內存來支持。

相關問題