linux驅動虛擬地址和物理地址的映射

 

ioremap

ARM中,設備的寄存器或者存儲塊的這部分空間屬於內存空間的一部分,我們稱之爲IO內存。

 

在內核中訪問IO內存之前,我們只有IO內存的物理地址,這樣是無法通過軟件直接訪問的,需要首先用ioremap()函數將設備所處的物理地址映射到內核虛擬地址空間(3GB~4GB)。然後,才能根據映射所得到的內核虛擬地址範圍,通過訪問指令訪問這些IO內存資源。

 

在將I/O內存資源的物理地址映射成核心虛地址後,理論上講我們就可以象讀寫RAM那樣直接讀寫I/O內存資源了。爲了保證驅動程序的跨平臺的可移植性,我們應該使用Linux中特定的函數來訪問I/O內存資源,而不應該通過指向核心虛地址的指針來訪問。

 

mmap

mmap映射一個設備,意味着使用戶空間的一段地址關聯到設備內存上,這使得只要程序在分配的地址範圍內進行讀取或者寫入,實際上就是對設備的訪問。這種數據傳輸是直接的,不需要用到內核空間作爲數據轉移的中間站。

 

remap_page_range函數的功能是構造用於映射一段物理地址的新頁表,實現了內核空間與用戶空間的映射。

 

在內核驅動程序的初始化階段,通過ioremap()將物理地址映射到內核虛擬空間;在驅動程序的mmap系統調用中,使用remap_page_range()將該塊ROM映射到用戶虛擬空間。這樣內核空間和用戶空間都能訪問這段被映射後的虛擬地址。

 

Ioremap

進程空間ç內核空間çIO內存

其中,後面兩個指的是同一段物理內存區域,只是一個爲虛擬地址,一個爲物理地址。進程空間和內核空間對應着不同的物理地址,它們之間的數據傳遞,是實際的數據的拷貝。

 

Mmap

進程空間çIO內存

其中,進程空間mmap得到的那段虛擬地址跟IO內存對應着同一段物理地址。這個過程沒有額外的數據中轉,讀寫都直接針對硬件的物理地址進行。

 

一般來講,小數據量的傳輸用ioremap()就足夠了,

 

IO內存的一般訪問方法】

1.       首先是調用request_mem_region()申請資源,即告訴內核,本驅動正在使用這段物理內存,其他驅動不得訪問它們。在設備驅動模塊加載或open()函數中進行。

2.       接着講寄存器地址通過ioremap()映射到內核空間虛擬地址,之後就可以通過Linux設備訪問編程接口訪問這些設備的寄存器了。在設備驅動初始化、write(),read(),ioctl()函數中進行。

3.       訪問完成之後,應對ioremap()申請的虛擬地址進行釋放,並釋放release_mem_region()申請的IO內存資源。在設備驅動模塊卸載或release()函數中進行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章