直接記憶體存取 (DMA) 是一種使電腦能夠更有效地傳輸資料的方法。DMA 控制器不是由 CPU 處理每次傳輸,而是直接在記憶體和裝置之間傳送資料。這樣可以節省時間,降低功耗,並允許 CPU 專注於其他任務。

直接記憶體存取概述
直接記憶體存取 (DMA) 是電腦用來更有效率地移動資料的方法。CPU 負責監督將資訊從電腦內部的一個位置傳送到另一個位置。這需要時間,並使 CPU 忙於小任務。
使用 DMA 時,系統中稱為 DMA 控制器的特殊部分會接管這項工作。它允許設備直接從電腦記憶體發送或接收數據,而無需讓 CPU 處理每個步驟。在傳輸發生時,CPU 可以自由地繼續處理其他任務。
這種設定使系統運行更加流暢,因為 CPU 不會因不斷的資料移動而減慢速度。它還有助於節省電量並提高電腦的整體效能。
直接記憶體存取功能
高速資料傳輸
DMA 允許快速傳輸大型資料區塊,無需 CPU 參與,從而提高吞吐量。
CPU卸載
CPU 擺脫了重複的資料移動任務,使其可用於計算。
減少中斷開銷
與編程 I/O 相比,DMA 最大限度地減少了中斷次數,從而降低了系統開銷。
直接記憶體
週邊設備可以直接讀取或寫入記憶體,避免額外的 CPU 介導副本。
多通道支持
現代 DMA 控制器支援多個獨立通道,實現並發傳輸。
突發傳輸能力
DMA 支援突發模式,以一個連續的串流傳輸資料區塊以提高效率。
優先權和仲裁
DMA 控制器使用優先順序層級來決定哪個通道可以存取記憶體匯流排。
傳輸模式
根據系統需求支援不同的模式,如單次、區塊、突發和基於需求的傳輸。
與多輛匯流排的兼容性
與各種系統匯流排配合使用,實現靈活整合。
錯誤偵測與處理
許多 DMA 系統都包括奇偶校驗或糾錯,以確保資料完整性。
記憶體到記憶體傳輸
某些 DMA 控制器允許將資料從一個記憶體位置直接複製到另一個記憶體位置,而無需 CPU 幹預。
逐步 DMA 操作
| 步驟 | 發生了什麼? | 信號/行動 |
|---|---|---|
| 1 | 裝置要求 DMA 服務。 | DRQ (DMA 要求) 線路已啟用 |
| 2 | DMA 控制器要求控制系統匯流排。 | BR(巴士請求) |
| 3 | CPU 會暫時將匯流排釋放至 DMA 控制器。 | BG(巴士補助金) |
| 4 | DMA 控制器設定要傳輸的記憶體位址和字數(資料單位)。 | 地址和計數寄存器 |
| 5 | 資料直接在 I/O 裝置和 RAM 之間傳輸,繞過 CPU。 | 直接轉賬 |
| 6 | 完成後,DMA 控制器會通知 CPU。 | INTR(中斷) |
DMA控制器及其連接

主要部分是CPU、記憶體、DMA控制器和輸入/輸出(I/O)設備。DMA 控制器可監督記憶體和 I/O 裝置之間的資料移動,而不需要 CPU 來執行所有工作。
當 I/O 裝置需要傳送或接收資料時,它會將要求傳送至 DMA 控制器。然後控制器請求 CPU 使用系統匯流排的權限,這是電腦內部資料的主要路徑。一旦 CPU 允許,DMA 控制器就會控制並直接在記憶體和 I/O 裝置之間傳輸資料。傳輸完成後,它會通知 CPU 工作已完成。
該圖還顯示了攜帶信息的不同線。地址線(灰色)決定數據的去向,數據線(綠色)攜帶實際信息,控制線(橙色)管理流程。DMA 匯流排會將數個 I/O 裝置連接至控制器。此設定有助於系統更順利地處理數據,並使 CPU 能夠騰出時間來執行其他任務。
DMA 傳輸模式及其差異
| 模式 | 運作方式 | 速度 | CPU 影響 |
|---|---|---|---|
| 連拍模式 | 以一個連續的順序傳輸整個資料區塊 | 非常高 | CPU 停止,直到傳輸結束 |
| 偷自行車 | 每個匯流排週期傳輸一個字,與 CPU 週期交錯 | 中號 | CPU稍微變慢了,但沒有停止 |
| 透明模式 | 僅在 CPU 閒置或未使用匯流排時傳輸 | 較低 | CPU 不間斷運行 |
DMA主要款式
匯流排母帶處理(第一方 DMA)
在匯流排主控中,設備本身暫時承擔系統匯流排控制器的角色。這意味著它可以直接讀取或寫入內存,而無需持續的 CPU 監督。由於設備管理自己的傳輸,因此該過程非常快速和高效。PCIe GPU、NVMe 驅動器和網卡等現代高性能組件經常使用這種方法。在這些傳輸過程中,CPU 大部分是空閒的,這提高了整體系統性能。
第三方DMA(基於控制器)
在此模型中,中央 DMA 控制器負責代表多個設備處理資料傳輸。每個設備將其請求發送到控制器,然後控制器控制總線以移動數據。這種方法是早期電腦系統的標準,並且在嵌入式微控制器中仍然很常見,因為硬體必須保持簡單且經濟高效。它比總線母帶處理慢,因為所有設備共享相同的控制器,這會帶來等待時間和開銷。
分散收集 DMA
在許多情況下,記憶體中的資料不會儲存在一條直線上。它可以分成不同的地方。分散收集 DMA 可以一次移動所有這些數據,即使它是分散的。
DMA 控制器會保留每段資料所在位置的清單。然後,它按照該列表收集碎片並將它們作為單個塊轉移。
分散收集 DMA 的好處
• 移動分散的數據,無需額外步驟。
• 需要更少的 CPU 信號。
• 使資料傳輸更快、更順暢。
• 透過避免額外的副本來節省記憶體空間。
DMA 和快取同步
DMA 直接在裝置和記憶體之間移動數據,而 CPU 通常使用自己的快取。因此,CPU 和 DMA 有時可以看到相同資料的不同版本。這是一個問題,因為如果 CPU 緩存仍然有舊數據,則設備所做的更改可能會被忽略。如果 CPU 的快取中只有新數據,裝置可能會從記憶體中讀取過時的值。它是通過以下方式修復的:
• CPU 可以在設備讀取之前刷新緩存,因此內存具有最新的數據。
• CPU 可以在設備寫入後使緩存失效,因此它會從內存加載更新的數據。
• 現代處理器使用快取一致性 DMA,它會自動處理此問題。
IOMMU 在 DMA 安全中的作用
| 專題 | 功能 | 好處 |
|---|---|---|
| 地址映射 | 將裝置 DMA 要求轉換為有效的記憶體位址 | 防止意外或有害的資料損毀 |
| 隔離 | 將每個裝置限制在其指定的記憶體區域 | 保護系統免受故障或惡意裝置的侵害 |
| 64 位元支援 | 將定址擴展到 32 位限制之外 | 支援具有大記憶體需求的現代裝置 |
安全問題:DMA 攻擊與保護
安全風險
• 透過未經授權的 DMA 存取竊取資料。
• 惡意軟件注入系統內存。
• 霹靂邪惡女僕對筆記本電腦的攻擊。
2 保護
• 啟用 IOMMU / VT-d / AMD-Vi。
• 使用核心 DMA 保護 (Windows)。
• 禁用未使用的外部端口。
• 使用安全核心 PC 和 BIOS/UEFI 限制。
DMA的不同應用
磁碟和儲存傳輸
DMA 允許硬碟、SSD 和光碟機將大塊資料直接移動到記憶體中,而不會對 CPU 造成負擔。
網路介面
網卡使用 DMA 快速傳輸傳入和傳出數據包,從而在不降低處理器速度的情況下實現高速通信。
音訊和視訊處理
音效卡、圖形處理器和視訊擷取裝置依賴 DMA 以最小的延遲處理連續資料流。
嵌入式系統
微控制器使用 DMA 來卸載重複的資料移動 (例如 ADC 讀數或 UART 緩衝區),從而釋放 CPU 週期用於控制任務。
圖形渲染
GPU 應用 DMA 進行紋理載入和幀緩衝區更新,支援遊戲和視覺應用程式中的平滑渲染。
結論
直接記憶體存取 (DMA) 透過直接在記憶體和裝置之間移動資料,而無需依賴 CPU,從而提高電腦效率。這減少了延遲,降低了功耗,並允許在儲存、網路和圖形等任務中更流暢地運作。憑藉內建的錯誤處理和安全功能,DMA 仍然是快速且有效率的資料傳輸的可靠方法。
常見問題 [FAQ]
DMA 與編程 I/O 有何不同?
DMA 使用控制器傳輸數據,而編程 I/O 每次傳輸都依賴 CPU。
DMA如何節省電力?
它將 CPU 從持續傳輸中解放出來,使其能夠更頻繁地進入低功耗狀態。
DMA可以存取哪些記憶體?
DMA 可以存取系統 RAM、視訊記憶體、緩衝區內存,有時還可以在記憶體區域之間複製資料。
DMA 可以同時處理多個設備嗎?
是的,DMA 控制器使用優先順序和仲裁來決定哪個裝置先傳輸。
DMA 的主要限制是什麼?
它對於小型傳輸效率低下,並且如果沒有適當的同步,可能會導致快取不一致。
為什麼DMA在實際系統中很重要?
它提供快速、低延遲的資料傳輸,因此 CPU 可以專注於時間緊迫的任務。