1、uboot学习前传

来源:互联网 发布:sql在哪里打开 编辑:程序博客网 时间:2024/06/09 16:56

1、为什么是uboot

1.1 计算机系统的核心部件主要有:CPU、外部存储器(flash/硬盘)、内部存储器(DDR/SRAM..)


1.2 Linux系统的启动过程 :嵌入式设备上电首先根据启动方式来运行uboot例如s5pv210常用的启动有:USB启动、iNAND启动、SD卡启动等,上soc上电后首先根据OMpin所选择的启动方式来将选择的启动存储设备中的uboot部分搬移到内部的iRAM中(其中详细包括BL0、BL1、BL2..),然后运行,uboot运行之后要进行初始化外部的DDR、falsh等外设,然后uboot将整个uboot文件重定位到DDR中,然后开始运行uboot,uboot的最终目的是将OS的镜像文件搬移到DDR中,然后跳转到OS ,OS开始启动,uboot的生命周期到此结束。


1.3 android启动过程:

(1)首先我们可以认为操作系统启动分为两个部分:①uboot到OS的启动。②OS启动后到rootfs加载到命令执行。

(2)android系统启动的第一部分基本上和linux启动过程是一样的,只有在内核启动后加载根文件的时候会有些不同。我们现在主要研究第一阶段。


1.4总结 uboot到底是用来做什么的?

(1)uboot是用来启动操作系统内核的。

(2)uboot负责部署整个计算机系统,例如刷系统时将操作系统的镜像文件放在什么地方。

(3)操作flash等板上的硬件驱动,例如在刷机时肯定要将通过某种渠道读过来的系统镜像存储到flash设备上。

(4)uboot还提供一个命令行界面来供人们操作。


2、uboot必须解决哪些问题

2.1 自身开机启动需要条件

(1)一般soc都支持SD卡启动、norflash启动、nandflash启动等等,uboot如果想要能够启动必须根据不同的soc的启动设计来设计uboot。

(2)uboot必须要经过硬件相关的代码级别的修改才能正常启动,其中uboot的第一阶段start.S文件将处理这部分。


2.2 能够引导操作系统内核启动,并传递给参数给操作系统

(1)uboot的终极目标就是为了启动操作系统

(2)linux在设计的时候就是允许传递参数给内核,也就是说uboot可以将一些参数放在内存中的某个位置,内核启动之后会取这些参数,然后根据这些参数来指定linux的启动过程。


2.3 能提供系统部署功能

(1)uboot必须能够被人借助来完成整个系统在flash上的下载工作(包括uboot、kernel、rootfs等镜像),其中我们可以应用uboot为我们所提供的shell界面来操作。

(2)例如我们在裸机刷机过程的时候,就是利用uboot的fastuboot功能将各种镜像烧录到iNAND中,然后从iNAND启动整个操作系统的。


2.4 uboot能够进行soc级和板级硬件管理操作

(1)uboot为了完成一些任务必须初始化并驱动一些硬件外设,例如在烧录系统镜像是需要驱动iNAND;在刷机的时候LCD会显示进度,所以会驱动LCD;uboot可以通过串口提供shell用户界面,所以要初始化串口;uboot要上网,所以必须驱动网卡。

(2)其中这些硬件有soc级和板级,其中串口、LCD驱动器等这些属于soc级别的;网卡等这些不在soc内部,所以为板级。



3、uboot的工作方式

3.1 uboot命令式的shell界面

(1)普通逻辑程序运行起来就直接执行了,执行时的效果 代码有关。

(2)有些程序需要和人进行信息交互,于是乎程序就实现了一个shell(shell就是提供一个人机交互的界面,和我们再ARM裸机中十六部分自己写的shell本质上是一样的),uboot就实现了一个shell。

注意:shell并不是操作系统,和操作系统有本质的区别,linux打开终端后就得到了一个shell,可以输入命令,然后按回车后执行。uboot的shell和linux的基本上是一样的,只是命令集不一样。


3.2掌握uboot使用的2个关键点:命令和环境变量

(1)uboot启动后大部分工作都是在shell下完成的,例如uboot要部署系统要在shell下输入命令,设置环境变量的时候也要在shell下,启动内核也要在命令行底下敲命令。

(2)uboot有几十个系统自带的命令,其中有一些是常用的另一些是不常用的。

(3)uboot的环境变量和操作系统的环境变量工作原理几乎完全一样的,uboot在设计时借助了操作系统的设计理念,命令行借鉴了linux终端命令行,环境变量借鉴了操作系统的环境变量,uboot的驱动管理基本上完全照搬照抄了linux的驱动框架。

(4)环境变量可以被认为是系统的全局变量,环境变量名都是系统内置的(认识就认识,不认识就不认识,这部分是系统自带的默认的环境变量,譬如PATH;但是也有一部分环境变量是自己添加的,自己添加的系统就不认识但是我们自己认识)。系统或者我们自己的程序在运行时可以通过读取环境变量来指导程序的运行。这样设计的好处就是灵活,譬如我们要让一个程序更改运行方法,不用去重新修改程序代码再重新编译运行,而只要修改相应的环境变量就可以了。

(5)环境变量就是运行时的配置属性。

4、uboot的常用命令

4.1 类似于linux终端的行缓冲命令

(1)行缓冲的意思是什么:当我们向终端输入命令的时候终端没有立刻识别我们的命令,而是被缓冲到一个缓冲区(也就是系统认为我们还没有输入完),当我们按下回车按键的时候系统就认为我们输入完成了,然后将刚才缓冲区内所有输入作为命令去解析。

(2)linux中断有三种缓冲机制:无缓冲,行缓冲,全缓冲。


4.2 有些命令名可以简化

譬如printenv可以简化成print,setenv可以简化成set。


4.3 有些命令可能会带参数

(1)uboot的每个命令都有事先规定好的各种格式。有些命令就是不带参数的,譬如printenv/print命令;有些命令带可选的参数(可以带也可以不带,当然带不带参数的执行结果是不同的);有些命令带必须的参数(譬如setenv/set命令)


4.4 命令中的特殊符号(譬如单引号)

(1)uboot的有些命令带的参数非常长,为了告诉uboot这个非常长而且中间有好多个空格的东西是给他的一整个参数,所以用单引号将这个很长且中间有空格隔开的参数引起来。

(2)别的符号也许也有,而且有特定的意义。当碰到uboot的命令行有特殊符号时要注意不是弄错了,而是可能有特别的含义。


4.5 有些命令是一个命令族(例如movi)

(1)命令族意思就是好多个命令开头都是用同一个命令关键字的,但是后面的参数不一样,这些命令的功能和作用也不同。这就叫一个命令族。

(2)同一个命令族中所有的命令都有极大的关联,譬如movi开头的命令族都和moviNand(EMMC、iNand)操作有关。


4.6 命令printenv/print

(1)print命令不用带参数,作用是打印出系统中所有的环境变量。

(2)环境变量就好像程序的全局变量一样。程序中任何地方都可以根据需要去调用或者更改环境变量(一般都是调用),环境变量和全局变量不同之处在于:全局变量的生命周期是在程序的一次运行当中,开始运行时诞生程序结束时死亡,下次运行程序时从头开始;但是环境变量被存储在Flash的另一块专门区域(Flash上有一个环境变量分区),一旦我们在程序中保存了该环境变量,那么下次开机时该环境变量的值将维持上一次更改保存后的值。


4.7 设置(添加/更改)环境变量:setenv/set

(1)用法:set name value


4.8 保存环境变量的更改:saveenv/save

(1)saveenv/save命令不带参数,直接执行,作用是将内存中的环境变量的值同步保存到Flash中环境变量的分区。注意:环境变量的保存是整体的覆盖保存,也就是说内存中所有的环境变量都会整体的将Flash中环境变量分区中原来的内容整体覆盖。

总结:

(1)彻底更改一个环境变量的值,需要2步:第一步set命令来更改内存中的环境变量,第二步用save命令将其同步到Flash中环境变量的分区。
(2)有时候我们只是想测试下这个环境变量,不希望影响到下一次开机,那就只set不save,这样set后当前本次运行的uboot已经起效果了,只不过没save下一次开机还是会恢复到原来的状况。


4.9 网络测试指令 ping

(1)命令用法: ping ip地址

注意:ping是测试开发板和主机之间的网络链接,注意以下步骤:
1)首先要插上网线。
2)先试图ping通主机windows。注意Windows中有线网卡的地址设置(设置本地连接)。设置主机windows的本地连接IPv4地址为192.168.1.10
3)第三步确认开发板中uboot里几个网络相关的环境变量的值对不对。最重要的是ipaddr(这个环境变量表示当前开发板的IP地址),这个地址必须和主机windows的IP地址在同一个网段。


网段的概念:一个IP地址分为2部分,一部分是网段地址,另一部分是网段内的主机地址(由子网掩码来区分哪一部分是网段地址,哪一部分是IP地址)。在子网掩码是255.255.255.0的情况下,192.168.1.10这个IP地址的前三部分(192.168.1.)属于网段地址,第4部分(10)属于主机地址。


4.10 开发板运行linux下和虚拟机ubuntu的ping通

(1)



0 0
原创粉丝点击