uboot源码分析(2)

 

取出CPSR寄存器的值,CPSR寄存器保存当前系统状态,

使用比特清除命令清空了CPSR寄存器的中断控制位,表示清除中断。

设置了CPSR寄存器的处理器模式位为管理模式,然后在第117行写入 CPSR的值强制切换处理器为超级保护模式。

定义看门狗控制器有关的变量,

根据平台设置看门狗定时器。

设置时钟分频寄存器的值。

需要根据CONFIG_SKIP_LOWLEVEL_INIT宏的值是否跳转到cpu_init_crit标号执行

===========cpu_init_crit==========

                                                                cpu_init_crit标号处的代码初始化ARM处理器关键的寄存器


  1. 228   
  2. 238   
  3. 239   
  4. 240 #ifndef CONFIG_SKIP_LOWLEVEL_INIT  
  5. 241 cpu_init_crit:  
  6. 242     
  7. 245   mov r0, #0  
  8. 246   mcr p15, 0, r0, c7, c7,      // 1.刷新cache  
  9. 247   mcr p15, 0, r0, c8, c7,          // 2.刷新TLB  
  10. 248   
  11. 249     
  12. 252   mrc p15, 0, r0, c1, c0, 0  
  13. 253   bic r0, r0, #0x00002300 clear bits 13, 9:8 (--V- --RS)  
  14. 254   bic r0, r0, #0x00000087 clear bits 7, 2:0 (B--- -CAM)  
  15. 255   orr r0, r0, #0x00000002 set bit (A) Align  
  16. 256   orr r0, r0, #0x00001000 set bit 12 (I) I-Cache  
  17. 257   mcr p15, 0, r0, c1, c0, 0  
  18. 258   
  19. 259     
  20. 264   mov ip, lr  
  21. 265   bl  lowlevel_init  // 跳转到lowlevel_init  
  22. 266   mov lr, ip  
  23. 267   mov pc, lr  
  24. 268 #endif 

 

 

==>2.

TLB的作用是在处理器访问内存数据的时候做地址转换。TLB的全称是Translation Lookaside Buffer,可以翻译做旁路缓冲。

TLB中存放了一些页表文件,文件中记录了虚拟地址和物理地址的映射关系。当应用程序访问一个虚拟地址的时候,会从 TLB中查询出对应的物理地址,然后访问物理地址。TLB通常是一个分层结构,使用与Cache类似的原理。处理器使用一定的算法把最常用的页表放在最先访问的层次。

==>3.

程序第252~257行关闭MMU。MMU是内存管理单元(Memory Management Unit)的缩写。在现代计算机体系结构上,MMU被广泛应用。使用MMU技术可以向应用程序提供一个巨大的虚拟地址空间。在U-Boot初始化的时候,程序看到的地址都是物理地址,无须使用MMU。

 

 


=========================lowlevel_init========================= 

                                                                                                                                                                位于board/smdk2410/lowlevel_init.S文件
                                         开发板相关的初始化配置

  1. 133 lowlevel_init:  
  2. 134     
  3. 135     
  4. 136     
  5. 137   ldr      r0,   =SMRDATA                     // 读取SMRDATA变量地址  
  6. 138   ldr  r1,  _TEXT_BASE                        // 读取_TEXT_BASE变量地址  
  7. 139   sub    r0,  r0, r1                                 // 得出相对偏移
  8. 140   ldr      r1,  =BWSCON                        // 主要是了解BANK的位宽,16位
  9. 141   add    r2   r0 #13*4                      // 得到SMRDATA占用的大小,结尾处的偏移
  10. 142 0:  
  11. 143   ldr     r3, [r0], #4                              // 加载SMRDATA到内存  相当于一个while循环
  12. 144   str     r3, [r1], #4  
  13. 145   cmp     r2, r0  
  14. 146   bne     0                                       // 循环,相当于while循环
  15. 147   
  16. 148     
  17. 149   mov pc, lr  
  18. 152   
  19. 153   
  20. 154 SMRDATA:            // 定义SMRDATA值  
  21. 155     .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON   
  22.         <<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))  
  23. 156     .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_ Tcoh<<6)+  
  24.         (B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))  
  25. 157     .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+   
  26.         (B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))  
  27. 158     .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+   
  28.         (B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))  
  29. 159     .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+   
  30.         (B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))  
  31. 160     .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+   
  32.         (B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))  
  33. 161     .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+   
  34.         (B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))  
  35. 162     .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))  
  36. 163     .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))  
  37. 164     .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+   
  38.         (Tchr<<16)+REFCNT)  
  39. 165     .word 0x32  
  40. 166     .word 0x30  
  41. 167     .word 0x30 

程序第137~141行计算SMRDATA需要加载的内存地址和大小。首先在137行读取SMRDATA的变量地址,之后计算存放的内存地址并且记录在r0寄存器,然后根据总线宽度计算需要加载的SMRDATA大小,并且把加载结束地址存放在r2寄存器。

程序第142~146行复制SMRDATA到内存SMRDATA是开发板上内存映射的配置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值