uboot启动流程详解(3)-cpu_init_cp15

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值