uboot的介绍

来源:互联网 发布:部落冲突矿工数据 编辑:程序博客网 时间:2024/06/05 11:47

1.uboot的发展历程

1.1.uboot从哪里来的 
(1)uboot是SourceForge上的开源项目。 
(2)uboot项目最早是由一个德国人发起的。 
(3)uboot就是由一个人发起,然后由整个网络上所有感兴趣的人所有感兴趣的人共同维护发展而来的一个bootloader。

1.2.uboot的发展
(1)自己使用的小开源项目。 
(2)被更多人认可使用。 
(3)被SoC厂商默认支持。 
(4)uboot经过多年发展,已经成为事实上的业内bootloader标准,现在大部分嵌入式设备都会默认使用uboot来做为bootloader。

1.3.uboot的版本号问题 
(1)早期uboot版本格式:u-boot-1.3.4,后来uboot版本格式:u-boot-2010.06。 
(2)uboot的核心部分几乎没什么变化,越新的版本支持的开发板会越多,对于老版本芯片来说,新旧版本的uboot并没有差异。例如对于s5pv210这款2012年较火的芯片来说,使用老一点的uboot版本会比较好,相对于新版本的uboot而言会少了很多的冗余的代码。 
(3)关于uboot源码的获取直接百度“uboot下载”,可找到uboot官网地址(查找uboot相关信息用)和uboot的FTP地址(下载uboot源码用)。

1.4.uboot的可移植性的正确理解 
(1)uboot就是universal bootloader(通用的启动代码),通用的意思就是在各种地方都可以使用,所以说uboot具有可移植性。 
(2)uboot具有可移植性是指uboot具有源代码级别的移植能力,程序员需要针对多个开发板的具体情况分别进行uboot源代码的修改移植,然后uboot可以在多个开发板上运行了,并非直接下载uboot程序到开发板直接运行。

1.5.总结 
(1)uboot的出现是一种必然,如果没有uboot也会有另外的bootloader来替代。 
(2)当时的年代正处于嵌入式设备井喷的年代,急需具有可移植性的bootloader出现,uboot恰好赶上了大势。 
(3)总的来说uboot中的源码还是写得不错的,但是也有很多地方的代码写得比较烂,注意不要将uboot神圣化了。

2.uboot的工作方式

2.1从裸机程序镜像uboot.bin说起 
(1)uboot的本质是一个裸机程序,和我们自己写裸机程序没有本质区别。我们写的大部分裸机程序小于16KB,而uboot的大小一般在180KB~400KB之间不等。 
(2)uboot是一个开源项目,由若干.c文件和.h文件组成,配置编译后会生成uboot.bin文件,即uboot的镜像文件,然后该镜像文件被合理的烧录到启动介质中提供给SoC去启动。也就是说uboot在没有运行时表现为uboot.bin,一般躺在启动介质中。 
(3)uboot运行时会被加载到内存中,然后一条指令一条指令的交给CPU去执行。


2.2uboot的命令式shell界面 
(1)普通的裸机程序运行就直接执行了,执行效果和代码有关。 
(2)uboot需要和人进行交互,于是uboot中实现了一个shell(shell就是提供人机交互的一个界面)。 
(3)shell并不是操作系统,和操作系统一点关系都没有。linux中终端shell工作方式和uboot中的shell几乎一样,只是两者之间的shell命令集不同(譬如linux中可识别ls,uboot中ls不能识别)。


2.3掌握uboot使用的2个关键点即命令和环境变量 
(1)uboot启动后大部分工作是在shell下完成的。譬如uboot部署系统要再shell下输命令;设置环境变量需要在shell命令行下;启动内核需要在shell下输入命令。 
(2)命令就是uboot的shell中可以识别的各种命令。uboot中有几十个命令,我们还可以自己给uboot添加命令,我们主要学习常用命令即可。 
(3)uboot的环境变量和操作系统的环境变量的工作原理和方式几乎完全相同。uboot在设计时借鉴了linux操作系统的设计理念(譬如uboot命令行工作方式借鉴了linux终端命令行;uboot环境变量借鉴了linux的环境变量;uboot的驱动管理几乎完全照抄了linux的驱动框架)。 
(4)环境变量可被认为是系统或程序的全局变量(分为系统自带的默认环境变量和我们自己添加的环境变量),系统或程序运行时可通过读取环境变量来指导程序的运行。这样设计的好处是灵活,譬如我们需要让一个程序更改运行方法,不用去重新修改程序代码并编译运行,而只需修改相应的环境变量即可。 
(5)环境变量系统或程序运行时的配置属性。


2.4.结合ARM裸机部分进行理解和印证 
(1)及时复习ARM裸机中和现在讲到的相关的知识点,在复习中巩固ARM裸机中学到的。这过程中如果原来学习时记了笔记就会非常好,如果没有记笔记那就难办了。 
(2)及时对照原来ARM裸机中讲到的相关部分,可以帮助理解当前讲到的知识点。 
(3)结合ARM裸机中和现在讲的,对比分析思考,会得到更多。

3.uboot的常用命令

3.1.类似linux终端的行缓冲命令行 
(1)行缓冲就是指当我们向终端输入命令时,该命令会被放置于缓冲区(系统此时不会识别分析并处理该命令),直至用户输入完命令并按下回车键(换行)后,系统才会识别分析缓冲区中的命令并进行处理。 
(2)linux终端设计有3种缓冲机制:无缓冲(用户输入1个字母,系统就识别分析处理1个字母,适用于命令集为单个字母的shell)、行缓冲(用户输入1行并按下回车键后,系统才识别分析处理命令)、全缓冲(等到整个缓冲区满了系统才会识别分析处理命令)。


3.2.有些命令有简化的别名 
(1)譬如printenv命令可以简化为pri;譬如setenv可以简化为set;譬如help可简化为?。


3.3.有些命令会带参数 
(1)uboot中的每个命令都有事先规定好的各种格式。有些命令不带参数(譬如printenv/print);有些命令带可选参数(即可带可不带,譬如help/?);有些命令必须带参数(譬如setenv/set)。


3.4.命令中的特殊符号 
(1)uboot中有些命令带的参数非常长并且中间有空格、分号,为了告诉uboot这一串整体是给它的一整个参数,需使用单引号将这串整体括起来进行标识。 
(2)分号的作用类似于C语言中的分号,用于分隔uboot中一整个参数中的单独的每个小参数命令。 
(3)还有别的一些特殊符号如冒号、逗号等,当在uboot命令中碰到这些特殊符号需特别注意其代表的特殊含义。


3.5.有些命令是一个命令族 
(1)命令族就是很多命令的开头都是使用同一个命令关键字的,但是后面的参数不同,并且这些命令的功能和作用也不同,譬如movi。 
(2)同一命令族中所有的命令都有极大的关联,譬如movi开头的命令族都和moviNand(EMMC、iNand,moviNand是三星开发出的一款闪存芯片)芯片操作有关。 
(3)查看命令族下的所有命令可使用help命令查询,譬如help movi或? movi。


3.6.打印环境变量命令:printenv/pri 
(1)printenv/pri命令不带参数,作用是打印系统中所有的环境变量。 
(2)环境变量的作用域类似程序中的全局变量,在程序中的任何地方都可以调用或者更改环境变量(一般是调用);环境变量生命周期是一旦我们在程序中保存了该环境变量,则下次开机时环境变量的值将维持上一次更改保存的值,这是因为环境变量被存储在了Flash中专门的环境变量分区中。 
(3)附SecureCRT软件桌面背景的设置方法(见图A)。


3.7.设置环境变量:setenv/set 
(1)用法:set name value。作用是设置环境变量,譬如设置倒计时时间:set bootdelay 10。 
(2)Flash中的分区依次为uboot分区、环境变量分区、OS分区、rootfs分区;uboot运行时中内存的分区依次为uboot分区、环境变量分区(该环境变量分区是从Flash中映射过来的,注意仅映射1次),所以当在uboot中更改环境变量后,若没有将更改结果写入到Flash中的环境变量分区中,则下次开机启动后环境变量更改无效。


3.8.保存环境变量的更改:saveenv/save 
(1)saveenv/save命令不带参数,直接执行即可,作用是将内存中环境变量的值同步保存到Flash中环境变量分区中。 
(2)环境变量保存是整体的覆盖保存,也就是说内存中所有的环境变量内容会整体的覆盖Flash中所有的环境变量内容。 
(3)彻底改变某个环境变量的值需要2步:第1步使用set命令更改内存中环境变量;第2步使用save命令将其同步到Flash中环境变量的分区。实际运用中根据需求选择相应的操作即可。

3.9.网络测试指令:ping 
(1)用法:ping ipaddress。作用是测试开发板与主机直接的网络连接。 
(2)注意需要开发板需要插上网线,如果是测试ping通主机windows,则需设置主机windows电脑本地连接的IP地址和子网掩码。 
(3)确认uboot中的与网络相关的环境变量是否正确,即ethaddr(网卡地址)、netmask(子网掩码)、ipaddr(ip地址)等,最重要的是ipaddr地址,该ipaddr必须与主机windows的IP地址处于同一网段。 
(4)网段的概念:一个IP地址分为2部分,一部分是网段地址,另一部分是网段内的主机地址(由子网掩码来区分哪一部分是网段地址,哪一部分是主机地址)。在子网掩码是255.255.255.0的情况下,192.168.1.10这个IP地址的前三部分(192.168.1.)属于网段地址,第4部分(10)属于主机地址。


3.10.开发板linux下ping主机windows 
(1)进入开发板linux命令行终端下,使用ifconfig eth0 192.169.1.20命令设置linux系统的IP地址(后续固定各系统IP地址如下:主机windows地址192.168.1.10;开发板windows或linux地址192.168.1.20;虚拟机ubuntu地址192.168.1.30)。 
(2)固定设置主机windows电脑本地连接的IP地址为192.168.1.10和子网掩码为192.168.1.1。 
(3)从开发板linux下ping通windos主机成功;从windos命令行(cmd)下ping开发板linux成功。 
(4)测试成功表明开发板和主机的网络部分硬件都是好的;两者中间网络连接即网线也是好的;主机windows中的网络软件设置是好的。


311.开发板linux下ping虚拟机ubuntu 
(1)虚拟机ubuntu下网卡设置有几种方式,常用为NAT(外网只可见widows,ubuntu不可见,即只有1台电脑)和Bridge(外网可见windows和ubuntu,即有两台电脑)。 
(2)虚拟机ubuntu要与开发板通信,必须通过桥接方式,并且必须桥接到有线本地网卡,因为开发板是通过有线本地网卡连接电脑的。 
(3)设置虚拟机ubuntu中网络连接方式为桥接到有线本地网卡,设置虚拟机ubuntu的IP地址为192.168.1.30即可(可通过/etc/network/interfaces文件来设置静态IP然后重启;也可以直接命令行ifconfig去设置)。 
(4)从开发板linux下ping通虚拟机ubuntu成功;从虚拟机ubuntu下ping开发板linux成功。 
(5)测试成功表明开发板和主机的网络部分硬件都是好的;两者中间网络连接即网线也是好的;虚拟机ubuntu中的网络软件设置是好的。


3.12.开发板uboot下ping主机windows和虚拟机ubuntu 
(1)在开发板uboot下设置IP地址为192.168.1.20,设置网关为192.168.1.1。 
(2)经过实测大部分时候开发板uboot可ping通wondows和虚拟机ubuntu,但有少数时候无法ping通,并且windos与虚拟机ubuntu不能相互ping通。 
(3)注意从windos下或虚拟机ubuntu下是无法ping通开发板uboot的,因为uboot为裸机程序,是不会时刻监视网卡的。 
(4)假如开发板运行linux,则其与windows、虚拟机ubuntu三者均可相互ping通,非常畅通。


3.13.tftp下载指令:tftp 
(1)uboot的主要目标是启动内核,为了完成启动内核必须要能够部署内核,部署内核即将内核镜像从主机(windows或ubuntu)中下载过来然后烧录到本地Flash中。目前uboot中主流的下载方式为tftp和fastboot两种。tftp是通过有线网络传输数据,比较典型;fastboot是通过usb线传输数据,是近些年发展起来的。 
(2)tftp方式下载时uboot实际是tftp客户端,主机实际是tftp服务器。我们需在主机下搭建tftp服务器,然后将镜像文件放置于tftp的下载目录中,在开发板下的uboot中通过tftp命令即可下载镜像文件。 
(3)可在windows或linux搭建tftp服务器,在windows下搭建一般使用一些软件如tftpd32(见图1),在linux下搭建可参考《嵌入式开发环境搭建-基于14.04》教程或上网搜索。我的虚拟机搭建tftp服务器设置的下载目录是/home/gec/tftpboot,即可将需要下载的文件放置该目录下。 
(4)在开发板上运行uboot,检查uboot中的serverip(即tftp服务器IP地址,serverip=192.168.1.10)必须与虚拟机中的IP地址一致;从开发板uboot上ping虚拟机主机确保网络畅通(host 192.168.1.30 is alive);将待下载的文件放置下载目录/home/gec/tftpboot 
下;在开发板uboot下运行tftp 0x300000000 xxx即可(将xxx文件下载到开发板内存上的0x30000000处);检查下载好的文件大小(Bytes transferred = 9 (0x9)即9个字节)与虚拟机下的文件大小是否相同判断是否有下载错误(-rw-rw-r– 1 gec gec 9 Dec 29 05:15 hello即9个字节)。


3.14.nfs启动内核命令:nfs 
(1)uboot中也支持nfs命令,但是基本没用过,如果需要使用则可参考《嵌入式开发环境搭建-基于14.04》教程或上网搜索。



0 0