在網上檢視了各路大牛的dma資料,但一直未解決我的問題和疑問;
dma的抽象層,沒有講到具體,比如這個dma_map_single這個函式。這個
phys_addr到底是從**來的,是如何受到保護的,以及這個對映關係和dma_unmap_single
取消對映之間,是否涉及到phys_addr的關聯。
xfer->tx_dma = dma_map_single(dev, (void *)xfer->tx_buf,
xfer->len, dma_to_device);
跟蹤**,
1 . phys_addr_t map_single(struct device *hwdev, phys_addr_t phys, size_t size,
enum dma_data_direction dir) else {
memcpy(phys_to_virt(orig_addr), vaddr, size);
4. 從上看出,其實這裡所謂的dma操作都是一些邏輯性的,沒涉及到phys部分,也就說理論上
dma可以隨意對映ram任何位址。kernel裡面搞這麼複雜,還是因為kernel裡涉及各方面的記憶體
分配和堆疊空間,便於管理;另外有個重要的原因是,phys addr被dma對映後,其他的程序是
不知道的,而且各dma程序之間也是不清楚的,這樣會導致嚴重的混亂問題,所以從這個原理上
看,對dma的ram位址進行一定發分割槽管理是非常明智和實用的。抓個開機log
Linux下的位址對映
在cpu中設定四個 段暫存器 cs ds ss es 分別用於可執行 即指令,資料,堆疊和其他 每個段暫存器都是16位,對應位址匯流排的高16位。每條 訪內指令 的內部位址都是16位。訪內 的內部位址 16位 轉化成實際位址 20位 段暫存器中內基位址 4 內部位址 對於每乙個由段暫存器的內容確定的...
Linux下把kernel空間對映到使用者程序空間
在mmap函式裡,使用 remap pfn range函式。如下。注意要設定一下vma vm pgoff為你要map的io空間的實體地址對應的頁。arm io 記憶體統一編址 所以 define io remap pfn range vma,from,pfn,size,prot remap pfn ...
linux下的分段分頁 位址對映
首先我們要注意的是虛擬空間分為核心空間和使用者空間。1.從邏輯位址到線性位址的轉換 對於linux來說,基本不使用分段的機制,或者說,linux中的分段機制只是為了相容ia32的硬體而設計的。linux核心的設計並沒有全部採用intel所提供的段方案,僅僅有限度地使用了一下分段機制。這不僅簡化了li...