uboot启动流程分析2 - reset函数

  • reset
    _start开始是中断向量表,先跳转到了reset,arch/arm/cpu/armv7/start.S
    reset -> save_boot_params -> save_boot_params_ret
    uboot启动流程分析2 - reset函数
    uboot启动流程分析2 - reset函数
    uboot启动流程分析2 - reset函数
    43行,mrs是读取cpsr中的数值到r0中,cpsr是程序状态寄存器
    44行,and是与运算,将r0的低五位保存到r1中
    45行,比较是不是出于hyp模式
    46行,bic位清除指令,ne不等于
    47行,orr逻辑或运算,设置SVC模式
    48行,清除FIQ和IRQ位
    49,行,更新最新的cpsr值
    以上执行实现,将处理器设置为SVC模式,并关闭FIQ和IRQ
  • 设置中断向量
    uboot启动流程分析2 - reset函数
    58行,读取CP15 SCTLR寄存器,
    59行,#define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */,SCTLR的第13位为V,表示向量表控制 位,为0,表示向量表基地址是0,软件可以重定位,为1,表示向量表基地址为0XFFFF0000,不能重定位。bic用位清除指令,将V清零,可以软件重定位。
    60行,将r0写入SCTLR寄存器中
    63行,_start的起始地址赋给r0,是整个uboot的起始地址,也是向量表的起始地址
    64行,将r0的数值写入到c12寄存器,也就是VBAR寄存器,完成向量表的重定位
    以上先清除V位,然后将_start地址写入VBAR,完成设置中断向量表的偏移
  • 初始化设置cp15和crit寄存器
    uboot启动流程分析2 - reset函数