1. 程式人生 > >Linux 對處理器實體地址/虛擬地址和ioremap函式的個人理解

Linux 對處理器實體地址/虛擬地址和ioremap函式的個人理解

寫在前面

在Linux驅動學習過程中,遇到了ioremap這個函式,引數是phy_addr,返回值是虛擬地址。 linux啟動以後,由於mmu的存在,想要控制暫存器,要找到暫存器實體地址的虛擬地址對映(聽著比較拗口)。
前幾天遇到了一個問題,手上的板子是rk3399,64bit的cpu,ram是2GB。spi3暫存器的base addr是0xff350000, 通過ioremap函式可以找到spi3 base addr的virtual add,但是0xff35000已經超過了ram的2GB,這個實體地址到底是什麼地址。 原來一直任務cpu的實體地址指的是ram。
查詢資料,發現原來對cpu的地址理解有很大的誤區。

個人理解

  1. cpu的定址大小是與本身是32位還是64位有關。
  2. 暫存器地址就是實體地址,ram地址也是實體地址,ram的實體地址是固定的,大小受儲存控制器控制
  3. 關於記憶體對映,也就是mmu,不僅對映ram這個儲存的地址,還映射了暫存器的儲存地址(暫存器是存放在ram之外的儲存裝置裡面的)
  4. arm的可定址空間的地址可以使用,也可以不使用,哪些實體地址代表什麼,是cpu廠商去定義的。

錯誤分析

舉個例子, ioremap(0xff350000, flags); 這個0xff350000是rk3399的spi3暫存器的地址。 我一直在疑惑,程式是執行在記憶體上面的,我們的記憶體是2G的,0xff350000超過了3G,這怎麼可能。
出現這個疑惑的原因,是因為我一直以為mmu的記憶體對映僅僅對映mmu,其實暫存器儲存器也被映射了。 所以ioremap(0xff350000, flags)的意思是,找到0xff350000的虛擬地址,這個地址實際上是存在的,只是不在ram儲存器上,是在暫存器儲存器上。

我原來的錯誤是
1. 認為mmu只對映ram
2. 暫存器也是有儲存空間的
3. 實體地址就是cpu可尋的地址,可以使用,也可以不適用
4. 暫存器實體地址的是廠商定義的,這個不用糾結