参考博文: http://blog.51cto.com/9291927/1791237
另一方面,uboot的概要U-Boot、全名通用引导加载器是从遵循GPL条款的FADSROM、8xxROM、PPCBOOT发展演变而来的开源项目。
– 在操作系统方面,U-Boot不仅支持
引导还支持NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS和android嵌入式操作系统的嵌入式Linux系统。 当前支持的操作系统包括OpenBSD、NetBSD、FreeBSD、4.4BSD、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、VxWorks
– 在CPU架构方面,U-Boot除了支持PowerPC系列处理器外,还支持许多常见系列处理器,包括MIPS、x86、ARM、NIOS和XScale。
– uboot主要作用用于启动操作系统内核
* *
uboot什么时候开始运行,什么时候结束运行?
1.uboot本质上是裸机程序,不是操作系统。 一旦uboot开始SoC,就简单地执行uboot。 (意味着在uboot运行时其他程序不能同时运行) )如果uboot运行结束,则无法返回uboot。 ),所以uboot启动内核后,uboot自己就会死。 要再次看到Ubooot界面只能重新启动,重新启动并没有恢复刚才的uboot,重新启动只是uboot的另一端(2. **uboot入口是开机自动启动,uboot的唯一出口是启动内核) uboot还可以执行许多其他任务,例如写系统,但在执行其他任务后,可以返回uboot命令行并继续运行uboot命令。 启动内核命令被执行后,2、uboot的动作模式* U-Boot的动作模式有启动加载模式和下载模式。 *
1、启动加载模式
引导模式是引导加载器的正常操作模式,当嵌入式产品发布时,引导加载器必须在此模式下操作,引导加载器将“嵌入式操作系统”[文件://h ]从FLASH移动到sddr2、下载模式
下载模式是指引导加载器通过某种通信方式将内核映像、根文件系统映像等从PC下载到目标板上的FLASH。 用户可以通过Bootloader提供的几个命令界面执行自己想要的操作。 开发人员可以使用各种命令,通过串行连接或网络连接等通信手段从主机(主机)下载文件(例如内核映像、文件系统映像),并将它们直接放入存储器中执行,或者FFI
在板和主机之间传输文件时,可以使用串行端口的xmodem/ymodem/zmodem协议,使用网络通过tftp、nfs协议传输,以及USB下载等方法。
通常,嵌入式开发者会在下载模式下开发嵌入式系统。 通常,用交叉电缆连接PC和目标开发板,从TFTP服务器下载内核,然后在NFS服务器上装载文件系统。
三. uboot的常用命令1**,获取命令**
命令: help或?
功能:显示当前U-boot版本支持的所有命令。2、环境变量命令
环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份
bootdelay执行自动启动(bootcmd命令)的等待时间baudrate串行控制台波特率netmask以太网网络掩码ethaddr以太网MAC地址bootfile缺省下载传递给参数bootcmd并在自动启动时运行命令serveripTFTP服务器的IP地址ipaddr本地IP地址stdin标准输入设备是普通串行端口stdout标准输出、普通串行端口和LCD(VGA ) 液晶屏(VGA )-http://www.Sina.com/print 3338 ww.Sina.com/print
– 使用*
(1)创建新的环境变量,使用set var value
)2)更改一个环境变量,使用set var value
)3)删除一个环境变量,使用set var
)4) save将变更后的环境变量保存在固态存储器中。*命令可以打印出当前开发板的环境变量。
uboot开机后会自动倒计时,在倒计时结束前如果没有外部按键打断自动计时,uboot将自动执行bootcmd变量保存的命令。
意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。
(1)可以将bootcmd设置为:set bootcmd print
然后save保存;重启则会看到启动倒数后自动执行print命令打印出环境变量
(2) 再还原为内核启动命令:
set bootcmd ‘movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000’
( 中间有分号记得必须得加” )
uboot给kernel传参:bootargs(内核移植中必定使用)
(1)linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。
(2)我们在uboot的环境变量中设置bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。
意义解释:
console=ttySAC2,115200 控制台使用串口2,波特率115200.
root=/dev/mmcblk0p2 rw 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的
init=/linuxrc linux的进程1(init进程)的路径
rootfstype=ext3 根文件系统的类型是ext3
3、网络命令
. uboot可以通过网络来传输文件到开发板,直接用交叉网线连接开发板和电脑,也可以用普通直连网线连接路由器。
ping ip
网络命令搭建开发板uboot和虚拟机ubuntu互相ping通记录在另一博课笔记中
如果网络连通,就可以通过tftp、NFS挂载开发板
4.tftp下载指令:tftp
作用:使uboot为了部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中去。
将要下载的镜像文件放在服务器的下载目录中,然后开发板中使用uboot的tftp命令去下载即可。
我的虚拟机搭建的时候设置的tftp下载目录是/tftpboot,将要被下载的镜像复制到这个目录下。
具体参考另一博客tftp服务器的安装搭建及使用(保证已经可以ping通)
5.nfs启动内核命令:nfs
作用: nfs服务,通过它”挂载”制作好的根文件系统。
主机开启nfs服务后,就可以像tftp一样传文件到开发板了,而且nfs还可以挂载根文件系统,这就是nfs的主要作用
具体参考另一博客* nfs服务器的安装及使用*
6.SD卡/iNand操作指令movi
movi的指令都是movi read和movi write一组的,
movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存
movi指令是一个命令集,有很多子命令,具体用法可以help ,这里说明怎么看
例:movi read {u-boot | kernel} {addr}
这个命令使用了一种通用型的描述方法来描述:movi 和 read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]表示可选参数(可以有也可以没有)
譬如命令 movi read u-boot 0x30000000表示如下:
意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。
(uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名,uboot程序操作中可以使用直接地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000,意思是一样的( uboot的命令行中所有数字都被默认当作十六进制处理 ,不管你加不加0x都一样)。
7.NandFlash操作指令nand
8.内存操作指令:mm、mw、md
* nm * 修改内存值 * ( *指定地址* ) *
格式: nm [.b, .w, .l] address
* mm 修改内存值(地址自动加一)*
格式: mm [.b, .w, .l] address
* md 显示内存值*
格式: md [.b, .w, .l] address [# of objects]
mw 用指定的数据填充内存
格式: mw [.b, .w, .l] address value [count]
* cp 内存的拷贝(包括内存与Nor Flash间的数据拷贝)*
格式:cp [.b, .w, .l] source target count
9.启动内核指令:bootm、go
uboot命令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。
差别: bootm启动内核同时给内核传参,而go命令启动内核不传参。 bootm其实才是正宗的启动内核的命令,一般情况下都用这个 ;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已
四.uboot中对Flash和DDR的管理
uboot在Flash中的分区
Flash分区如下:功能:自由分区待用空间(一般做根文件系统使用)rootfs根文件系统文件kernel内核文件var环境变量ubootbootlater(必须在最前面)
(1)各分区彼此相连,前面一个分区的结尾就是后一个分区的开头。
(2)整个flash充分利用,从开头到结尾。
(3)uboot必须在Flash开头,其他分区相对位置是可变的。
(4)各分区的大小由系统移植工程师自己来定,一般定为合适大小(不能太小,太小了容易溢出;不能太大,太大了浪费空间)
(5)分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。将来在系统部署时和系统代码中的分区方法也必须一样。
uboot阶段DDR的分区 参考: http://blog.csdn.net/qq_25827755/article/details/53671992
因为Flash是掉电不丢失的,因此,在对Flash进行分区的时候要考虑到以后的使用条件。而DDR是掉电丢失的,因此,在系统的每个阶段都可以对它进行重新分区,例如在uboot阶段它有自己的分区管理,而在kernel启动起来之后,整个内存又将被kernel给接替过来,kernel将会对内存进行重新的分区和管理。
综上:DDR要根据具体使用情况对其进行分区管理,注意内存不要重叠。