1.1 引导加载程序
在Linux启动前,需要一小段代码来初始化系统。这段代码与所用机器设备有很大的相关性。尽管目前的几种主流引导加载器都提供了广泛的扩展功能,但是Linux只要求引导加载器执行少量的工作。最低要求如下:
- 配置系统内存。
- 在正确的内存地址加载内核映像和设备树。
- (可选地)在正确的内存地址加载内存磁盘设备。
- 设置内核的命令行和其他参数(例如设备树、机器类型)。
通常情况下,引导加载器的另一个基本功能是:在启动内核之前初始化一个串口控制台。
目前流行的有各种各样的引导加载器。U-Boot是ARM Linux的标准引导加载器。它的主线代码位于http://git.denx.de/u-boot.git,并且在wiki上有专门的页面:http://www.denx.de/wiki/U-Boot/SourceCode。
下面列出了U-Boot的主要特性:
1. 尺寸小:U-Boot是一个引导加载器,也就是说,它在系统里的主要作用是加载操作系统。这就意味着它要实现一些基本功能,但是又不能占用太多的系统资源。典型的例子就是U-Boot存储在相对更小的、更昂贵的NOR闪存中,而操作系统和应用程序存储在更大的、更廉价的NAND闪存中。U-Boot的可用配置(也是有用的)包括基本的交互式命令解释器、支持通过以太网下载文件以及支持对闪存进行编程,它的体积不应超过128 KB。
2. 启动快:最终用户对运行U-Boot并不感兴趣。在大多数的嵌入式系统里,他们甚至感觉不到U-Boot的存在。通常用户关心的是运行应用程序,期望应用程序在开机后能尽快运行起来。所以在U-Boot中只对需要用到的设备执行初始化,也就是说,除非U-Boot需要通过以太网执行下载文件操作,否则就不要初始化以太网接口,除非U-Boot试图从磁盘或者USB设备中加载文件,否则不要初始化任何磁盘或USB设备。
3. 可移植:U-Boot不仅是一个引导程序,也是一个工具,可以用于单板启动、生产测试,以及与硬件开发密切相关的活动。到目前为止,它已被移植到大约30个不同处理器系列的数百个不同单板上。
4. 可配置:U-Boot是一个有非常多实用功能的强大工具。每一个维护者或者使用者必须谨慎决定哪些功能是重要的,哪些功能必须包含在特定的板级配置文件里以满足当前的需求和限制。
5. 可调试:U-Boot本身不仅仅是一个工具,它也经常被用于硬件初始化启动。所以U-Boot调试通常意味着你不知道是在跟踪U-Boot软件的问题,还是在跟踪运行所用的硬件的问题。简洁易懂的编码和调试功能对每一个人都更加重要。U-Boot的一个重要功能是:在启动阶段能把调试信息及时输出到控制台(通常是串口),即使在调试一些内存相关的功能时也是如此。所有的初始化步骤应该在开始前打印一些类似“开始运行”这样的信息,并在结束时打印“已完成”信息。例如:在开始内存初始化和探测内存大小之前可以打印一条“RAM:”的信息,并且在结束的时候打印“256 MB、n”的字样。这样做的目的是:当问题发生时,你可以实时观察到程序运行到了哪一步。这些功能不仅在软件开发的时候重要,而且在技术支持人员调试硬件问题时同样重要。U-Boot应该支持JTAG调试和BDM调试。它应该使用简单的单进程模式。