一、引导程序介绍
嵌入式系统的组成:
作用:从非易失性存储设备中读取 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,移除这一行:
nand write 30008000 40000 1c0000
7.setenv bootcmd nand read3000800040000 1c0000; 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) ------------------------------------------------------ |
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 中命令实现的原理