uboot启动流程详解(3)-cpu_init_cp15
2016-11-15 20:16
447 查看
1、代码及注释
说明:1、关于p15协处理及其指令的介绍请看《ARM协处理器介绍 》。
2、关于mmu的详细介绍请查看《 MMU内存管理单元介绍 》。
3、如果想要详细阅读以下代码,需要查阅arm的参考手册《ARM_Architecture_Reference_Manual_ARMv7-AR.pdf》。
/************************************************************************* * * cpu_init_cp15 * * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless * CONFIG_SYS_ICACHE_OFF is defined. * *************************************************************************/ ENTRY(cpu_init_cp15) /* * Invalidate L1 I/D */ mov r0, #0 @ set up for MCR mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs /*禁止从TLB中取地址描述符,也就是禁止虚拟地址到物理地址的转换,因为刚开始操作的都是物理寄存器!*/ mcr p15, 0, r0, c7, c5, 0 @ invalidate icache /*关闭指令cache*/ mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array /*关闭分支预测*/ mcr p15, 0, r0, c7, c10, 4 @ DSB /*多核cpu之间进行数据同步*/ mcr p15, 0, r0, c7, c5, 4 @ ISB /*进行指令同步,放弃流水线中已经取到的指令,重新取指令*/ /* * disable MMU stuff and caches */ /******************************************************* *1、为什么要关闭mmu? *因为MMU是把虚拟地址转化为物理地址得作用 *而我们现在是要设置控制寄存器,而控制寄存器本来就是实地址(物理地址), *再使能MMU,不就是多此一举了吗? ********************************************************/ /****************************************************************** *2、为什么要关闭cache? *catch和MMU是通过CP15管理的,刚上电的时候,CPU还不能管理他们。 *所以上电的时候MMU必须关闭,指令cache可关闭,可不关闭,但数据cache一定要关闭 *否则可能导致刚开始的代码里面,去取数据的时候,从catch里面取, *而这时候RAM中数据还没有cache过来,导致数据预取异常 *******************************************************************/ mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002000 @ clear bits 13 (--V-) /*设置成正常异常模式,即异常向量表的基地址为0x00000000*/ bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) /*关闭指令cache,关闭指令对齐检测,关闭mmu*/ orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align /*使能对齐检测*/ orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB /*使能分支预测*/ #ifdef CONFIG_SYS_ICACHE_OFF bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache #else orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache /*时能指令cache*/ #endif mcr p15, 0, r0, c1, c0, 0 #ifdef CONFIG_ARM_ERRATA_716044 mrc p15, 0, r0, c1, c0, 0 @ read system control register orr r0, r0, #1 << 11 @ set bit #11 mcr p15, 0, r0, c1, c0, 0 @ write system control register #endif #if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072)) mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register orr r0, r0, #1 << 4 @ set bit #4 mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register #endif #ifdef CONFIG_ARM_ERRATA_743622 mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register orr r0, r0, #1 << 6 @ set bit #6 mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register #endif #ifdef CONFIG_ARM_ERRATA_751472 mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register orr r0, r0, #1 << 11 @ set bit #11 mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register #endif #ifdef CONFIG_ARM_ERRATA_761320 mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register orr r0, r0, #1 << 21 @ set bit #21 mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register #endif mov pc, lr @ back to my caller /*程序返回*/ ENDPROC(cpu_init_cp15)
相关文章推荐
- uboot启动流程详解(3)-cpu_init_cp15
- uboot启动流程详解(4)-cpu_init_crit
- uboot启动流程详解(4)-cpu_init_crit
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- uboot启动流程详解(5)-_main
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- uboot启动流程详解(1)-_start
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- linux 启动流程详解之/init/main.c:init调用/etc/rc.d/rc.sysinit
- uboot启动流程详解(2)-reset
- 1.移植uboot-分析uboot启动流程(详解)
- uboot启动流程详解(2)-reset
- Linux系统启动流程详解(BIOS—MBR—GRUB--Kernel—init—run
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解) .
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- uboot启动流程详解(5)-_main
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)