首页 > 其他 > 详细

uboot启动过程 1

时间:2020-11-28 23:13:15      阅读:72      评论:0      收藏:0      [点我收藏+]
打开 u-boot.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
 . = 0x00000000;
 . = ALIGN(4);
 .text :
 {
 *(.__image_copy_start)
 *(.vectors)
 arch/arm/cpu/armv7/start.o (.text*)
 *(.text*)
 }
。。。。。。。。。
 
 
_start 在文件 arch/arm/lib/vectors.S
.globl _start
    .section ".vectors", "ax"

_start:

#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
.word CONFIG_SYS_DV_NOR_BOOT_CFG
#endif

b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq

。。。。。

“.section ".vectors", "ax”可以得到,此代码存放在.vectors 段里面
grep -nR "__image_copy_start" u-boot.map得  0x0000000087800000, 因此.text地址为0x87800000
猜测.text地址为 连接是被 -Ttext 0x87800000改写了
 
 

reset函数在文件arch/arm/cpu/armv7/start.S

reset:  
  b save_boot_params
 
ENTRY(save_boot_params)  
  b save_boot_params_ret
 
save_boot_params_ret:
  mrs r0, cpsr                    // r0 = cps
  and r1, r0, #0x1f     @ mask mode bits      // r1 = r0&0x1F
  teq r1, #0x1a       @ test for HYP mode       // test (r1 == 0x1A)  判断当前处理器模式是否处于 Hyp 模式
  bicne r0, r0, #0x1f     @ clear all mode bits   // 如果不处于 Hyp 模式 r0 &= ~0x1F
  orrne r0, r0, #0x13     @ set SVC mode    //  如果不处于 Hyp 模式 r0 |= 0x13   设置SVC模式
  orr r0, r0, #0xc0     @ disable FIQ and IRQ   // r0 |= 0xC0, 最后 r0 应该是0xD3
  msr cpsr,r0                    // cps = r0, 最终CPU 处于 SVC32 模式,并且关闭FIQ 和 IRQ 这两个中断
  
#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
  /* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
  mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Register
    // CR_V 在 arch/arm/include/asm/system.h #define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */
    // 这里主要是 r0 &= ~(1<<13),将 V 清零,目的就是为了接下来的向量表重定位
    // 当V为 0 的时候向量表基地址为 0X00000000,软件可以重定位向量表。为 1 的时候向量表基地址为 0XFFFF0000,软件不能重定位向量表
  bic r0, #CR_V @ V = 0                  
  mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTLR Register
 
  /* Set vector address in CP15 VBAR register */
  ldr r0, =_start
  mcr p15, 0, r0, c12, c0, 0 @Set VBAR  // 将 r0 寄存器的值(向量表值)写入到 CP15 的 c12 寄存器中,也就是 VBAR 寄存器, 中断向量被重定向为_start
#endif
  
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
  bl cpu_init_cp15          // 函数 cpu_init_cp15 用来设置 CP15 相关的内容,比如关闭 MMU 啥的
  bl cpu_init_crit          
 #endif
  bl _main
 
ENTRY(cpu_init_cp15)
  // Invalidate L1 I/D
  mov r0, #0   @ set up for MCR
  mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
  mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
  mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array
  mcr p15, 0, r0, c7, c10,4 @ DSB
  mcr p15, 0, r0, c7, c5, 4 @ ISB
 
  // disable MMU stuff and caches
  mrc p15, 0, r0, c1, c0, 0
  bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
  bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
  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
#endif
  mcr p15, 0, r0, c1, c0, 0
  ......
   mov pc, r5 @ back to my caller
ENDPROC(cpu_init_cp15)
 
ENTRY(cpu_init_crit)  
  b lowlevel_init @ go setup pll,mux,memory
ENDPROC(cpu_init_crit)
 
函数 lowlevel_init 在文件 arch/arm/cpu/armv7/lowlevel_init.S
 
 

9种模式 [4:0]

10000 USER(user)

10001 FIQ(fiq)

10010 IRQ(irq)

10011 Supervisor(svc)

10110 Monitor(mon)

10111 Abort(abt)

11010 Hyp(hyp)

11011 Undefined(und)

11111 System(sys)

 

 

uboot启动过程 1

原文:https://www.cnblogs.com/kehuadong/p/14054220.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!