此函数的功能主要是:禁止ICache、DCache、数据Cache、指令Cache
在 arch/arm/kernel/head.S 中:
363 .type __arm920_setup, #function //函数
364 __arm920_setup: 声明//
365 mov r0, #0 //r0清零
366 mcr p15, 0, r0, c7, c7 //使无整个数据cache和指令cache
367 mcr p15, 0, r0, c7, c10, 4 //清空写缓冲 366、367两行,查看C7,<ARM体系结构与编程> P205
368 #ifdef CONFIG_MMU
369 mcr p15, 0, r0, c8, c7 //如果有配置了MMU,则需要清除(invalidate)Instruction TLB 和Data TLB
370 #endif
371 adr r5, arm920_crval //取arm920_crval的地址到r5中,arm920_crval 在第386行,宏crval在“arch/arm/mm/proc- macro.S”中定义,如下所示:
.macro crval, clear, mmuset, ucset
#ifdef CONFIG_MMU
.word \clear
.word \mmuset
#else
.word \clear
.word \ucset
#endif
.endm
由上可知,首先在arm926_crval的地址处存放了clear的值,然后接下来的地址存放了mmuset的值(对于配置了MMU的情况)
372 ldmia r5, {r5, r6} //将clear、mmuset的值作别存入r5、r6
373 mrc p15, 0, r0, c1, c0 //将寄存器C1中的值读到ARM寄存器R0中
C1寄存器,请看<ARM体系结构与编程> P174
374 bic r0, r0, r5 //由第387行知,r5=0x00003f3f (清除位)
375 orr r0, r0, r6 r6=0x00003135(置位) ,r0就是c1寄存器
376 mov pc, lr
377 .size __arm920_setup, . - __arm920_setup
385 .type arm920_crval, #object
386 arm920_crval:
387 crval clear=0x00003f3f, mmuset=0x00003135, ucset=0x00001130
389 __INITDATA