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之后才初始化,此时容易导致内存的不稳定,当然后果极为可能就是系统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启动的代码添加进去。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值