Uboot预备知识
什么是uboot?
uboot是SourceForge上的开源项目,是德国人最早发起的,最后由整个网络上所有感兴趣的人共同维护发展而来的一个bootloader。Uboot全称universal bootloader(通用的启动代码)遵循GPL条款的开放源码项目。 可移植性强,支持多种处理器系列。
为什么要有uboot?
计算机运行时需要的三大部件;CPU + 外部存储器(flash/硬盘) +内部存储器(DDR SDRAM/SRAM)。以PC机的启动为例:PC机上电后先执行BIOS程序,BIOS程序负者初始化DDR内存、初始化硬盘,然后将硬盘上的OS镜像读到DDR中,然后跳转到DDR去执行OS直到启动(OS启动后BIOS就无用了)。--->何为BIOS程序?BIOS程序部署在PC机的主板上,出厂时已经预定了,因为操作系统部署在硬盘上,而内存(Norflash)掉电丢失,CPU掉电时不工作,所以需要uboot来作为系统引导,部署程序。
uboot 必须解决那些问题呢?
Ubootd的终极目标就是启动内核,为了能达到这个目标,前期必须能解决以下问题。
1.自身可开机自启动。一般的SOC都支持多种启动方式,如SD卡启动,NorFlash启动、 NandFlash启动等。关于何种启动,要根据SOC来定。在start.s中处理了如何开机。
2.能够引导操作系统内核启动并给内核传参。
Linux内核在设计的时候,设计为可以被传参,也就说可以在uboot中事先给Linux 内核准备一些启动参数,并且存放在内存中的特定位置并传给内核,内核启动后会到 这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,用来指导 linux内核的启动过程。
3.能提供系统部署功能
uboot必须能够被人借助而完成整个系统在flash上的烧录下载工作。(包括uboot、 kernel、rootfs等镜像)。
4.能进行SOC级和板级硬件管理
Uboot中实现了一部分硬件的控制能力(uboot中初始化一部分硬件),因为uboot为了
完成一些任务必须让这些硬件工作。如驱动inand、驱动LCD、驱动网卡等。
uboot 的工作方式有哪些?
1. 是一个裸机程序。uboot本质就是一个裸机程序。Uboot一般大于16kb,在180k-400k
之间。运行时被加载到内存中然后被CPU执行。
2. 命令式的shell界面。有些程序需要和人进行相互交互,此时就要求uboot有shell
界面。Shell不是操作系统,和操作系统没有什么关系,uboot中的shell几乎和linux
终端shell一样,区别在于命令集不一样,linux中可以ls,uboot中ls就不识别。
3. 命令和环境变量。uboot大部分工作时间在shell界面下完成的,利用自身识别的各
种命令进行操作。Uboot的环境变量和操作系统的环境变量的工作原理和方式类似。
Uboot的设计借助操作系统的理念(命令工作方式借鉴linux终端的命令行,环境变
量借鉴操作系统的环境变量,驱动管理参照linux的驱动框架)。
环境变量可以认为是系统的全局变量,环境变量名有些是系统内置的,有些是用户自
己添加的。环境变量就是系统运行时的配置属性。
uboot 的常用命令有哪些?
1. Uboot的命令行类似于linux终端的命令行,具有行缓冲。行缓冲:当我们向终端输
入命令时,此时命令没有立即被识别,而是被缓冲到一个缓冲区,当我们按下回车键
后系统就认定我们输入完了,然后将缓冲区中所有刚才输入的命令做分析。Linux终
端有3种缓冲机制:无缓冲、行缓冲、全缓冲。
2. 有些命令有简化的别名
如printenv命令可以简化为print,如setenv可以简化为set。
3. 有些命令会带参数。
4. uboot的有些命令带的参数非常长,为了告诉uboot这个非常长而且中间有好多个空
格的东西是给他的一整个参数,所以用单引号将这个很长且中间有空格隔开的参数引
起来。
5.有些命令是一个命令族。
命令族意思就是好多个命令开头都是用同一个命令关键字的,但是后面的参数不一样
printenv/print命令:
print命令不用带参数,作用是打印出系统中所有的环境变量。
设置(添加/更改)环境变量:setenv/set
用法:set name value
保存环境变量的更改:saveenv/save
网络测试指令:ping
tftp下载指令:tftp
nfs启动内核命令:nfs
SD卡/iNand操作指令movi
内存操作指令:mm、mw、md
启动内核指令:bootm、go
uboo 的常用环境变量有哪些?
自动运行倒数时间:bootdelay
网络设置:ipaddr serverip
自动运行命令设置:bootcmd
uboot给kernel传参:bootargs
(1)新建一个环境变量,使用set var value
(2)更改一个环境变量,使用set var value
(3)删除一个环境变量,使用set var