1. 程式人生 > >6. ioremap() 函數解析

6. ioremap() 函數解析

沒有 image 虛擬地址 不能 結構 地址映射 進行 17. 移植

技術分享圖片

1、基礎概念
幾乎每一種外設都是通過讀寫設備上的寄存器來進行的,通常包括控制寄存器,狀態寄存器和數據寄存器三大類。外設的寄存器通常被連續的編址。根據CPU體系結構的不同,CPU對IO端口的編制方式有兩種。

* I/O映射方式(I/O-mapped)

典型的,如x86處理器為外設專門實現了一個單獨的地址空間,稱為“I/O地址空間”或者“I/O端口空間”,CPU通過專門的I/O指令(如X86的IN和OUT指令)來訪問這一空間中的地址單元。

* 內存映射方式(memory-mapped)

RISC指令系統的CPU如ARM通常只實現一個物理地址空間,外設IO端口稱為內存的一部分。此時,CPU可以像訪問一個內存單元那樣訪問外設IO端口,而不需要設立專門的外設IO指令。
但是這兩種在硬件實現上的差異對軟件來說是完全透明的,驅動程序開發人員可以將外設映射方式的IO端口和外設內存統一看作是“IO內存”資源。
一般來說,在系統運行時,外設的IO內存資源的物理地址是已知的,有硬件的設計決定。但是CPU通常並沒有為這些已知的外設IO內存資源的物理地址定義虛擬地址範圍,驅動程序並不能直接通過物理地址訪問IO內存資源,而必須將他們通過頁表映射到核心虛地址空間內 ,然後才能根據映射所得到的核心虛地址範圍,通過訪內指令訪問這些I/O內存資源。
linux在io.h頭文件中聲明了函數ioremap,用來將IO內存資源的物理地址映射到核心虛地址空間(3GB-4GB)中(這裏是內核空間)

1.1、ioremap函數
ioremap宏定義在asm/io.h內:
技術分享圖片
__ioremap函數原型為(arm/mm/ioremap.c):
技術分享圖片
該函數返回映射後內核虛擬地址(3G-4G),介質就可以通過讀寫該返回的內核虛擬地址去訪問之這段I/O內存資源。
1.1、iounmap函數
iounmap函數用於取消ioremap()所做的映射,原型如下:
技術分享圖片
2、 ioremap() 相關函數解析
在將I/O內存資源的物理地址映射成核心虛地址後,理論上講我們就可以象讀寫RAM那樣直接讀寫I/O內存資源了。為了保證驅動程序的跨平臺的可移植性,我們應該使用Linux中特定的函數來訪問I/O內存資源,而不應該通過指向核心虛地址的指針來訪問。
讀寫I/O的函數如下所示:
2.1 writel()
writel()往內存映射的 I/O 空間上寫數據,wirtel() I/O 上寫入 32 位數據 (4字節)。
技術分享圖片


2.2 readl()
readl() 從內存映射的 I/O 空間上讀數據,readl 從 I/O 讀取 32 位數據 ( 4 字節 )。
技術分享圖片

6. ioremap() 函數解析