如何阅读uboot源码 下载本文

内容发布更新时间 : 2024/12/27 13:26:12星期一 下面是文章的全部内容请认真阅读。

如何阅读uboot源码

[原]如何阅读uboot源码2012-5-8阅读404 评论0写在阅读之前的话: 随着软件行业的发展与演变,现在的软件越来越系统化与结构化,这样就产生海量的代码。它们既能够作为基础组件为现在软件产品提供基本的服务,但同时也为软件调试带来很多的问题,因为看别人的代码总是痛苦的。然而优秀的代码永远值得我们崇敬,因为聪明的技巧在于积累与思考,优秀的代码总是能看到相似的东西,而且能够为我们学习与提高带来很多的益处。 通过看别人优秀的代码,我们至少有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)与驱动数据结构.