zoukankan      html  css  js  c++  java
  • u_boot启动过程中的具体分析(1)

    题闭上眼睛,细致的回顾一下从NAND FLASH 启动的整个流程,首先,当我们打开板子的时候,先执行的就是嵌入在芯片上的iROM,它的作用就是为了把。NAND Flash 中的bootloader的一部分代码复制到芯片上面的sRAM中,之后,程序在sRAM中执行,它的主要任务就是初始化我们的内存。时钟,以及存储设备,当然更重要的就是从存储设备NAND Flash上拷贝剩下的bootloader到我们的内存的相关位置,之后,执行接下来的bootloader程序,载入执行我们的OS,以及挂在根文件系统,详细的流程见下图:


    那么在载入我们的OS之前程序到底做了哪些事情呢?

    接下来,就具体的叙述一下,u-boot第一阶段的启动过程:

    (1)设置异常向量表:表中存放的是一些跳转指令,能够跳转到相关的异常处理函数。

    (2)设置ARM的核位SVC(管理模式)。禁止IRQ,FIQ异常的产生。

    (3)关闭cache ,MMU。关闭cache是由于此时我们用cpu所调用的过程中cache还没有存储相关的有效内容。

    所以要关闭它,而MMU内存管理单元。是把虚拟的地址映射为实际的物理地址,当然这是在载入OS之后才能完毕的事情。

    (4)关闭看门狗。

    我们都知道看门狗的作用。此时就是为了防止系统自己主动的复位所以才关闭的。

    (5)设置向量中断控制器:

    1 禁止全部的中断。

    2 设置全部的中断类型为IRQ.

    3 清除公共向量地址寄存器。

    (6)初始化UART的GPIO口。为了之后串口的正常使用,所以初始化串口是必须的。

    (7)初始化系统的时钟。这里面须要注意的是。系统时钟必须在载入操作系统之前给初始化了,若在载入OS之后才初始化。此时easy导致内存的不稳定,当然后果极为可能就是系统over了。

    (8)初始化DDR内存控制器,为之后要把引导载入程序载入到内存做好铺垫。

    (9)推断u_boot是否已经在内存中执行。该步是为了防止,之前已经把bootloader载入到了内存中而设置的。

    若已经存在,怎直接设置栈,反之。搬移u-boot到内存地址。

    (10) 设置栈。

    记住。栈是从上往下压的。

    (11)清除.bss段,.bss段中本来存放的是未初始化的全局变量,以及未初始化的静态变量,所以刚開始的时候

    在NAND Flash中是未知的,所以在拷贝bootloader到内存的时候。我们并没有把.bss段给复制到内存中去,而是在拷贝过去之后,我们一步步的把.bss段给清0了。

    (12)设置PC到内存中的对应位置。也就是把第一阶段bootloader的大小给偏移过去的第二阶段的bootloader的地方,去运行接下来的操作。


    当中我们须要注意的是,我们经常从NAND Flash启动,可是u-boot默认的经常是从NOR Flash启动,这样就须要我们自己手动的将NAND Flash启动的代码加入进去。


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题解
    洛谷 P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower/ACWing 314 低买 题解
    7、Python异常
    必须要调整心态,积极起来,不能再偷懒
    5、Python函数
    10、Python数据库支持
    8、Python方法、属性、迭代器
    9、Python模块和标准库
    6、Python抽象的类
    UDP Linux编程(客户端&服务器端)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4714745.html
Copyright © 2011-2022 走看看