天天看點

位址映射 ioremap (實體位址轉換為虛拟位址)

1、一般我們的外設都是通過讀寫裝置上的寄存器來進行的,通常包括控制寄存器、狀态寄存器、資料寄存器三大類。外設的寄存器通常被連續編址,并且根據CPU的體系架構不同CPU對IO端口的編制方式有兩種:

IO映射方式(IO-mapped):比較典型的有X86處理器為外設專門實作了一個單獨的位址空間,稱為“IO端口空間”或者“IO位址空間”,此時CPU可以通過專門的指令(比如X86的IN和OUT)來通路這個“IO端口空間”。

記憶體映射方式(memory-mapped):RISC指令系統的CPU一般隻實作一個實體位址空間,外設IO端口成為記憶體的一部分。此時CPU可以通路外設的IO端口,就像通路自己的記憶體一樣友善,不必再設定專門的指令來通路。在驅動開發過程中一般使用記憶體映射方式。

2、在驅動開發過程中,一般來說外設的IO記憶體資源的實體位址是已知的,由硬體的設計決定。但是CPU不會為這些已知的外設IO記憶體資源預先指定虛拟位址的值,是以驅動程式不可以直接就通過外設的實體位址通路到IO記憶體,而必須要将其映射到虛拟位址空間(通過頁表),然後才能根據核心映射過後的虛拟位址來通過記憶體指令通路這些IO記憶體,并對其進行操作。

開始映射:void* ioremap(unsigned long phys_addr , unsigned long size , unsigned long flags)
//用mmap映射一個裝置意味着使使用者空間的一段位址關聯到裝置記憶體上,這使得隻要程式在配置設定的位址範圍内進行讀取或寫入,實際上就是對裝置的通路。 
解除映射:void iounmap(void* addr)//取消ioremap所映射的IO位址      

繼續閱讀