Bootloader 之U-boot启动流程

2019-07-13 05:29发布

一、U-boot的存储位置
  U-boot 一般是放在硬件“本地”(电路板)的Flash内,也有可能放在SD卡上,但是肯定不会放在内存或网络上。 二、U-boot的意义
  U-boot是嵌入式Linux操作系统中运行的第一个程序(可将U-boot和内核看做是两个不同的程序),其终极目的是引导加载内核进而使Linux操作系统运行起来,。如果U-boot出现问题 ,操作系统就无法启动,所以对于U-boot而言,其稳定性是第一位,运行速度是排在第二位的。 三、U-boot的启动流程
1、汇编阶段
A、初始化关键硬件:关闭看门狗、中断、MMU和Cache(缓存)等,开启时钟、串口、Flash和内存等。
  目的:为了U-boot稳定性,关掉不必要或影响稳定性的硬件,打开运行U-boot必须的硬件。即通过使U-boot运行单纯化,从而保证U-boot的稳定性。
B、U-boot自搬移:U-boot自己将自己从Flash搬移到内存(RAM)运行。
  目的:提高U-boot的运行速度。因为内存要比Flash速度快。
2、C语言阶段:
A、初始化大部分硬件;
B、将Linux内核(Kernel)从Flash中“搬移”到内存中运行;
C、运行内核(Kernel)。
在这里插入图片描述 四、U-boot启动之“汇编阶段”和“C语言阶段”
1、U-boot启动中“汇编阶段”的必要性:
A、U-boot初始化硬件阶段,要操作ARM体系架构下的特殊功能寄存器,而特殊功能寄存器必有由汇编语言访问,C语言无法访问。
B、如果使用C语言,在进入U-boot C程序的main函数之前需要提前把“栈”设置好,否者“栈”默认是0,无法运行C语言。所以U-boot启动先要使用汇编语言,把“栈”设置好,然后使用C语言。
2、U-boot启动中“C语言阶段”的重要性:
  U-boot启动运行过程能不能全用汇编语言写呢?原则上是可以的,但是汇编语言晦涩难懂、逻辑算法表达单一而且不易移植,所以在U-boot的启动代码中,能用C语言写就用C语言,C语言写不了的用汇编语言写(汇编语言代码占U-boot 总代码的10%左右。)。