10.6 直接存儲器訪問方式


計算機組成

10 輸入輸出設備

10.6 直接存儲器訪問方式

Screen Shot 2018-09-30 at 10.56.36 am

我們還是來說快遞的事。有一天,你在這坐着運算,突然來電話了,然后你接了一聽,啊,又有快遞啦,啊什么?一千本書,現在就得去拿,哎呀,好好好。這個怎么辦呢?這個,這搬一千本書又得浪費很多時間,呃,好辦,我們就叫一個搬家公司,跟他們說好,我們要從哪搬到哪談好價錢,他們就去搬,並且告訴他們搬完之后吶給我來一個電話,然后我去檢查,這就可以了。那么,雖然要多花一些錢,但是如果能夠運算更重要的任務,那還是值得的。

這就是我們要說的DMA方式。

Screen Shot 2018-09-30 at 10.56.44 am

現在的計算機中有很多復雜的外設比如像顯示器,網絡,硬盤。這些外設需要傳輸的數據量很大,而且對傳輸的速率也有很高的要求,如果這些數據都要靠CPU一個一個來搬運的話,那恐怕就難以應對了。

Screen Shot 2018-09-30 at 10.56.53 am

所以,這就需要用到DMA這種IO控制方式。

Screen Shot 2018-09-30 at 10.57.01 am

DMA就是直接存儲器訪問的簡稱。如果采用DMA方式進行I/O數據的傳送在傳送的過程中是不需要CPU干預的,這個數據傳送的工作是由一個專門的硬件電路控制,可以直接將外設的數據傳到存儲器或者將存儲器中的數據傳到外設,而這個專門的硬件控制電路就稱為DMA控制器,簡稱為DMAC。其實DMA控制器本身也是一個I/O接口,和其他I/O接口類似,它早期也是采用獨立芯片的形式,而現在通常是集成在其他多功能的芯片當中。

Screen Shot 2018-09-30 at 10.57.09 am

我們來看DMA控制器的基本工作步驟。這是一個簡化的系統,里面有一個CPU,一個存儲器,一個I/O接口,還有一個DMA控制器,它們通過系統總線連接在一起。還增加了m和s這兩種標記,m是master的縮寫,表示這個部件可以在系統總線上主動發起傳輸。比如CPU就是這樣的部件,它可以在系統總線上主動發起讀寫的傳輸。而s是slave的縮寫,它表示這個部件只能被動地接受來自系統總線的傳輸。存儲器就是一個典型的只有slave接口的設備。一般的I/O接口也是這樣,只會接受來自CPU的訪問。而DMA控制器則是既有master接口又有slave接口。

那我們就要用這個DMA控制器進行一次外設到內存的傳送,我們可以把這個I/O接口看成是網卡,外面接着網線。現在我們需要用DMA的方式接收一個網絡包,並保存到存儲器的某個區域。那要完成這個操作,CPU首先需要設置DMA內部的配置寄存器,那對於x86CPU,我們就要用out指令去寫DMA控制器當中的一些I/O端口(黃箭頭),以配置好它的工作模式。然后這個DMA控制器就處於空閑等待狀態,而CPU也可以去執行其他的程序了。當外設送來數據到I/O接口的時候,I/O接口就會向DMA控制器發出DMA傳送的申請,這個申請需要通過一根額外的連線發出(紫箭頭),DMA控制器收到I/O接口的申請之后,還會通過另一個連線(紫箭頭)響應這個申請。然后DMA控制器就會通過它的master接口發起總線讀傳輸,而這個讀傳輸的地址就是這個I/O接口當中的數據輸入緩沖寄存器。這樣數據就會從I/O接口被讀到了DMA控置器當中(淺藍色尖頭),然后DMA控制器會向存儲器發起總線的寫傳輸,將剛才讀回的這個數據寫到存儲器的某個區域(淺藍色尖頭)。我們注意在有DMA控制器之前,這個系統當中只有CPU可以發起總線傳輸,而現在DMA控制器可以主動發起總線傳輸了。那接下來DMA控制器會重復五和六這兩個動作,不斷地從I/O接口中讀出數據再寫到存儲器當中去。如果這是網絡傳輸一直到收完一個網絡包,這次DMA傳送才算完成,然后DMA控制器會返回到第二步,等待I/O發起下一次DMA傳送的申請。

一次DMA傳送的數據可能很多,所花的時間也很長,但是在這段時間CPU一直可以在執行其他的程序,這樣就和數據傳送的工作並行起來可以獲得很好的系統性能。但是CPU怎么知道DMA傳送已經完成了呢?通常情況下DMA傳送完成后,DMA控制器會發出一個中斷請求信號,通過中斷控制器通知CPU。這個DMA控制器發出的中斷,也是一個外部中斷,后面的處理過程就和其他I/O接口發出的中斷是一樣的,只不過它對應的中斷服務程序是讓CPU來對這一次的DMA傳輸進行處理。所以,從這個步驟我們可以看出DMA方式也不是完全不用CPU來干預。在DMA啟動的時候CPU來進行配置,而傳送完成后CPU還需要來進行處理。那后續的處理根據任務的需要各有不同,而初始化的配置卻大體是一樣的。

Screen Shot 2018-09-30 at 10.57.20 am

在DMA傳送開始前CPU要設置DMA控制器內部的寄存器,一般至少要設置這么幾項。既然等一會兒DMA控制器要進行數據的傳送,那就需要先設置好從哪里開始傳,這也就是源地址的初始值。還需要設置在傳送的過程中這個源地址是遞增還是遞減。然后還需要設置這些數據傳輸到哪里,也就是目的地址的初始值以及傳送時的地址增減方式。最后還要設置需要傳送多少數據。那么我們還是以剛才提到的外設到內存的傳送為例。

CPU在初始化配置時,會將某個源地址設為I/O端口。比如就是一個網絡控制器的數據輸入寄存器端口,而且傳送時這個源地址是不變的。因為每一次DMA控制器都是從同一個I/O端口讀出數據,而目的地址要設置為存儲器的某個地址,而且傳送時地址是遞增的。這樣DMA控制器每次從I/O接口當中讀出一個數就把這個數寫到存儲器當中去,下一次再讀出一個數再寫到存儲器當中時地址就應該遞增。這樣才不會覆蓋剛才傳過來的這個數。第三要設置待傳送數據的長度。如果是從外設接收數據,CPU在配置時可能不知道究竟這個數據有多長,就可以不設置這個參數,最后根據I/O接口的控制信號來判斷是否傳輸完成;如果是從存儲器發送一組數據到I/O接口,這個時候CPU在初始化時就知道究竟要發送多長的數據,就需要設置這個待傳送數據的長度的這個參數。那需要強調的是,這些參數都是DMA控制器內部的寄存器,一般各自都有一個I/O端口的地址,編程時通過out指令讓CPU去寫這些I/O端口,從而配置好了源地址、目的地址和待傳送數據的長度等信息,DMA控制器在運行的過程中就不需要再靠CPU執行程序來控制,而是直接查看內部的源地址寄存器,就把對應的地址發到系統總線上,就從I/O接口讀回了相應的數據,然后再查看自己的目的地址寄存器,把這個地址和剛才讀回來的數據一起發到系統總線上,這樣就寫入到了存儲器當中去。而每讀寫一次,就在內部累計已經傳送的數據的長度,並和這個待傳送數據的長度的寄存器的內容進行比較,如果相等則意味着傳輸已經完成,如果還不等則繼續傳輸。所以,CPU在一次配置完之后,后續的工作都由DMA控制器的內部硬件自動完成,不再需要CPU的干預了。這就是所謂直接存儲器訪問的含義。

Screen Shot 2018-09-30 at 10.57.28 am

在最早的個人計算機當中是沒有DMA控制器的,后來為了提高輸入輸出的效率,就增加了獨立的DMA控制器的芯片。例如剛才提到的8237,通過CPU設置DMA控制器當中的不同的地址就可以為不同的I/O接口提供DMA服務。

但是隨着計算機的發展有一些I/O接口的速度越來越快,對DMA傳輸的要求也越來越高。多個I/O接口共享一個獨立的DMA控制器的方式可能就沒有辦法滿足部分I/O接口的需求了。

Screen Shot 2018-09-30 at 10.57.36 am

這時就出現了自帶DMA控制器的I/O接口,這樣的I/O接口內部帶有一個專屬的DMA控制器,只為這個I/O接口提供服務,這個I/O接口現在也有了master的總線接口。在顯卡、網卡、硬盤控制器,這些對傳輸率要求很高的I/O接口中一般都會自帶DMA控制器。在系統初始化時,CPU要配置好各個DMA控制器,然后外設有傳輸需求時,這些DMA控制器就可以自動地開始工作了。如果我們把左邊這個獨立的DMA控制器比作一個搬家公司,CPU就請這個搬家公司來完成I/O接口和存儲器之間的數據搬運工作。而有些部門的搬運工作量非常大,實際上需要一個搬家公司全時地為他們服務才能夠滿足需求。於是就在部門內部自己組建了一個搬運隊,這樣一旦有數據傳送的需求就可以馬上開始工作,而不需要去申請外部的這個DMA控制器,傳輸的效率自然會大大提升,而且不同的I/O接口有不同的傳輸的特點。比如顯示、網絡、硬盤傳輸的行為肯定有不同的特征,而內嵌的DMA控制器就可以根據I/O接口的特點進行定制,從而更加 高效地完成傳輸。

Screen Shot 2018-09-30 at 10.57.45 am

在現代的計算系統當中,大部分對數據傳輸率有比較高要求的設備都會自帶DMA控制器,而其他對數據傳輸率要求比較低的設備則可以共享系統中獨立的DMA控制器。另外這個獨立的DMA控制器一般還會提供從內存到內存傳送的服務,當我們編程時需要將內存中的一大塊數據復制到內存的另一個區域的時候,雖然不涉及輸入輸出,但是也可以享受到DMA帶來了好處。

那當然也不是所有的輸入輸出設備都需要使用DMA的方式。畢竟增加一個DMA控制器需要增加制造的成本,而且CPU來配置DMA控制器以及進行后續的處理還是要靠執行程序來完成的,也都需要花時間。如果要傳輸的數據量很小,性能反而會變差。

Screen Shot 2018-09-30 at 10.57.53 am

那現在用DMA方式的這些設備,不見得是這些工作CPU不願意干,有可能是根本干不了。

比如說我們快遞要送來的不是一千本書而是一萬本書,而且非得一個小時內辦完。那你能干得了嗎?非得叫搬家公司不可了,對不對?但是不是說所有的事情都用DMA方式都能好好的解決的。比如送來的不是一千本一萬本書,而就是一本書,那你也去叫一個搬家公司把這本書給你運來?那樣就得不償失了,而且有時候你可能送來的根本不是書,而是你的午飯。訂了一份盒飯,難道你也叫一個搬家公司來給你收這個盒飯?那他們可能過了兩個小時才來,然后用他們規范的方法把你這頓飯給打包裝箱送到他們的大貨車。然后運到你的樓下,再拆包,再給你送上來,能趕上吃晚飯就不錯了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM