27、(6)Linux內核啓動引導階段之 __enable_mmu函數分析

 

  開啓MMU

在進入 __enable_mmu 的時候, r0中已經存放了控制寄存器c1的一些配置(在上一步中進行的設置), 但是並沒有真正的打開mmu

此時,一些特定寄存器的值如下所示:

r0 = c1 parameters      (用來配置控制寄存器的參數)        
r4 = pgtbl              (page table 的物理基地址)
r8 = machine info       (struct machine_desc的基地址)
r9 = cpu id             (通過cp15協處理器獲得的cpu id)
r10 = procinfo          (struct proc_info_list的基地址)

    在 arch/arm/kernel/head.S 中:

155  __enable_mmu:                           //函數聲明//

156  #ifdef CONFIG_ALIGNMENT_TRAP          /* 根據相應的配置,          

157    orr r0, r0, #CR_A                    *  設置r0中相應的位          

158  #else                                                     

159    bic r0, r0, #CR_A                    *                  

160  #endif                                *                      

161  #ifdef CONFIG_CPU_DCACHE_DISABLE      *     

162    bic r0, r0, #CR_C                    *                           

163  #endif                                 *                   

164  #ifdef CONFIG_CPU_BPREDICT_DISABLE     *  

165    bic r0, r0, #CR_Z                    *

166  #endif                                 *

167  #ifdef CONFIG_CPU_ICACHE_DISABLE       *

168    bic r0, r0, #CR_I                    *r0將用來配置控制寄存器c1

169  #endif                                 */

170    mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \

171           domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \

172           domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \

173          domain_val(DOMAIN_IO, DOMAIN_CLIENT))

174    mcr p15, 0, r5, c3, c0, 0      

175    mcr p15, 0, r4, c2, c0, 0      

176    b   __turn_mmu_on

177  ENDPROC(__enable_mmu)  

 

   .....................

 

190     .align 5

191  __turn_mmu_on:

192    mov r0, r0            //空操作

193    mcr p15, 0, r0, c1, c0, 0    //寫CP15控制寄存器

194    mrc p15, 0, r3, c0, c0, 0    //讀取ID寄存器

195    mov r3, r3

196    mov r3, r3

197    mov pc, r13     //r13中存儲的是__switch_data,即跳轉到

__switch_data

198   ENDPROC(__turn_mmu_on)

 

第195,196行的兩個nop是非常重要的,因爲在185行打開mmu操作之後,要等到3個cycle之後纔會生效,這和arm的流水線有關係.
因而,在打開mmu操作之後的加了兩個nop操作

 

發佈了81 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章