boot启动流程

更新时间:2023-05-17 12:18:56 阅读: 评论:0

U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:
    1胶水的成分)第一阶段的功能
  硬件设备初始化
  加载U-Boot第二阶段代码到RAM空间
饺子怎么画
  设置好栈
  跳转到第二阶段代码入口
    2)第二阶段的功能
  初始化本阶段使用的硬件设备
  检测系统内存映射
  将内核从Flash读取到RAM
  为内核设置启动参数
  调用内核
1.1.1            应用分身U-Boot启动第一阶段代码分析
    第一阶段对应的文件是cpu/arm920t/start.Sboard/samsung/mini2440/lowlevel_init.S
    U-Boot启动第一阶段流程如下:
 
2.1 U-Boot启动第一阶段流程
 
    根据cpu/arm920t/u-boot.lds中指定的连接方式:
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;
 
    . = ALIGN(4);
    .text :
    {
            cpu/arm920t/start.o    (.text)
            board/samsung/mini2440/lowlevel_init.o (.text)
            board/samsung/mini2440/nand_read.o (.text)
        *(.text)
    }
    … …
}
    第一个链接的是cpu/arm920t/start.o,因此u-boot.bin的入口代码在cpu/arm920t/start.o中,其源代码在cpu/arm920t/start.S中。下面我们来分析cpu/arm920t/start.S的执行。
1.      硬件设备初始化
1)设置异常向量
    cpu/arm920t/start.S开头有如下的代码:
.globl _start
_start:    b    start_code                /* 复位    */
    ldr    pc, _undefined_instruction    /* 未定义指令向量 */
    ldr    pc, _software_interrupt        /*  软件中断向量 */
    ldr    pc, _prefetch_abort            /*  预取指令异常向量 */
    ldr    pc, _data_abort                /*  数据操作异常向量 */
    ldr    pc, _not_ud                /*  未使用  */
    ldr    pc, _irq                        /*  irq中断向量  */
    ldr    pc, _fiq                        /*  fiq中断向量  */
/*  中断向量表入口地址 */
_undefined_instruction:    .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:    .word prefetch_abort
_data_abort:        .word data_abort
_not_ud:        .word not_ud
_irq:            .word irq
_fiq:            .word fiq
 
    .balignl 16,0xdeadbeef
 
    以上代码设置了ARM异常向量表,各个异常向量介绍如下:
2.1 ARM异常向量表
美味的妹妹
地址 
异常 
进入模式
描述
0x00000000 
复位
管理模式
复位电平有效时,产生复位异常,程序跳转到复位处理程序处执行
0x00000004 
未定义指令
未定义模式
遇到不能处理的指令时,产生未定义指令异常
0x00000008
软件中断
管理模式
龙卷风怎么画执行SWI指令产生,用于用户模式下的程序调用特权操作指令
0x0000000c
预存指令
中止模式
你是我不及的梦处理器预取指令的地址不存在,或该地址不允许当前指令访问,产生指令预取中止异常
0x00000010
数据操作
中止模式
处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常
0x00000014
未使用
未使用
未使用
0x00000018
IRQ
IRQ
外部中断请求有效,且CPSR中的I位为0时,产生IRQ异常
0x0000001c
FIQ
FIQ
快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常
    cpu/arm920t/start.S中还有这些异常对应的异常处理程序。当一个异常产生时,CPU根据异常号在异常向量表中找到对应的异常向量,然后执行异常向量处的跳转指令,CPU就跳转到对应的异常处理程序执行。
    其中复位异常向量的指令“b    start_code”决定了U-Boot启动后将自动跳转到标号“start_code”处执行。
2CPU进入SVC模式
start_code:
    /*
    * t the cpu to SVC32 mode
    */
    mrs    r0, cpsr
    bic    r0, r0, #0x1f        /*工作模式位清零 */
    orr    r0, r0, #0xd3        /*工作模式位设置为“10011”(管理模式),并将中断禁止位和快中断禁止位置芒果的热量1 */
    msr    cpsr, r0
    以上代码将CPU的工作模式位设置为管理模式,并将中断禁止位和快中断禁止位置一,从而屏蔽了IRQFIQ中断。
3)设置控制寄存器地址
# if defined(CONFIG_S3C2400)
#  define pWTCON    0x15300000   
#  define INTMSK    0x14400008   
#  define CLKDIVN    0x14800014   
#el    /* s3c2410s3c2440下面4个寄存器地址相同 */
解酒小妙招
#  define pWTCON    0x53000000            /* WATCHDOG控制寄存器地址    */
#  define INTMSK    0x4A000008            /* INTMSK寄存器地址  */
#  define INTSUBMSK    0x4A00001C    /* INTSUBMSK寄存器地址 */
#  define CLKDIVN    0x4C000014              /* CLKDIVN寄存器地址 */
# endif
    对与s3c2440开发板,以上代码完成了WATCHDOGINTMSKINTSUBMSKCLKDIVN四个寄存器的地址的设置。各个寄存器地址参见参考文献[4]
4)关闭看门狗
    ldr    r0, =pWTCON
    mov    r1, #0x0
    str    r1, [r0]    /* 看门狗控制器的最低位为0时,看门狗不输出复位信号 */
    以上代码向看门狗控制寄存器写入0,关闭看门狗。否则在U-Boot启动过程中,CPU将不断重启。

本文发布于:2023-05-17 12:18:56,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/667547.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指令   地址   向量
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图