算機(jī)組成原理:DMA方式與中斷方式對(duì)比及三種傳送方式詳解)
1. 從一道408真題說起DMA到底在考什么如果你正在準(zhǔn)備計(jì)算機(jī)408統(tǒng)考或者本科學(xué)到《計(jì)算機(jī)組成原理》的I/O系統(tǒng)這一章大概率會(huì)在選擇題里反復(fù)遇到DMA相關(guān)的題目。尤其是2024年那道第45題把DMA方式和中斷方式放在一起對(duì)比考的就是“誰在什么時(shí)候向CPU要總線”“數(shù)據(jù)傳送的單位是什么”“CPU到底有沒有被完全解放”這幾個(gè)核心點(diǎn)。很多人背了“DMA是直接存儲(chǔ)器訪問”這句話但一到做題就分不清DMA請(qǐng)求和中斷請(qǐng)求的觸發(fā)時(shí)機(jī)也搞不明白周期挪用和停止CPU訪存這兩種方式的區(qū)別。這篇文章就是沖著這個(gè)痛點(diǎn)來的。我會(huì)把DMA方式從“為什么需要它”開始拆一直講到三種DMA傳送方式的時(shí)序差異、DMA控制器的內(nèi)部結(jié)構(gòu)、與中斷方式的本質(zhì)區(qū)別以及408考試?yán)锍R姷某鲱}角度。不管你是考研黨、期末突擊的本科生還是想從底層理解I/O傳送機(jī)制的開發(fā)者這篇內(nèi)容都能幫你把DMA這條線徹底理清楚。先給一個(gè)最簡結(jié)論DMA方式的核心價(jià)值在于讓數(shù)據(jù)傳送過程不經(jīng)過CPU的寄存器中轉(zhuǎn)由專門的硬件控制器直接在I/O設(shè)備和主存之間搬運(yùn)數(shù)據(jù)。CPU只需要在傳送開始前做初始化傳送結(jié)束后處理一下收尾工作中間的大批量數(shù)據(jù)搬運(yùn)它完全可以不管。這就是為什么磁盤、網(wǎng)卡、顯卡這些高速設(shè)備都離不開DMA。但“不管”不等于“完全不參與”。DMA控制器要占用總線而總線是CPU和主存通信的公共通道所以DMA和CPU之間必然存在總線爭用問題。怎么爭、爭多久、爭的時(shí)候CPU怎么辦這就是三種DMA傳送方式要解決的問題也是408最愛考的地方。2. DMA控制器的內(nèi)部構(gòu)造與工作流程拆解2.1 DMA控制器里到底裝了哪些寄存器要理解DMA怎么工作先得知道DMA控制器DMAC內(nèi)部有哪些關(guān)鍵部件。你可以把它想象成一個(gè)專門負(fù)責(zé)搬貨的小工他手里必須拿著幾張單子才能干活。主存地址寄存器AR記錄當(dāng)前要讀寫的主存地址。每傳送一個(gè)數(shù)據(jù)這個(gè)地址會(huì)自動(dòng)加一或減一指向下一個(gè)存儲(chǔ)單元。初始值由CPU在初始化階段寫入。字計(jì)數(shù)器WC記錄還剩多少個(gè)數(shù)據(jù)要傳送。每傳送一個(gè)數(shù)據(jù)計(jì)數(shù)器減一。當(dāng)計(jì)數(shù)器減到零時(shí)DMA控制器會(huì)向CPU發(fā)出一個(gè)“傳送結(jié)束”的信號(hào)通常表現(xiàn)為中斷請(qǐng)求。初始值也是CPU寫入的等于要傳送的數(shù)據(jù)塊長度。數(shù)據(jù)緩沖寄存器DR暫時(shí)存放每次傳送的數(shù)據(jù)。對(duì)于輸入方向設(shè)備的數(shù)據(jù)先進(jìn)入DR再寫到主存對(duì)于輸出方向主存的數(shù)據(jù)先讀到DR再送到設(shè)備。設(shè)備地址寄存器DAR存放I/O設(shè)備的地址或設(shè)備號(hào)用來選中本次傳送的目標(biāo)設(shè)備??刂婆c狀態(tài)邏輯包括DMA請(qǐng)求觸發(fā)器、中斷機(jī)構(gòu)、控制電路等。它負(fù)責(zé)接收設(shè)備的DMA請(qǐng)求向CPU發(fā)出總線請(qǐng)求信號(hào)在獲得總線控制權(quán)后產(chǎn)生讀寫命令和地址選通信號(hào)控制整個(gè)傳送過程。中斷機(jī)構(gòu)當(dāng)字計(jì)數(shù)器歸零時(shí)向CPU發(fā)出中斷請(qǐng)求通知CPU“這批數(shù)據(jù)搬完了你可以來做收尾了”。這幾部分協(xié)同工作的流程用一句話概括就是CPU初始化參數(shù)設(shè)備發(fā)出請(qǐng)求DMAC向CPU申請(qǐng)總線拿到總線后直接在設(shè)備和主存之間搬數(shù)據(jù)搬完后通過中斷通知CPU。2.2 一次完整的DMA傳送經(jīng)歷了什么我把一次DMA傳送的完整過程拆成三個(gè)階段這樣你在做題時(shí)能清楚地知道每個(gè)階段誰在控制總線。第一階段預(yù)處理階段。CPU執(zhí)行幾條I/O指令把主存起始地址寫入AR把傳送字?jǐn)?shù)寫入WC把設(shè)備地址寫入DAR把傳送方向讀還是寫和控制信息寫入控制寄存器。然后CPU啟動(dòng)設(shè)備繼續(xù)執(zhí)行主程序。這個(gè)階段CPU是主動(dòng)的但它只做了參數(shù)配置沒有搬運(yùn)任何數(shù)據(jù)。第二階段數(shù)據(jù)傳送階段。I/O設(shè)備準(zhǔn)備好一個(gè)數(shù)據(jù)后向DMAC發(fā)出DMA請(qǐng)求。DMAC向CPU發(fā)出總線請(qǐng)求BRCPU在當(dāng)前總線周期結(jié)束后釋放總線發(fā)出總線允許信號(hào)BG。DMAC獲得總線控制權(quán)后向設(shè)備發(fā)出讀寫命令同時(shí)把AR中的地址送到地址總線完成一個(gè)數(shù)據(jù)在設(shè)備和主存之間的直接傳送。每傳送一個(gè)數(shù)據(jù)AR加一WC減一。這個(gè)階段完全由DMAC控制總線CPU不能訪存。第三階段后處理階段。當(dāng)WC減到零時(shí)DMAC向CPU發(fā)出中斷請(qǐng)求。CPU響應(yīng)中斷后執(zhí)行中斷服務(wù)程序檢查傳送是否出錯(cuò)處理善后工作然后繼續(xù)原來的程序。這個(gè)階段CPU重新拿回總線控制權(quán)。注意DMA方式下CPU并沒有完全“閑著”。預(yù)處理和后處理都需要CPU參與只是中間大批量數(shù)據(jù)搬運(yùn)不需要CPU介入。408選擇題經(jīng)常在這里設(shè)陷阱說“DMA方式下CPU完全不參與I/O過程”這是錯(cuò)的。2.3 DMA請(qǐng)求和中斷請(qǐng)求的本質(zhì)區(qū)別很多人分不清DMA請(qǐng)求和中斷請(qǐng)求其實(shí)它們解決的是完全不同的問題。中斷請(qǐng)求是設(shè)備告訴CPU“我有一件事需要你處理”比如鍵盤按下了、磁盤讀完了一個(gè)扇區(qū)需要CPU來取數(shù)據(jù)。中斷請(qǐng)求的響應(yīng)發(fā)生在一條指令執(zhí)行完畢之后CPU需要保存現(xiàn)場(chǎng)、跳轉(zhuǎn)到中斷服務(wù)程序、執(zhí)行指令來搬運(yùn)數(shù)據(jù)。數(shù)據(jù)傳送必須經(jīng)過CPU的寄存器。DMA請(qǐng)求是設(shè)備告訴DMAC“我準(zhǔn)備好了一個(gè)數(shù)據(jù)你可以來搬了”。DMAC再向CPU申請(qǐng)總線。DMA請(qǐng)求的響應(yīng)發(fā)生在總線周期結(jié)束時(shí)不需要CPU執(zhí)行任何指令來搬運(yùn)數(shù)據(jù)數(shù)據(jù)直接在設(shè)備和主存之間流動(dòng)。用一個(gè)生活類比中斷方式就像你每次收快遞都要親自下樓去拿拿上來還要拆開放到指定位置DMA方式就像你雇了一個(gè)搬運(yùn)工快遞到了他直接幫你搬到倉庫你只需要告訴他倉庫地址和一共幾件貨搬完了他會(huì)通知你一聲。這個(gè)區(qū)別直接決定了兩種方式的適用場(chǎng)景中斷方式適合低速、少量、隨機(jī)出現(xiàn)的I/O請(qǐng)求DMA方式適合高速、大批量、連續(xù)的數(shù)據(jù)塊傳送。3. 三種DMA傳送方式CPU到底什么時(shí)候讓出總線這是408考試的核心考點(diǎn)也是實(shí)際硬件設(shè)計(jì)中最關(guān)鍵的取舍。三種方式分別是停止CPU訪存、周期挪用也叫周期竊取、交替訪問。它們的區(qū)別本質(zhì)上是“DMAC和CPU怎么分時(shí)使用總線”的問題。3.1 停止CPU訪存方式簡單粗暴但浪費(fèi)嚴(yán)重這種方式下當(dāng)DMAC需要傳送數(shù)據(jù)時(shí)它向CPU發(fā)出一個(gè)停止信號(hào)CPU收到后完全放棄總線控制權(quán)把總線讓給DMAC。DMAC可以連續(xù)不斷地傳送整個(gè)數(shù)據(jù)塊直到全部傳完才把總線還給CPU。優(yōu)點(diǎn)控制簡單DMAC不需要復(fù)雜的時(shí)序邏輯數(shù)據(jù)傳送速率很高因?yàn)镈MAC可以獨(dú)占總線連續(xù)工作。缺點(diǎn)CPU在DMA傳送期間完全不能訪存如果數(shù)據(jù)塊很大CPU會(huì)被“凍結(jié)”很長時(shí)間。實(shí)際上CPU在此期間只能做一些不需要訪存的操作比如執(zhí)行寄存器之間的運(yùn)算但現(xiàn)代程序幾乎每幾條指令就要訪存所以CPU實(shí)際上處于停滯狀態(tài)。適用場(chǎng)景數(shù)據(jù)塊傳送速率極高、CPU在此期間確實(shí)沒有緊急訪存需求的場(chǎng)合。實(shí)際中很少單獨(dú)使用因?yàn)槔速M(fèi)太嚴(yán)重。從408出題角度看這種方式的關(guān)鍵特征是DMAC獨(dú)占總線CPU在傳送期間無法訪存?zhèn)魉徒Y(jié)束后CPU才恢復(fù)。題目可能會(huì)問“這種方式下CPU是否參與傳送”答案是CPU不參與數(shù)據(jù)搬運(yùn)但被強(qiáng)制暫停訪存。3.2 周期挪用方式像“插空”一樣搶總線周期挪用Cycle Stealing是目前實(shí)際系統(tǒng)中最常用的方式。它的核心思想是DMAC每次只申請(qǐng)一個(gè)總線周期傳送一個(gè)數(shù)據(jù)后就釋放總線CPU可以繼續(xù)訪存。如果下一個(gè)數(shù)據(jù)準(zhǔn)備好了DMAC再申請(qǐng)下一個(gè)總線周期。這里有一個(gè)關(guān)鍵的優(yōu)先級(jí)問題當(dāng)DMAC和CPU同時(shí)請(qǐng)求訪存時(shí)誰的優(yōu)先級(jí)更高答案是DMAC的優(yōu)先級(jí)更高。因?yàn)镮/O設(shè)備的數(shù)據(jù)傳送有嚴(yán)格的時(shí)間要求如果數(shù)據(jù)沒有及時(shí)取走可能會(huì)被后續(xù)數(shù)據(jù)覆蓋導(dǎo)致丟失。而CPU的訪存請(qǐng)求可以推遲一兩個(gè)周期對(duì)程序執(zhí)行影響很小。周期挪用方式下DMAC的請(qǐng)求可能遇到兩種情況第一種CPU正在執(zhí)行不需要訪存的指令比如寄存器運(yùn)算DMAC可以直接獲得總線不影響CPU。第二種CPU正在訪存DMAC需要等待當(dāng)前總線周期結(jié)束后才能獲得總線這會(huì)“挪用”一個(gè)或幾個(gè)CPU的訪存周期。優(yōu)點(diǎn)既滿足了I/O設(shè)備的數(shù)據(jù)傳送需求又讓CPU在DMAC不傳送數(shù)據(jù)的間隙正常訪存總線利用率高。缺點(diǎn)DMAC每傳送一個(gè)數(shù)據(jù)都要走一遍“請(qǐng)求-授權(quán)-傳送-釋放”的流程控制邏輯比停止CPU方式復(fù)雜。另外每次挪用都會(huì)讓CPU的指令執(zhí)行延長一個(gè)或幾個(gè)周期雖然單次影響小但大量傳送時(shí)累積起來也會(huì)降低CPU效率。適用場(chǎng)景絕大多數(shù)實(shí)際系統(tǒng)包括早期的磁盤控制器、網(wǎng)卡等。408考試中周期挪用方式最愛考的點(diǎn)是DMAC和CPU爭用總線的優(yōu)先級(jí)、每次傳送的數(shù)據(jù)量一個(gè)數(shù)據(jù)、對(duì)CPU的影響延長訪存周期但不停止程序執(zhí)行。3.3 交替訪問方式把總線時(shí)間切片交替訪問方式也叫透明DMA的設(shè)計(jì)思路更巧妙它把總線時(shí)間固定地分成兩個(gè)交替的時(shí)段一個(gè)時(shí)段給CPU訪存一個(gè)時(shí)段給DMAC傳送數(shù)據(jù)。兩者像火車時(shí)刻表一樣輪流使用總線互不干擾。這種方式下DMAC不需要向CPU申請(qǐng)總線也不需要CPU發(fā)出總線允許信號(hào)。它只需要在屬于自己的時(shí)間片到來時(shí)直接使用總線即可。CPU甚至感覺不到DMAC的存在因?yàn)樗脑L存時(shí)間片是固定的不會(huì)被DMAC打亂。優(yōu)點(diǎn)CPU和DMAC都不需要等待對(duì)方總線利用率達(dá)到最高控制邏輯也相對(duì)規(guī)整。缺點(diǎn)對(duì)CPU的訪存時(shí)間有額外要求需要CPU的存取周期大于DMAC傳送一個(gè)數(shù)據(jù)所需的時(shí)間這樣才能在CPU的存取周期內(nèi)插入DMAC的訪存時(shí)段。如果CPU本身很快存取周期很短這種方式就不太適用。另外如果DMAC沒有數(shù)據(jù)要傳送它的時(shí)間片就浪費(fèi)了。適用場(chǎng)景CPU存取周期較長、I/O設(shè)備傳送速率較高的系統(tǒng)。實(shí)際中不如周期挪用方式常見。三種方式的對(duì)比總結(jié)對(duì)比維度停止CPU訪存周期挪用交替訪問總線控制權(quán)DMAC獨(dú)占每次一個(gè)周期固定時(shí)間片交替CPU是否停止訪存完全停止僅被挪用周期不受影響數(shù)據(jù)傳送速率最高較高較高控制復(fù)雜度最簡單較復(fù)雜中等總線利用率低高最高實(shí)際使用頻率很少最常用較少4. DMA方式與中斷方式的對(duì)比408選擇題的高頻陷阱4.1 從數(shù)據(jù)傳送路徑看本質(zhì)差異中斷方式下數(shù)據(jù)傳送的路徑是設(shè)備 → CPU寄存器 → 主存。設(shè)備準(zhǔn)備好數(shù)據(jù)后向CPU發(fā)中斷請(qǐng)求CPU響應(yīng)中斷后執(zhí)行中斷服務(wù)程序用指令把設(shè)備數(shù)據(jù)讀入CPU寄存器再從寄存器寫入主存。每傳送一個(gè)數(shù)據(jù)都需要CPU執(zhí)行若干條指令。DMA方式下數(shù)據(jù)傳送的路徑是設(shè)備 → DMAC → 主存或反向。數(shù)據(jù)不經(jīng)過CPU寄存器由硬件直接搬運(yùn)。CPU只在開始和結(jié)束時(shí)參與。這個(gè)差異帶來幾個(gè)直接后果第一DMA的傳送速率遠(yuǎn)高于中斷方式因?yàn)椴皇蹸PU指令執(zhí)行速度的限制第二DMA方式下CPU的寄存器不需要保存和恢復(fù)因?yàn)闆]有中斷服務(wù)程序來搬運(yùn)數(shù)據(jù)第三DMA方式需要額外的硬件DMAC成本更高。4.2 響應(yīng)時(shí)機(jī)和優(yōu)先級(jí)的區(qū)別中斷請(qǐng)求的響應(yīng)時(shí)機(jī)是當(dāng)前指令執(zhí)行結(jié)束后CPU檢查中斷請(qǐng)求如果有則響應(yīng)。這意味著中斷響應(yīng)至少延遲一條指令的時(shí)間。DMA請(qǐng)求的響應(yīng)時(shí)機(jī)是當(dāng)前總線周期結(jié)束后CPU釋放總線。DMA請(qǐng)求的優(yōu)先級(jí)高于中斷請(qǐng)求因?yàn)镈MA請(qǐng)求對(duì)應(yīng)的是數(shù)據(jù)傳送的硬實(shí)時(shí)需求如果延遲可能導(dǎo)致數(shù)據(jù)丟失。在408題目中經(jīng)常出現(xiàn)這樣的選項(xiàng)“DMA請(qǐng)求的響應(yīng)發(fā)生在一條指令執(zhí)行結(jié)束后”——這是錯(cuò)的DMA請(qǐng)求發(fā)生在總線周期結(jié)束后。“中斷請(qǐng)求的響應(yīng)發(fā)生在一條指令執(zhí)行結(jié)束后”——這是對(duì)的。4.3 中斷方式能處理異常事件DMA不能這是兩者功能定位的根本區(qū)別。中斷方式不僅能用于數(shù)據(jù)傳送還能處理各種異常事件比如除零錯(cuò)誤、缺頁異常、設(shè)備故障等。中斷服務(wù)程序可以根據(jù)不同的中斷源執(zhí)行不同的處理邏輯。DMA方式只負(fù)責(zé)數(shù)據(jù)搬運(yùn)它不能處理異常事件。如果傳送過程中出現(xiàn)錯(cuò)誤比如設(shè)備故障DMAC通常只能記錄錯(cuò)誤狀態(tài)然后通過中斷通知CPU來處理。也就是說DMA方式在出錯(cuò)時(shí)仍然需要借助中斷機(jī)制來通知CPU。408常見陷阱說“DMA方式可以處理所有I/O操作不需要中斷方式”——這是錯(cuò)的。DMA只負(fù)責(zé)數(shù)據(jù)傳送異常處理、控制命令的發(fā)送、狀態(tài)檢查等仍然需要CPU通過中斷方式或程序查詢方式來完成。4.4 優(yōu)先級(jí)和屏蔽問題在中斷系統(tǒng)中每個(gè)中斷源有優(yōu)先級(jí)高優(yōu)先級(jí)中斷可以打斷低優(yōu)先級(jí)中斷。DMA請(qǐng)求也有優(yōu)先級(jí)而且通常高于所有中斷請(qǐng)求。但DMA請(qǐng)求不能被中斷請(qǐng)求打斷因?yàn)镈MAC一旦獲得總線就會(huì)完成當(dāng)前數(shù)據(jù)傳送。另外DMA傳送期間CPU不能響應(yīng)中斷嗎實(shí)際上CPU在DMA傳送期間如果收到中斷請(qǐng)求它可以在DMAC釋放總線的間隙響應(yīng)中斷。但中斷服務(wù)程序中如果也要訪存就需要和DMAC爭用總線。所以實(shí)際系統(tǒng)中DMA傳送期間通常會(huì)屏蔽某些中斷或者中斷服務(wù)程序盡量不訪存。5. 408考場(chǎng)上的DMA典型題型與解題思路5.1 概念辨析題抓住“誰控制總線”這條主線這類題目通常給出幾個(gè)關(guān)于DMA和中斷的陳述讓你判斷正誤。解題的關(guān)鍵是抓住“誰控制總線”和“數(shù)據(jù)經(jīng)不經(jīng)過CPU”這兩條主線。比如這樣一道題“在DMA方式中數(shù)據(jù)傳送方向由CPU控制數(shù)據(jù)傳送過程由DMAC控制?!鼻鞍刖鋵?duì)后半句對(duì)。CPU在預(yù)處理階段設(shè)置傳送方向DMAC在傳送階段控制具體的數(shù)據(jù)流動(dòng)。再比如“DMA方式下CPU和DMAC不能同時(shí)訪存。”這個(gè)說法在停止CPU訪存和周期挪用方式下是對(duì)的但在交替訪問方式下CPU和DMAC是分時(shí)使用總線的嚴(yán)格來說也不能同時(shí)訪存只是時(shí)間片交替。所以這個(gè)說法基本正確但要注意交替訪問的特殊性。5.2 時(shí)序分析題畫出總線使用時(shí)間軸這類題目給出CPU的存取周期、DMAC傳送一個(gè)數(shù)據(jù)所需的時(shí)間、數(shù)據(jù)塊大小等參數(shù)讓你計(jì)算DMA傳送對(duì)CPU執(zhí)行時(shí)間的影響。解題步驟通常是第一確定使用哪種DMA傳送方式第二計(jì)算DMAC傳送整個(gè)數(shù)據(jù)塊需要多少個(gè)總線周期第三根據(jù)方式不同計(jì)算CPU被暫停或挪用的周期數(shù)第四把這段時(shí)間加到CPU原本的執(zhí)行時(shí)間上。以周期挪用方式為例假設(shè)CPU存取周期為100nsDMAC傳送一個(gè)數(shù)據(jù)需要一個(gè)存取周期數(shù)據(jù)塊大小為1000個(gè)數(shù)據(jù)。那么DMAC需要挪用1000個(gè)CPU存取周期總共100000ns。如果CPU原本執(zhí)行這段程序需要1ms那么加上DMA傳送后變成1.1ms。如果是停止CPU訪存方式DMAC連續(xù)傳送1000個(gè)數(shù)據(jù)每個(gè)數(shù)據(jù)需要一個(gè)存取周期總共也是100000ns但CPU在這段時(shí)間完全停止影響和周期挪用方式在總量上相同但分布不同。周期挪用是分散影響停止CPU是集中影響。5.3 硬件設(shè)計(jì)題DMAC的寄存器配置和信號(hào)連接這類題目可能要求你畫出DMAC與CPU、主存、設(shè)備之間的連接圖或者說明DMAC需要哪些寄存器、每個(gè)寄存器的作用。核心連接包括DMAC與CPU之間的總線請(qǐng)求線BR和總線允許線BGDMAC與主存之間的地址總線、數(shù)據(jù)總線和讀寫控制線DMAC與設(shè)備之間的DMA請(qǐng)求線和DMA允許線。寄存器配置方面必須能說清楚AR、WC、DR、DAR各自的作用和初始化時(shí)機(jī)。408考試中這類題目通常以選擇題形式出現(xiàn)問“哪個(gè)寄存器用于存放傳送字?jǐn)?shù)”答案是WC。5.4 綜合題DMA與中斷的配合使用實(shí)際系統(tǒng)中DMA和中斷經(jīng)常配合使用。比如磁盤讀操作CPU先通過程序查詢或中斷方式向磁盤控制器發(fā)送讀命令和參數(shù)磁盤控制器準(zhǔn)備好數(shù)據(jù)后通過DMA方式把數(shù)據(jù)傳送到主存?zhèn)魉屯瓿珊笸ㄟ^中斷通知CPU。CPU在中斷服務(wù)程序中檢查傳送結(jié)果然后喚醒等待該數(shù)據(jù)的進(jìn)程。408綜合題可能會(huì)讓你描述這個(gè)過程或者分析其中DMA和中斷各自的作用。答題時(shí)要明確命令發(fā)送和狀態(tài)檢查用中斷或程序查詢數(shù)據(jù)傳送用DMA傳送結(jié)束通知用中斷。6. 從408到實(shí)際系統(tǒng)DMA在現(xiàn)代硬件中的影子6.1 磁盤控制器中的DMA機(jī)械硬盤和固態(tài)硬盤的控制器都支持DMA方式。操作系統(tǒng)在發(fā)起磁盤讀操作時(shí)會(huì)構(gòu)造一個(gè)DMA描述符包含主存緩沖區(qū)地址、傳送長度、傳送方向等信息然后寫入磁盤控制器的DMA寄存器。磁盤控制器完成數(shù)據(jù)讀取后通過DMA直接把數(shù)據(jù)寫入主存最后發(fā)中斷通知CPU。這種方式下CPU不需要逐字節(jié)地從磁盤控制器讀取數(shù)據(jù)大大降低了CPU占用率。如果沒有DMA磁盤讀操作會(huì)消耗大量CPU時(shí)間在數(shù)據(jù)搬運(yùn)上系統(tǒng)響應(yīng)速度會(huì)急劇下降。6.2 網(wǎng)絡(luò)接口卡中的DMA網(wǎng)卡接收數(shù)據(jù)包時(shí)也是通過DMA把數(shù)據(jù)包寫入主存中的接收緩沖區(qū)?,F(xiàn)代網(wǎng)卡通常支持多隊(duì)列DMA每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)CPU核心這樣可以實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的并行處理減少單個(gè)CPU核心的負(fù)擔(dān)。網(wǎng)卡的DMA描述符環(huán)是一個(gè)經(jīng)典設(shè)計(jì)驅(qū)動(dòng)程序在主存中維護(hù)一個(gè)描述符數(shù)組每個(gè)描述符指向一個(gè)數(shù)據(jù)緩沖區(qū)。網(wǎng)卡通過DMA讀取描述符把數(shù)據(jù)寫入對(duì)應(yīng)的緩沖區(qū)然后更新描述符狀態(tài)。驅(qū)動(dòng)程序通過輪詢或中斷方式檢查描述符狀態(tài)處理已接收的數(shù)據(jù)包。6.3 顯卡中的DMA顯卡與主存之間的數(shù)據(jù)傳送也大量使用DMA。比如紋理數(shù)據(jù)從主存?zhèn)魉偷斤@存或者渲染結(jié)果從顯存?zhèn)魉偷街鞔?。顯卡的DMA引擎通常支持高帶寬傳送因?yàn)閳D形數(shù)據(jù)量非常大。在現(xiàn)代系統(tǒng)中顯卡通常通過PCIe總線與CPU和主存連接PCIe總線本身就支持DMA操作。顯卡的DMA引擎可以直接訪問主存不需要CPU介入。6.4 DMA在嵌入式系統(tǒng)中的應(yīng)用在STM32等嵌入式微控制器中DMA是一個(gè)非常重要的外設(shè)。比如ADC多通道采集時(shí)可以用DMA把ADC轉(zhuǎn)換結(jié)果自動(dòng)搬運(yùn)到內(nèi)存數(shù)組CPU不需要在每次轉(zhuǎn)換完成后讀取ADC數(shù)據(jù)寄存器。串口通信中也可以用DMA發(fā)送和接收數(shù)據(jù)減少CPU中斷次數(shù)。STM32的DMA控制器通常有多個(gè)通道每個(gè)通道可以配置不同的外設(shè)和內(nèi)存地址、傳送方向、數(shù)據(jù)寬度、傳送模式單次或循環(huán)。配置好之后DMA自動(dòng)工作CPU可以去做其他事情。傳送完成或出錯(cuò)時(shí)DMA可以產(chǎn)生中斷通知CPU。如果你學(xué)過STM32的DMA配置再回頭看408的DMA原理會(huì)發(fā)現(xiàn)兩者完全對(duì)應(yīng)AR對(duì)應(yīng)外設(shè)地址和內(nèi)存地址寄存器WC對(duì)應(yīng)數(shù)據(jù)長度寄存器控制邏輯對(duì)應(yīng)DMA配置寄存器。408講的是原理STM32講的是具體實(shí)現(xiàn)。7. 幾個(gè)容易混淆的細(xì)節(jié)和踩坑提醒7.1 DMA傳送的“數(shù)據(jù)塊”到底有多大408題目中經(jīng)常說“DMA傳送一個(gè)數(shù)據(jù)塊”這個(gè)數(shù)據(jù)塊的大小由WC決定。但要注意DMA傳送的基本單位是一個(gè)數(shù)據(jù)可能是字節(jié)、半字或字而不是整個(gè)數(shù)據(jù)塊。DMAC每傳送一個(gè)數(shù)據(jù)AR和WC更新一次。整個(gè)數(shù)據(jù)塊傳送完畢后WC歸零產(chǎn)生中斷。有些題目會(huì)問“DMA傳送過程中每傳送一個(gè)數(shù)據(jù)需要幾個(gè)總線周期”答案是通常一個(gè)總線周期但具體取決于數(shù)據(jù)寬度和總線寬度。如果數(shù)據(jù)寬度小于總線寬度可能一個(gè)總線周期能傳送多個(gè)數(shù)據(jù)如果數(shù)據(jù)寬度大于總線寬度可能需要多個(gè)總線周期。7.2 DMA請(qǐng)求和總線請(qǐng)求不是一回事DMA請(qǐng)求是設(shè)備發(fā)給DMAC的表示“我準(zhǔn)備好了一個(gè)數(shù)據(jù)”??偩€請(qǐng)求是DMAC發(fā)給CPU的表示“我要用總線”。兩者發(fā)生在不同層級(jí)不要混淆。在周期挪用方式下設(shè)備每準(zhǔn)備好一個(gè)數(shù)據(jù)就發(fā)一次DMA請(qǐng)求DMAC每收到一個(gè)DMA請(qǐng)求就發(fā)一次總線請(qǐng)求。在停止CPU訪存方式下DMAC可能在收到第一個(gè)DMA請(qǐng)求后就一直占用總線直到整個(gè)數(shù)據(jù)塊傳送完畢。7.3 DMA傳送期間CPU能不能響應(yīng)中斷這個(gè)問題要分情況。在停止CPU訪存方式下CPU完全放棄總線但它仍然可以響應(yīng)中斷只是中斷服務(wù)程序中如果涉及訪存操作需要等待DMAC釋放總線。在周期挪用方式下CPU在DMAC不占用總線的間隙可以正常響應(yīng)中斷和訪存。實(shí)際系統(tǒng)中DMA傳送期間通常會(huì)設(shè)置中斷屏蔽或者中斷服務(wù)程序盡量不訪存以避免總線爭用導(dǎo)致的復(fù)雜性。7.4 DMA控制器的優(yōu)先級(jí)高于CPU嗎在總線爭用中DMAC的優(yōu)先級(jí)高于CPU。這是因?yàn)镮/O設(shè)備的數(shù)據(jù)傳送有硬實(shí)時(shí)要求如果數(shù)據(jù)沒有及時(shí)取走可能會(huì)被覆蓋或丟失。而CPU的訪存請(qǐng)求可以推遲一兩個(gè)周期對(duì)程序執(zhí)行影響很小。但DMAC的優(yōu)先級(jí)高于CPU并不意味著DMAC可以無限期占用總線。在周期挪用方式下DMAC每次只占用一個(gè)總線周期然后釋放總線給CPU訪存的機(jī)會(huì)。這樣既保證了I/O設(shè)備的實(shí)時(shí)性又不會(huì)讓CPU餓死。7.5 408真題中的DMA考點(diǎn)分布從歷年408真題來看DMA相關(guān)題目主要分布在選擇題中偶爾出現(xiàn)在綜合題中。高頻考點(diǎn)包括DMA與中斷的區(qū)別、三種DMA傳送方式的特點(diǎn)、DMAC的寄存器作用、DMA請(qǐng)求的響應(yīng)時(shí)機(jī)、DMA傳送對(duì)CPU執(zhí)行時(shí)間的影響。2024年第45題考的是DMA和中斷在數(shù)據(jù)傳送路徑上的區(qū)別以及DMA請(qǐng)求和中斷請(qǐng)求的響應(yīng)時(shí)機(jī)。這道題的正確率不高很多考生在“DMA請(qǐng)求發(fā)生在總線周期結(jié)束后”這個(gè)點(diǎn)上出錯(cuò)。備考建議把DMA方式與中斷方式、程序查詢方式放在一起對(duì)比記憶抓住“誰控制總線”“數(shù)據(jù)經(jīng)不經(jīng)過CPU”“響應(yīng)時(shí)機(jī)”“優(yōu)先級(jí)”這四個(gè)維度基本就能覆蓋所有考題。8. 把DMA學(xué)透之后再看I/O系統(tǒng)的整體圖景學(xué)完DMA你應(yīng)該能把三種I/O控制方式串起來程序查詢方式下CPU不斷輪詢?cè)O(shè)備狀態(tài)數(shù)據(jù)傳送完全由CPU控制中斷方式下設(shè)備主動(dòng)通知CPUCPU執(zhí)行中斷服務(wù)程序搬運(yùn)數(shù)據(jù)DMA方式下DMAC直接在設(shè)備和主存之間搬運(yùn)數(shù)據(jù)CPU只做初始化和收尾。這三種方式?jīng)]有絕對(duì)的優(yōu)劣而是適用于不同的場(chǎng)景。程序查詢方式最簡單但CPU利用率最低適合非常簡單的嵌入式系統(tǒng)中斷方式適合低速、隨機(jī)出現(xiàn)的I/O請(qǐng)求DMA方式適合高速、大批量的數(shù)據(jù)傳送。在實(shí)際系統(tǒng)中這三種方式經(jīng)常混合使用。比如一個(gè)磁盤讀操作CPU可能先用程序查詢方式檢查磁盤控制器是否空閑然后用中斷方式發(fā)送讀命令最后用DMA方式傳送數(shù)據(jù)傳送完成后通過中斷通知CPU。理解每種方式的適用場(chǎng)景和配合方式比單純背誦定義更有價(jià)值。如果你正在準(zhǔn)備408建議把DMA這一章的復(fù)習(xí)重點(diǎn)放在三種傳送方式的時(shí)序?qū)Ρ群虳MA與中斷的區(qū)別上。這兩塊內(nèi)容幾乎每年必考而且容易出綜合題。把DMAC的寄存器作用和初始化流程也記清楚選擇題里經(jīng)常考“哪個(gè)寄存器存放傳送字?jǐn)?shù)”這種細(xì)節(jié)。最后分享一個(gè)我自己的復(fù)習(xí)方法拿一張紙畫出DMAC與CPU、主存、設(shè)備的連接圖標(biāo)出每根信號(hào)線的作用然后分別畫出三種DMA傳送方式的總線使用時(shí)間軸。畫完之后你對(duì)DMA的理解會(huì)比單純看書深得多。408考場(chǎng)上遇到DMA題目你腦子里會(huì)自動(dòng)浮現(xiàn)出那張時(shí)間軸選項(xiàng)對(duì)錯(cuò)一目了然。