首頁  >  文章  >  電腦教學  >  有沒有DMA Windows驅動的原始碼?

有沒有DMA Windows驅動的原始碼?

PHPz
PHPz轉載
2024-01-18 08:30:16593瀏覽

dma windows驱动源码吗?

在《深入理解Linux核心》中的第545頁介紹了DMA的相關操作。說道DMA,那就不得不提到Cache(高速緩存)的問題。書中引用瞭如下一段範例來描述了Cache一致性問題:

逗弄假設裝置驅動程式把一些資料填入記憶體緩衝區中,然後立刻命令硬體裝置利用DMA傳送方式讀取該資料。如果DMA存取這些實體RAM記憶體單元,而對應的硬體快取行的內容還沒有寫入RAM中,那麼硬體設備所讀取的至就是記憶體緩衝區中的舊值。地

現在有兩種方法來處理DMA緩衝區:

一致性DMA映射:

書上講的比較抽象,通俗地所就是任何對DMA緩衝區的改寫都會直接更新到記憶體中,也稱之為逗同步的地或逗弄一致的地。

串流DMA映射:

根據個人的理解,這裡的流即輸入輸出流,我們需要事先指定DMA緩衝區的方向,例如是地讀緩衝區地還是逗寫緩衝區地。也稱之為逗異步的地或逗出非一致性的地,詳細的內容請看下文。

由於x86體系結構中,硬體設備驅動程式本身會逗窺探地所存取的硬體告訴緩存,因此x86體系結構中不存在DMA一致性問題。而對於其他一些架構如MIPS,SPARC以及POWERPC(包括ARM在內)則需要在軟體上確保其DMA一致性。

對於以上兩者如何選擇,書中有一個合適的建議,如果CPU和DMA處理器以不可預測的方式去訪問一個緩衝區,那麼必須強制使用一致性DMA映射方式(在這裡我對不可預測的理解是,不能確定在何時它們訪問緩衝區),其他情況下,流式DMA映射方式更可取,因為在一些體系結構中處理一致性DMA映射是很麻煩的,並且可能導致更低的系統性能。

這裡詳細介紹流式DMA:

需要存取的緩衝區需要在資料傳送之前被映射(這裡的映射也就是需要呼叫一些函數告知內核,該緩衝區進行流式映射),在傳送之後被取消映射。

啟動一次串流DMA資料傳輸分為以下步驟:

#1. 分配DMA緩衝區。

在DMA裝置不採用S/G(分散/聚集)模式的情況下,必須保證緩衝區是物理上連續的,linux核心有兩個函數用來分配連續的記憶體:kmalloc()和__get_free_pages()。這兩個函數都有分配連續記憶體的最大值,kmalloc以分配位元組為單位,最大約為64KB,__get_free_pages()以分配頁為單位,最大能分配2^order數目的頁,order參數的最大值由include/linux/Mmzone.h檔案中的MAX_ORDER巨集決定(在預設的2.6.18核心版本中,巨集定義為10。也就是說在理論上__get_free_pages函數一次最多能申請1

#2. 建立串流映射。

在對DMA衝區進行讀寫存取之後,且在啟動DMA裝置傳輸之前,啟用dma_map_single()函數建立串流DMA映射,這兩個函數接受緩衝區的線性位址作為其參數並傳回對應的匯流排位址。

3. 釋放流式映射。

當DMA傳輸結束之後我們需要釋放該映射,這時呼叫dma_unmap_single()函數。

注意:

(1). 為了避免高速緩存一致性問題,驅動程式在開始從RAM到裝置的DMA資料傳輸之前,如果有必要,應該呼叫dma_sync_single_for_device( )函數刷新與DMA緩衝區對應的快取行。

(2). 從裝置到RAM的一次DMA資料傳送完成之前裝置驅動程式是不可以存取記憶體緩衝區的,但如果有必要的話,驅動程式在讀取緩衝區之前,應該呼叫dma_sync_single_for_cpu()函數使對應的硬體快取行無效。

(3).雖然kmalloc底層也是用__get_free_pages實現的,不過kmalloc對應的釋放緩衝區函數為kfree,而__get_free_pages對應的釋放緩衝區函數為free_pages。具體與__get_free_pages有關係的幾個申請與釋放函數如下:

申請函數:

alloc_pages(gfp_mask ,order)傳回第一個所指派頁框描述符的位址,或如果指派失敗則傳回NULL。__get_free_pages(gfp_mask,order)類似alloc_pages(),但它傳回第一個所指派頁的線性位址。如果需要取得線性位址對應的頁框號,那麼需要呼叫virt_to_page(addr)巨集產生線性位址。釋放函數:__free_pages(page,order)這裡主要強調page是要釋放緩衝區的線性首地址所在的頁框號free_pages (page,order)這個函數類似__free_pages(page,order),但是它接收的參數為要釋放的第一個頁框的線性位址addr

以上是有沒有DMA Windows驅動的原始碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:xtzjcz.com。如有侵權,請聯絡admin@php.cn刪除