嵌入式Linux开发实用教程(“十二五”国家重点图书出版规划项目)
上QQ阅读APP看书,第一时间看更新

2.2 U-Boot初步分析

U-Boot,全称为Universal Boot Loader(通用bootloader),是遵循GPL条款的开放源码项目,由德国DENX小组开发和维护。U-Boot能够非常容易地被移植到多种嵌入式CPU中,支持多种嵌入式操作系统内核的引导。不少U-Boot源码就是Linux内核源码的简化,特别是一些设备的驱动程序,使得它在引导 Linux Kernel 方面尤为出色。本文选用当前最新版本的 U-Boot,结合S3C6410处理器自身的特点,分析和探讨它的移植要点。笔者认为移植工作必须在充分理解源码的组织方式、处理器特点、单板外围器件原理等基础上进行。充分利用源码已经实现的功能,最小限度地破坏源码的结构。

2.2.1 源码结构

截止本书编写日期,U-Boot的最新版本为u-boot-2013.04-rc1.tar.bz2,U-Boot所有版本的下载地址为:http://ftp.denx.de/pub/u-boot/。rc(Release Candidate)表示正式发行候选版,1代表版本号,rc1 即候选版的第一版。rc 版本发布于软件的正式定稿之前,期间不会再加入新的功能或模块,这一版本的发布主要是为了让开源社区经验丰富的开发者率先试用以及时反馈和修正源码中存在的错误、漏洞,这个阶段过后就会发布相对稳定的正式版。笔者在移植该版本的时候,发现几处较为明显的错误,并通过U-Boot的邮件列表反馈了这些错误信息。这些错误的位置以及修正方法将会在移植的时候逐一介绍。

读者阅读本书时,u-boot-2013.04正式版本可能已经发布,甚至有更新版本的源码发布。其实U-boot版本间的差别并不是很大,较新版本仅仅在前面版本的基础上,增加或者修改了一些驱动程序,对源码的结构稍微的调整,但核心内容不会做太大的改变。但相比2010-03以前的版本,U-Boot后面的版本的源码组织结构作了较大的调整,使得其源码目录、编译形式与Linux Kernel源码愈加相似。

        liqiang@ubuntu:~/work/forbook$ tar -jxvf u-boot-2013.04-rc1.tar.bz2 -C ./

输入 tar 命令,解压源码到当前文件夹。进入 u-boot-2013.04-rc1 目录,其中有个文件名为“readme”的帮助文档,通读readme文件,我们能够大体上了解U-Boot获得和寻求帮助的途径,源码目录的组织结构,工程配置、编译的方法等。U-Boot顶层目录有很多子目录,下面介绍一些主要的目录。

(1)arch:对应不同构架的CPU,子目录的名字就是所支持的CPU构架的名称,如arch目录下含有arm、avr32以及x86等,这些目录可以继续细分。例如arm下含有cpu 、include 和lib等目录,其中cpu用于进一步区分不同体系的arm内核。

(2)common:该目录存在的是一些公共的通用代码文件,包括用于实现各种公共命令的cmd_*.c、env_*.c 文件以及一些通用函数。它们独立于处理器的体系结构,直接跟用户打交道,是用户与设备驱动之间沟通的纽带,也是U-Boot的精髓所在。

(3)drivers:该目录存放的是各类外设的驱动程序,如mmc、serial和net等。

(4)fs:支持文件系统。

(5)net:该目录里面的文件实现了各种网络协议。

(6)nand_spl:实现U-Boot从NAND Flash中启动的设备驱动。

(7)include:一些头文件和单板配置文件,所有单板配置的文件位于include/configs目录下。

(8)tools:常用工具,包括用于制作uImage的mkimage工具。

(9)Makefile:控制着整个工程的编译。