阅读uboot源码的历程

来源:互联网 发布:网络电话机终端 编辑:程序博客网 时间:2024/05/01 04:06

写在阅读之前的话:

     随着软件行业发展演变,现在软件越来越系统结构化,这样产生海量代码。它们既能够作为基础组件现在软件产品提供基本服务但同时软件调试带来很多问题,因为看别人代码总是痛苦的。然而优秀代码永远值得我们崇敬,因为聪明的技巧在于积累与思考,优秀代码总是看到相似东西,而且能够我们学习提高带来很多益处。

     通过别人优秀代码,我们至少有3可以思考与学习的:

     1.弄懂基本可参考代码的运行流程或者系统框架,比如:uboot源码、linux源码、webkit源码等等都能够我们系统理解高效实现自己想要功能,提供参考。

     2.感悟观摩优秀编程风格,好的编程风格不仅能使系统实现简洁、高效而且更容易维护。

     3.摘取部分参考代码用在实际项目之中。

阅读uboot源码的参考历程:

     0)推荐阅读方法:a.追踪源码,“source insight”工具;b.通过编译时产生的system.sym来查看;c.通过反汇编生成的可执行文件来查看(在gcc的debug模式下),因为可以去掉许多的宏来配置所需要的功能。三管齐下,因为u-boot是一个C程序---即是一个流程控制程序,所以就是只关心控制的流动情况即可。

   1)学习进程:

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

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

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

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

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

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