一、uboot的工作方式
1.uboot的本质
uboot的本质是一个裸机程序,由若干的.c文件和.h文件组成,配置编译后生成uboot.bin,把这个镜像文件烧录至启动介质中给soc启动。一般的uboot大小在180k-400k之间,我你自己写的裸机程序小于16k。
2.uboot的命令行shell界面
程序需要人机交互,所以uboot程序实现了一个shell。
类似linux的行缓冲命令行:当我们向终端输入命令时,这些命令没有立刻被系统,而是被缓冲到一个缓冲区,等待回车键(换行)按下后系统认为命令输入完,再将缓冲区的命令拿去解析执行。
linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲
3.uboot的环境变量
1)uboot启动后大部分工作都在shell下完成(输入命令,设置环境变量、启动内核)
2)uboot的环境变量和操作系统的环境变量工作原理和方式几乎完全相同。uboot的设计借助了操作系统的设计理念。
(命令行的工作方式借鉴了linux终端命令行、环境变量借鉴了操作系统的环境变量,uboot的驱动管理借鉴了linux的驱动框架)
3)环境变量:可以看做是系统的全局变量,环境变量就是运行时的配置属性。
二、uboot的常用命令
1)
help
列出当前uboot支持的命令
help 命令
查看指定命令的帮助
2)
printenv
打印所有环境变量的值
printenv 环境变量名
查看指定的环境变量值
(printenv命令可以简化为print)
3)
setenv name value
设置/修改 环境变量name 的值为 value
setenv name
删除环境变量为name的环境变量
(setenv 命令可以简化为 set)
使用set命令后需要保存,将ddr内存的环境变量保存至flash中
4)
saveenv/save
直接执行,将内存中的环境变量同步到Flash中环境变量的分区。
环境变量的保存是整体覆盖保存,内存中的所有环境变量都会整体保存覆盖Flash中原来的内容。
5)
ping ip地址
ping是测试开发板和主机之间的网络链接
6)
tftp address filename
把文件filename下载到地址address
tftp 0x30000000 zImage-qt
将服务器上名为zImage-qt的文件下载到开发板内存的0x30000000地址
7)
md[.b,.w,.l] address [count]
表示以[.b,.w,.l]为单位显示从地址address开始的内存数据,显示的数据个数为count
md.b 82000000 10
显示从地址0x82000000地址开始的0x10个字节的数据
8)
mw[.b,.w,.l] address value [count]
表示以[.b,.w,.l]为单位往开始地址为address的内存填充count 个值为 value 的数据
mw.b 82000000 ff 100000
从地址0x82000000地址开始填充0x100000(1M字节)个值为0xff的数据
9)
mm[.b,.w,.l] address
表示以[.b,.w,.l]为单位从地址address开始修改内存数据,执行mm命令后,输入新数据后回车,地址会自动增加
10)
go 地址
执行指定内存地址上的指令
go 0x40008000
11)bootm
启动内核
uboot的终极目标就是启动内核。
12)
reset
//重启uboot
三、uboot中的常用环境变量
1.环境变量如何参与程序运行
1)环境变量有两份,一份在FLASH中、一份在DDR中。uboot开机时一次性从FLASH中读取全部环境变量到DDR中作为环境遍历的初始化值,然后在过程中都使用DDR中的这一份,用户可以用saveenv指令将DDR中的环境变量重新写到FLASH中更新Flash中的环境变量。
2)环境变量在uboot中是使用字符串表示的,uboot是按照字符匹配的方式区分各个环境变量的。
2.bootdelay
自动运行倒数时间。
3.网络设置:ipaddr serverip
(1)ipaddr是开发板的本地IP地址
(2)serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
(3)gatewayip是开发板的本地网关地址
(4)netmask是子网掩码
(5)ethaddr是开发板的本地网卡的MAC地址。
4.自动运行命令设置:bootcmd
(1)uboot启动后会开机自动倒数bootdelay秒,如果没有人按下回车打断启动,则uboot会自动执行启动命令来启动内核。
(2)uboot开机自动启动时实际就是在内部执行了bootcmd这个环境变量的值所对应的命令集。
3)bootcmd=movi read kernel 30008000; bootm 30008000
意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。
5.uboot给kernel传参:bootargs
(1)linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。这样的设计是为了灵活,为了内核在不重新编译的情况下可以用不同的方式启动。
(2)bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
意义解释:
console=ttySAC2,115200
控制台使用串口2,波特率115200.
root=/dev/mmcblk0p2 rw
根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的
init=/linuxrc
linux的进程1(init进程)的路径
rootfstype=ext3
根文件系统的类型是ext3