u-boot 学习之综述

来源:互联网 发布:什么是金十数据 编辑:程序博客网 时间:2024/05/21 09:09

一、引导程序介绍


嵌入式系统的组成:




作用:从非易失性存储设备中读取 data 到 Memory

流程:初始化设备-> 读OS 到Memory -> 启动OS


开源的Bootloaders:


解释:

1.区分一下“Bootloader”和Monitor的概念

严格来说,“Bootloader”只是引导设备并且执行主程序的固件;而“Monitor”还提供了更多的命令行接口,可以进行调试、读写内存、烧写Flash、配置环境变量等。“Monitor”在嵌入式系统开发过程中可以提供很好的调试功能,开发完成以后,就完全设置成了一个“Bootloader”。所以,习惯上大家把它们统称为Bootloader

2.对于每种体系结构,都有一系列开放源码Bootloader可以选用。

(1)X86
X86的工作站和服务器上一般使用LILO和GRUB。LILO是Linux发行版主流的Bootloader。不过Redhat Linux发行版已经使用了GRUB,GRUB比LILO有更有好的显示界面,使用配置也更加灵活方便。
在某些X86嵌入式单板机或者特殊设备上,会采用其他Bootloader,例如:ROLO。这些Bootloader可以取代BIOS的功能,能够从FLASH中直接引导Linux启动。现在ROLO支持的开发板已经并入U-Boot,所以U-Boot也可以支持X86平台。
(2)ARM
ARM处理器的芯片商很多,所以每种芯片的开发板都有自己的Bootloader。结果ARM bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM平台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。
(3)PowerPC
PowerPC平台的处理器有标准的Bootloader,就是ppcboot。PPCBOOT在合并armboot等之后,创建了U-Boot,成为各种体系结构开发板的通用引导程序。U-Boot仍然是PowerPC平台的主要Bootloader。
(4)MIPS
MIPS公司开发的YAMON是标准的Bootloader,也有许多MIPS芯片商为自己的开发板写了Bootloader。现在,U-Boot也已经支持MIPS平台。
(5)SH
SH平台的标准Bootloader是sh-boot。Redboot在这种平台上也很好用。
(6)M68K
M68K平台没有标准的Bootloader。Redboot能够支持m68k系列的系统。
值得说明的是Redboot,它几乎能够支持所有的体系结构,包括MIPS、SH、M68K等体系结构。Redboot是以eCos为基础,采用GPL许可的开源软件工程。现在由core eCos的开发人员维护,源码下载网站是http://www.ecoscentric.com/snapshots。Redboot的文档也相当完善,有详细的使用手册《RedBoot User’s Guide》。


Bootloader任务:

1.初始化处理器以及外设的硬件资源

配置SDRAM 控制器,为主程序提供运行环境

串口,提供交互终端

网络,传输镜像文件

其它I/O设备

2.执行系统自检,报告检测结果

3.引导操作系统

4.根据系统命令烧写镜像文件



二、u-boot 的功能及常用命令

1.? :得到所有命令列表

2.help: help nand 列出nand功能的使用说明

3.ping:只能开发板PING别的机器(u-boot功能有限)

4.setenv: 设置环境变量:

setenv serverip 192.168.0.1  

//宿主机ip该命令只是把设置保存到ram中,如果重启的话设置会重新回到原来的设置。这时我们用saveenv命令把设置保存到flash中。

setenv ipaddr 192.168.0.56//目标机的ip

5.tftp: tftp 3000800 zImage

使用U-Boot下载Linux内核或者应用程序的快捷的方法是通过网络传输。为了这一目的,U-Boot实现了TFTP协议。为了使主机支持TFTP,你必须确保TFTP后台程序/usr/sbin/in.tftpd已经安装。在RedHat系统中,你可以运行下面的命令来确认:$ rpm -q tftp-server

如果没有安装,请从你的Linux安装盘或者其它媒介安装。大多数的Linux发行版都默认关闭TFTP服务。以RedHat系统为例,如果要使能TFTP服务, 编辑文件/etc/xinetd.d/tftp,移除这一行:

disable = yes
或者注释掉它:
# default: off
# description: The tftp server serves files using the trivial file transfer
#       protocol.  The tftp protocol is often used to boot diskless
#       workstations, download configuration files to network-aware printers,
#       and to start the installation process for some operating systems.
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args           = -s /tftpboot //server端主目录
#       disable                 = yes
        per_source              = 11
        cps                     = 100 2
}
此外,确保/tftpboot目录存在,而且有访问权限(至少应该"dr-xr-xr-x")。
或者把disable = yes 改为 disable = no
这样就已经打开了主机linux中的tftp服务。下面我们可以用uboot的tftp命令来传输文件到目标板的ram中运行。
配置好各个参数后,我们在uboot命令窗口中使用tftp命令把内核,文件系统拷贝到ram中。

#tftp 30008000 zImage  //在主机 /tftpboot目录中的zImage文件下载到目标板内存的30008000地址中。

6.nand: nand earse 4000 1c0000
nand flash write 之前必须要先擦除

nand write 30008000 40000 1c0000


7.setenv bootcmd nand read30008000400001c0000; go 30008000 

从nand flash 中读取系统镜像文件到SDRAM中


8.setenv bootargs root=/dev/mtdblock2 console=ttySAC0,115200 init=/linuxrc

启动时给系统传递一些参数


9.saveenv


三、u-boot启动及初始化过程


U-BOOT代码的启动过程可以分为两种阶段。一般而言,这两个阶段完成的功能可以如下分类:

(1)Bootloader第一阶段的功能。

硬件设备初始化。

加载Bootloader 的代码到RAM 。

设置stack、bss。

跳转到第二阶段代码的C 入口点。

(2)Bootloader第二阶段的功能。

初始化本阶段要使用到的硬件设备。

检测U-BOOT模式,命令模式,启动模式。

如果进入启动模式,执行环境变量的bootcmd命令。

将内核映象从Flash 上读到RAM 空间中。

为内核设置启动参数。

调用内核。


1.U-Boot第一阶段

(1)硬件设备初始化

依次完成如下设置:设置CPU 的工作模式、关闭watchdog、关闭中断、设置FCLK、HCLK、PCLK,关闭MMU、CACHE、初始化RAM、初始化Flash。

(2)复制Bootloader的第二阶段代码到 RAM 空间中

这里将整个U-Boot 的代码(包括第一、第二阶段)都从flash中复制到SDRAM 中。

(3)设置stack、bss(Block Started by Symbol)

(4)跳转到第二阶段代码的C入口点。

它将调用中的start_armboot 函数,这是第二阶段的入口点。

 

2.U-Boot第二阶段

(1)初始化本阶段要使用到的硬件设备

最主要的是设置timer、初始化串口,初始化env。

(2)检测进入的U-BOOT模式,命令模式,启动模式?

如果是命令模式,处理用户命令。如果是启动模式,就会执行环境变量的中bootcmd命令。

bootcmd=nand read 0xc00080000x50000 0x1c0000;bootm0xc0008000

(3)内核设置启动参数。

启动内核,传递参数。


 


四、u-boot 在 nandflash 上的移植要点


U-Boot将NAND Flash启动划分为三个阶段:IPL(InitialProgram Loader)、SPL (Secondary Program Loader)和NUB (NANDU-Boot),具体说明如下:

Herea short description of the different boot stages:

a)IPL (Initial Program Loader, integrated inside CPU)

------------------------------------------------------
Will load first 4k from NAND (SPL) into
internal ramand execute it from there.

b) SPL (Secondary Program Loader)
---------------------------------
Will load special U-Boot version (NUB) from NAND and execute it. This SPL
has to fit into 4kByte. It sets up the CPU and configures the SDRAMcontroller and the NAND controller so that the special U-Boot image can beloaded from NAND to SDRAM.
This special image is build in the directory "nand_spl".

c) NUB (NAND U-Boot)
--------------------
This NAND U-Boot (NUB) is a special U-Boot version which can be started
from RAM. Therefore it mustn't (re-)configure the SDRAM controller.

 

IPL实现装载NAND Flash部分扇区(SPL )到芯片internalram(setpping stone),这部分功能由集成在芯片中的硬件实现,例如s3c2410的NAND控制器可以将NAND Flash的起始4k bytes代码复制到internalram。

SPL初始化基本系统(sdram和nand控制器)并装载特殊的u-boot(NUB)代码到sdram,并运行NUB 。

NUB是一个被配置成运行在sdram的特殊u-boot版本,由于SPL已经初始化部分设备,NUB不再需要再对这些设备进行其初始化。

 




五、在u-boot 中命令实现的原理