mmap/ioremap 內存相關



mmap/ioremap
一般來說,在系統運行時,外設的I/O內存資源的物理地址是已知的,由硬件的設計決定。但是CPU通常並沒有爲這些已知的外設I/O內存
資源的物理地址預定義虛擬地址範圍,驅動程序並不能直接通過物理地址訪問I/O內存資源,而必須將它們映射到核心虛地址空間內(通
過頁表),然後才能根據映射所得到的核心虛地址範圍,通過訪內指令訪問這些I/O內存資源。
void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) 
入口: phys_addr:要映射的起始的IO地址; 
size:要映射的空間的大小; 
flags:要映射的IO空間的和權限有關的標誌; 
功能: 將一個IO地址空間映射到內核的虛擬地址空間上去,便於訪問; 


用mmap映射一個設備,意味着使用戶空間的一段地址關聯到設備內存上,這使得只要程序在分配的地址範圍內進行讀取或者寫入,實際上就
是對設備的訪問。使用mmap最典型的例子是顯示卡的驅動,將顯存空間直接從內核映射到用戶空間將可提供顯存的讀寫效率。
筆者在Linux源代碼中進行包含"ioremap"文本的搜索,發現真正出現的ioremap的地方相當少。所以筆者追根索源地尋找I/O操作的物理地址
轉換到虛擬地址的真實所在,發現Linux有替代ioremap的語句,但是這個轉換過程卻是不可或缺的。
兩者目的不一樣:
ioremap是爲一段高端的物理內存建立映射(即增加相關的頁表內容),驅動常用
mmap是爲可能不連續的一系列邏輯上相關的(如整體是一個文件)物理內存段建立映射,
並呈現一個連續的虛擬地址空間,應用程序常用.


http://www.233.com/linux/fudao/20100914/14075091.html
常用內存分配函數


分配原理 最大內存 其他
__get_free_pages 直接對頁框進行操作 4MB 適用於分配較大量的連續物理內存
kmem_cache_alloc 基於slab機制實現 128KB 適合需要頻繁申請釋放相同大小內存塊時使用
kmalloc 基於kmem_cache_alloc實現 128KB 最常見的分配方式,需要小於頁框大小的內存時可以使用
vmalloc 建立非連續物理內存到虛擬 物理不連續,適合需要大內存,但是對地址連續性沒有要求的場合
地址的映射  
dma_alloc_coherent 基於__alloc_pages實現 4MB 適用於DMA操 作
ioremap 實現已知物理地址到虛擬地址的映射 適用於物理地址已知的場合,如設備驅動
alloc_bootmem 在啓動kernel時,預留一段內存,          內核看不見小於物理內存大小,內存管理要求較高
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章