[Android6.0][RK3399] U-boot启动流程分析(准备)

工具

  1. Source Insight 阅读源码工具
  2. 通过编译时产生的 System.sym 查看
  3. 通过反汇编生成的可执行文件来查看

我们分析 u-boot 分为六个阶段:

一、Makefile 与 lds

从认识内存分配开始,链接脚本,*.lds。从Makefile与config.mk中的变量,得到对应的脚本的位置,根据链接脚本,画出内存分配图。
主要得到信息:
1、开始进入点命令(ENTRY),得到程序的开始点。
2、程序的内存开始地址
3、程序的内存分段信息与对齐方式、对应的功能。

二、汇编部分 start.S

uboot 的第一阶段,汇编部分,主要完成处理器的初始化(工作模式、缓存、配置协处理器)与内存的初始化流程,内存的初步分配(用于为c语言的实现提供对应的运行环境)
附:c语言的运行环境有哪些?答:一个堆栈用于实现函数调用,因为c语言的汇编过程实现函数都用相同的过程,必须设置一个堆栈。
1、处理器初始化,熟悉对应的处理器构架,知道对应的寄存器的作用:
设置主要寄存器的值,清除缓存,设置为平坦模式(直接从内存中读取指令),设置协处理器,配置相关的内存控制方式。
2、主要的汇编命令–赋值与跳转:注意相关的常量与跳转地址。
3、配置中断:其实,操作系统就是一个中断驱动的程序
4、配置内存地址:第一步,读取uboot文件到对应的内存地址,第二步,配置*.lds定义的内存映像到对应的寄存器中

三、系统资源初始化

uboot 的 第二阶段之一,完成必要的系统资源的初始化。IO口与串口。(uboot启动过程与linux启动过程很相似)
1.要读懂系统的硬件寄存器配置,这个一般由芯片生产厂商提供详细的技术手册。
2.初始化系统一般有两种方式:直接调用初始化程序(比如:内存,串口,gpio口等),间接调用(初始化序列)。

四、核心数据结构与系统分析

uboot 的 第二阶段之二,核心的数据结构与系统的简单分析。
附:c语言编程或者汇编编程,一个极其重要的概念就是存储器的分配。存储器主要关心的有两级——(1)内存分配(2)nand分配。
由于现在还没有引入操作系统,所以这些资源都是由地址来维护的。如果引入操作系统就是由操作系统来维护的(标准的内存分配函数与文件系统)
1.分析内存与NAND的基本分配——弄清环境变量,会灵活运用各种环境变量来配置uboot的各种功能,满足各种运用。
2.主要核心数据结构,两个基本数据结构(gd_t,bd_t,cmdl_t)与驱动数据结构.

五、命令行解析与引导操作系统

uboot 的 第二阶段之三,命令行解析与引导操作系统。
1.理解uboot命令行的实现,这个技巧在linux内核初始化驱动时也会运用到。
其实就是利用编译器的链接功能,专门格式化一个段,用于存储对应的命令指针,然后运行该命令。
2.引导操作系统:bootm命令,追踪操作系统的引导过程,以linux的作为参考。
建议:打开已经编译好的linux内核,看最前的一些字节,用于理解引导操作系统的过程。

总结

配置、修改、移植、调试。
1.配置:弄懂硬件资源,包括系统必要的:处理器构架,存储器分配(内存与flash),IO口配置,调试串口的,网口的……其他可配置的东西:USB口,文件系统…
2.修改:弄清流程与相关技术手册,在uboot对应的地方修改来适应开发的需要。
3.移植:知道怎么编译uboot在其上增加相应的功能,比如:开机音乐,开机logo等。
4.调试系统:uboot除了引导linux操作系统,还有另外一个重要的作用就是调试板子上的硬件资源。
主要有4种方式:
a)在uboot启动流程中增加一个入口,编译到uboot的文件中。
b)在uboot的命令行中,增加一条命令。同样这种方式也是要编译到uboot的文件中
c)放在nand中,uboot读相应的程序到内存中运行。
d)放在主机中,利用网口tftp工具,独到内存中,再运行之。

参考文章:http://blog.csdn.net/kris_fei/article/details/52536093

您的支持将鼓励我继续创作!