1. windows操作系統和linux操作系統中是如何使用DMA方式實現輸入輸出的
大概知道一點DMA是啥東西,簡單說一下大家不要見笑:
DMA是用硬體管理存儲器IO的一種方式,這樣可以節省CPU周期以處理其它事務,使CPU從繁重的IO操作中解放出來,DMA也有周期的,每個存儲周期,CPU收到存儲中斷請求,將相關參量和信息傳遞給DMA晶元,然後存儲過程就交給DMA晶元了,DMA晶元代替CPU設置內存和存儲器的狀態、地址等等信息,等每個存儲周期完成就產生一個中斷通知CPU,我的這次存儲過程結束了,CPU再分配下一次存儲任務給DMA晶元,基本就是這么個過程,輸出就是輸入的逆向,一個從內存到磁碟,一個從磁碟到內存
2. linux中DMA申請空間的疑問
多次kmalloc 是肯定不行的,dma 內存在物理上要連續.
可以使用get_free_pages, 然後使用dma_map_single, dma_map_pages, dma_map_sg將之前分配的內存空間映射, 但也不會太大。
dma 內存不光是申請就可以的,因為傳輸時不經cpu, 所以要對 cache 進行clean 或invalidate 操作,上面的方式就不保證cache 的一致性。
使用dma_alloc_coherent申請的保證一致性.
不管那種方式,申請過大內存都存在失敗的可能性,不建議一次申請很大內存,申請的小點,加大傳輸次數。
3. linux內核中的DMA engine是什麼,求詳解!
從硬體上來說,dma engine即dma引擎,就是dma控制器;從軟體上來說,其實就是一個dma框架,在該框架下針對你的具體的dma控制器開發出dma驅動,然後其他drivers比如audio,network,crypto等就都可以調用統一的dma相關的api來使用你的dma。
4. 在Linux操作系統下如何開啟硬碟DMA
如果在安裝時DMA是disable的,那該怎麼才能激活DMA呢?通過重新編譯內核可以激活DMA支持,但編譯內核對新手顯然太過復雜。下面的方法無需編譯內核,就可以激活DMA支持。
一、檢查系統中的DMA選項是否已被激活
在進行操作前,先確認硬碟是否已經在使用DMA方式傳輸數據了。方法:查看/proc/ide/hda/settings文件,其中有一行的內容為:using_dma,如果其後面的值被設置為1就說明系統已經支持DMA了,那麼下面的操作就可以免了,當然如果你要關閉DMA功能的話,還要往下看看喲:)。
Linux中的hdparm命令是用來進行與硬碟相關操作的,用hdparm -i /dev/hda可以列出IDE可能支持的DMA模式,如:
DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 *udma4
二、激活DMA支持
方法1:在lilo.conf中加入:idex=dma,其中x代表硬碟序號,其取值范圍0-3,分別代表系統中的四個IDE硬碟設備。
方法2:使用hdparm命令,hdparm d1 /dev/hda 其中d1表示使能DMA,你可以將其加到rc.locl中以便每次啟動時都硬碟都能使用DMA方式傳輸數據。
三、關閉DMA支持
希望對你有幫助,祝你好運!
5. 怎樣看linux串口驅動中斷 dma
查詢就是一直在查看標志位,是不是被置1了,如果是就去讀或者其他操作專
中斷就是平時不用屬管,一單有東西來就會進入中斷服務程序,你再去操作
DMA是你初始化的時候把串口地址和需要傳輸的地址寫上,來東西他就自己把數據存到你初始化的地址上
6. Linux內核態申請一塊DMA內存,通過什麼函數或方式判斷內存中的數據發生了變化
這個只能自己弄,
建議自己寫一個函數,
思路:讀取一次你申請的DMA內存,並計算它的md5,
下次當你需要判斷內存是否改變的時候再次讀取內存並獲取md5
如果兩次md5不一樣的時候,那麼,內存一定是被修改了
7. linux 應用層可以使用DMA進行數據傳輸嗎
dma只能在驅動層面實現至於用戶層操作,理論上可以,但應該比較復雜