uboot中shell分析_uboot shell - CSDN
精华内容
参与话题
  • ubuntu11.10 安装mkimage工具

    千次阅读 2011-12-28 08:51:00
    在做嵌入式Linux时通常使用uboot做为引导程序,这时就要求我们编译生成uboot形式的Linux内核映像文件uimage 在shell下执行make uImage命令,如果系统未安装mkimage工具,将出现以下错误提示信息: "mkimage" ...

    在做嵌入式Linux时通常使用uboot做为引导程序,这时就要求我们编译生成uboot形式的Linux内核映像文件uimage

    在shell下执行make uImage命令,如果系统中未安装mkimage工具,将出现以下错误提示信息:

    "mkimage" command not found - U-Boot images will not be built


    原因分析:

    系统中未安装mkimage工具。

    解决方法:

    方法一:

    安装mkimage工具,载ubuntu11.10下执行以下命令进行安装:

    #sudo apt-get install uboot-mkimage

    方法二:

    编译uboot源码,编译成功后载uboot/tools目录下会生成mkimgage工具,将mkimage工具拷贝到/usr/bin/目录下即可。



    展开全文
  • uboot基础与常用命令

    千次阅读 2018-02-01 17:17:17
    1. bootloader 与 uboot的区别 BootLoader是嵌入式设备用来启动操作系统内核的一段程序。 uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。 ...

    1. bootloader 与 uboot的区别

    BootLoader是嵌入式设备中用来启动操作系统内核的一段程序。
    uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。
    uboot的核心作用就是启动操作系统内核,uboot的本质就是一段裸机程序。

    2. uboot的特性

    2.1 硬件管理

    uboot要能够进行Soc级(Soc内部外设)和板级(Soc外部外设)硬件管理。

    uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在刷机时LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口。譬如uboot要实现网络功能就必须驱动网卡芯片。

    2.2 能够完成镜像烧录(刷机)

    uboot要能够被借助完成刷机操作。参考下SD卡刷机的步骤:

    1. 烧录uboot到SD卡中。
      有2种烧写方法:一种是在windows中用刷卡工具去制作启动SD卡;另一种是在linux中用dd命令。制作完SD后将SD卡插入开发板,然后开机就可以进入uboot界面。
    2. 使用uboot的fastboot命令,并借助PC中的fastboot软件完成包括uboot、kernel、rootfs等的镜像的烧录。

    从上面就可以看出,刷机依靠的是uboot的fastboot命令,将镜像写到相应的FLASH中。

    2.3 uboot的“生命周期”

    uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。

    2.4 uboot要提供命令式shell界面

    shell是用户操作接口的意思。shell有命令行的shell,如windows下的cmd,如linux下的终端;也有GUI式的shell,比如常用的windows下的各种界面。shell是一种封装后留出来的接口,uboot也要有这样的一个接口。

    shell的原理是:由消息接收、解析、执行构成的一个死循环。我之前用过3D打印机的固件(firmware)也是这样的模式。

    uboot的shell使用的也是行缓冲的模式。也就是以回车键(换行键)作为一个命令输入的结束。对应的其他缓冲模式还有无缓冲和全缓冲:无缓冲就是输入一个字符就当做一个命令处理;全缓冲就是无论输入什么都缓冲起来知道缓冲区满了才做一次处理。

    3. uboot的常用命令

    3.1 环境变量介绍与操作命令

    环境变量:就是整个系统的一个全局变量。其余全局变量不同的就是,全局变量在一次程序结束后下一次要重新开始;而全局变量可以保存在FLASH中,继续使用上次修改的值。

    • printenv(或print)
      打印出环境变量。
    • setenv(或set)
      新建一个环境变量,使用 set var value
      更改一个环境变量,使用set var value
      删除一个环境变量,使用 set var
    • saveenv(或save)
      保存环境变量。保存环境变量这一指令的意义在于用set指令更改了环境变量之后,只是在DDR内存中做了改变,用save即命令将环境变量从DDR中写入FLASH。从这里也可以看出,环境变量在整个系统中是有两套的,FLASH中一套,DDR中一套。

    具体的uboot的各项环境变量的意思在后面详细讲述。

    3.2 网络测试指令:ping命令

    ping是测试开发板和主机之间的网络链接,其使用格式为:ping ip地址


    SouthEast

    如上图所示,ping指令要想成功,三个环节要做好:

    1. 主机IP地址设置正确;
    2. 网线连接正常;
    3. 开发板IP地址设置正确。注意,主机IP和开发板IP应该位于同一网段才可以(如下图,子网掩码相同的IP地址位于同一网段)。设置开发板IP地址的方法就是更改uboot中的环境变量ipaddr。

    这里写图片描述
    值得一提的是当主机使用的是linux虚拟机时,设置其IP地址的方式如下:

    1. 虚拟机设置成桥接方式。虚拟机的网卡设置可以选择好几种方式,常用的就是NAT和桥接(bridged)。虚拟机要和开发板进行网络通信,只能通过桥接方式连接。
    2. 虚拟机的菜单“虚拟网络编辑器”,设置为“桥接到有线网卡”。(默认是自动的,自动的一般会影响ping通。因为电脑一般都有2个网卡:一个有线的,一个无线的。如果选了自动,那么虚拟机会自动桥接到无线网卡上)
    3. 在虚拟机ubuntu中设置IP地址(可以通过/etc/network/interfaces文件来设置静态的然后重启;也可以直接命令行ifconfig去设置)。

    3.3 SD卡/iNand操作指令:movi

    movi指令是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存。

    如movi read的使用方法为:movi read {u-boot | kernel} {addr}

    其中,{u-boot | kernel}代表的是SD卡或iNAND中的一个分区。 {addr}代表DDR中的地址。上面的意思就是把uboot的某一个分区写到DDR的地址addr处。

    这里也插播一个小知识:uboot是把iNAND分区管理的,一般有以下几个分区:

    • uboot分区:uboot必须从Flash起始地址开始存放,一般设计为512KB或者1MB;
    • 环境变量分区:环境变量分区一般紧贴着uboot来存放,大小为32KB或者更多一点。
    • kernel分区:kernel可以紧贴环境变量存放,大小一般为3MB或5MB或其他。
    • rootfs分区:剩下的就是自由分区,一般kernel启动后将自由分区挂载到rootfs下使用

    一般分区规律如下:

    • 各分区彼此相连,前面一个分区的结尾就是后一个分区的开头。
    • 整个flash充分利用,从开头到结尾。
    • uboot必须在Flash开头,其他分区相对位置是可变的。
    • 各分区的大小由系统移植工程师自己来定;
    • 分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。

    3.4 内存操作指令

    内存操作指令主要有三个:md(memory display 显示内存)、mw(memory write 写内存)、mm(memory modify 内存修改)
    使用help查看各个指令的用法:
    md [.b, .w, .l] address [# of objects]
    mw [.b, .w, .l] address value [count]
    mm [.b, .w, .l] address
    其中,可选项[.b .w .l]的意思是使用字节(b,8位,一个内存地址内容)还是字(w,16位,两个内存地址内容),还是长整型(l,32位,4个内存地址内容)来操作内存。[# of objects]、count 代表要操作内存的数目。

    3.5 启动内核指令

    uboot的终极目标就是启动操作系统内核,其指令为bootm addr

    4 uboot环境变量详解

    使用print命令打印出uboot环境变量如下所示:

    bootcmd=movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000
    mtdpart=80000 400000 3000000
    baudrate=115200
    ethaddr=00:40:5c:26:0a:5b
    ipaddr=192.168.1.88
    serverip=192.168.1.102
    gatewayip=192.168.0.1
    netmask=255.255.0.0
    bootdelay=3

    4.1 bootdelay 与 bootcmd

    在uboot开启之后,会有一个倒计时的操作,如果检测到按键输入就进入到uboot命令行下执行各种命令,否则将执行 bootcmd 这个环境变量中保存的命令集,而这个倒计时的秒数就是由环境变量 bootdelay 表示的。

    分析一下bootcmd环境变量的内容,首先将内核和根文件系统读进内存中,然后使用bootm启动内核。在自己修改这个环境变量的时候,命令如下:
    set bootcmd 'movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000'
    注意两点,一是需要用单引号把值给引起来,表示是一个整体;二是单引号之间的命令间要有空格隔开!

    4.2 网络相关

    • ipaddr是开发板的本地IP地址
    • serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
    • gatewayip是开发板的本地网关地址
    • netmask是子网掩码
    • ethaddr是开发板的本地网卡的MAC地址。

    4.3 内核传参

    linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。这样的设计是为了灵活,为了内核在不重新编译的情况下可以用不同的方式启动。
    我们要做的事情就是:在uboot的环境变量中设置bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。

    在我的环境变量中没有看到bootargs这个环境变量,但是mtdpart、baudrate都是bootargs的一部分。

    展开全文
  • 本期课程为uboot学习的前导课程,主要内容是shell和Makefile的基本语法和主要技巧。这些都是uboot中要用到的项目管理和配置技术,事先学好这些基础可以帮助我们更好的分析uboot工程的结构和工作原理。
  • uboot移植之前的工作

    千次阅读 2016-04-23 18:33:08
    1.1计算机系统的主要部件:计算机系统是有cpu来做核心进行运行的系统。典型的计算机系统有:pc机,嵌入式设备(手机、平板电脑、游戏机),单片机(家用电器)。 1.2计算机系统组件部件非常多,不同的计算机系统组成...
    1.1计算机系统的主要部件:计算机系统是有cpu来做核心进行运行的系统。典型的计算机系统有:pc机,嵌入式设备(手机、平板电脑、游戏机),单片机(家用电器)。
    1.2计算机系统组件部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:cpu+外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM)。
    1.3pc机的启动过程:(1)典型的pc部署:BIOS程序部署在pc机主板上(随主板出厂时已经预制了),操作系统部署在硬盘上,内存在掉电时无作用,cpu在掉电时不工作。(2)启动过程:pc上电后先执行BIOS程序(实际上pc的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)。

    1.4典型嵌入式linux系统启动过程:(1)嵌入式系统的部署和启动都是参考PC机的。只是设备上有一些差别。(2)典型嵌入式系统的部署:uboot程序部署在Flash(能作为启动设备的flash)上、OS部署在Flash(嵌入式系统中用Flash代替了硬盘)上、内存在掉电时无作用、CPU掉电不工作。(3)启动过程:嵌入式系统上电后先执行uboot、然后uboot复制初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就成了Flash)。

    总结:嵌入式系统和pc机的启动过程几乎没有两样,只是BIOS成了uboot,硬盘成了Flash。

    1.4android系统启动过程:(1)android系统的启动和linux系统(前面讲的典型的嵌入式系统启动)几乎一样。只是在内核启动后加载根文件系统后就不同了。
    (1)可以认为启动分为2个阶段:第一个阶段是uboot到OS启动;第二个阶段是OS启动后到rootfs加载到命令行执行;现在主要研究第一阶段,android的启动和linux的差别在第二阶段。

    总结:uboot到底干嘛?
    Uboot主要作用是用来启动操作系统内核
    Uboot还要负责部署整个计算机系统
    Uboot中还有操作Flash等板子上硬盘的驱动。
    Uboot还痛一个命令行界面供人来操作。



    为什么是uboot?

    1. uboot从哪里来?
    Uboot是sourceforge上的开源项目。
    http://www.denx.de/wiki
    uboot项目的作者,一个德国人最早发起的项目。
    Uboot就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而来得一个bootloader。
    2. uboot发展历程:
    自己使用的小开源项目;被更多人认可使用;被soc厂商默认支持。Uboot经过多年发展,已经成为事实上的业内bootloader标准。现在大部分的嵌入式设备都会默认使用uboot来做为bootloader。
    3. uboot版本号问题
    早期的uboot的版本号类似于这样:uboot1.3.4。后来版本号便成了类似uboot-2010.6
    Uboot的核心部分几乎没有什么变化,越新的版本支持的开发板越多而应,对于一个老版本的芯片来说,新旧版本的uboot并没有差异。
    4.uboot移植:uboot就是universal bootloader(通用的启动代码),通用的意思就是在各种地方都可以用。所有说uboot具有可移植性。Uboot具有在源代码级别的移植能力,可以针对多个开发板进行移植,移植后就可以在这个开发板上使用了。
    总结:uboot的出现时一种必然,如果没有uboot也会有另一个ubootloader。
    ftp://ftp.denx.de/pub/u-boot/

    uboot必须解决那些问题?
    1. 自身可开机直接启动:一般的soc都支持多种启动方式,sd启动,norflash启动,nandflash启动等。。。uboot要开机启动,必须根据具体的soc的启动设计来设计uboot 。uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。Uboot中第一阶段start.S文件中具体处理了这一块。
    2. 能够引导操作系统内核启动并给内核传参:uboot终极目标就是启动目标。Linux在设计为可以被传参。我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后回到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。
    3. 能够提供系统部署功能:uboot必须能够被人借助而完成整个系统在Flash上烧录下载工作。裸机中刷机就是利用uboot中的fastboot功能将各种镜像烧录到inad中,然后从inad启动。
    4. 能进行soc级和版级硬件管理:uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动INand,譬如uboot要在刷机是LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口。譬如uboot要实现网络功能必须驱动网卡芯片。 SOC级(串口)就是soc内部外设,板级就是soc外面开发板上面的硬件(譬如网卡,inand)。
    5. uboot的生命周期:uboot的生命周期就是指:uboot什么时候开始运行,什么时候结束运行。Uboot本质上是一个裸机程序,一旦uboot开始soc就会淡村运行uboot.(就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot.(所以uboot启动了内核后uboot自身就死了,要想再次开到uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生 。)uboot的入口和出口。入口就是开机自动启动,uboot的唯一出口就是启动内核。Uboot还可以执行很多别的任务,但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。
    6. 总结:一切都是为了启动内核。

    Uboot工作方式:
    1. 从裸机长须镜像uboot.bin说起
    a) Uboot的本质就是一个裸机程序,和我们裸机全集中写的那些裸机程序xx.bin并没有本质区别。如果非要说要有区别,那就是:我们写的大本分小于16kb,而uboot大于16kb(一般uboot在180kb-400kb之间)
    b) Uboot本身是一个开源项目,由若干个.c文件和.h文件组成,配置编译之后会生产一个uboot.bin,这就是uboot这个裸机程序的镜像文件。然后这个镜像文件被合理的烧录到启动介质中拿给soc去启动。也就是说uboot在没有运行时表现为uboot.bin,一般趟在启动介质中。
    c) Uboot运行时会被加载到内存中然后一条指令一条指令的拿给cpu去运行。
    2. uboot命令式shell界面
    a) 普通的裸机程序运行起来就直接执行了。执行时效果和代码有关。
    b) 有些程序需要和人进行互动,于是程序中就实现了一个shell,uboot就实现了一个shell。
    注意:shell不是操作系统,和操作系统一点关系都没有,linux中打开一个终端后就得到了一个shell,可以输入命令回车执行。Uboot中的shell工作方式和linux中终端shell非常像。

    3. 掌握uboot使用的2个关键点:命令和环境变量
    Uboot启动后大部分时间和工作都是在shell下完成的(譬如uboot要不是系统要在shell下输命令,要设置环境变量也得在命令行底下,要启动内核也要在命令行底下敲命令)。
    命令就是uboot中shell中可以识别的各种命令。Uboot中由几十个命令,其中一些常用另一些不常用。Uboot环境变量和操作系统的环境变量工作原理和方式几乎完全相同。Uboot在设计时借助了操作系统的设计理念。(命令行工作方式借鉴了linux终端命令行哦,环境变量借鉴了操作系统的环境变量,uboot的驱动管理几乎完全照抄了linux的驱动框架)。
    环境变量可以被认为是系统的全局变量,环境变量名都是系统内置的(认识就认识,不认识就不认识,这部分是系统自带的默认的环境变量,譬如PATH:但是也有一部分环境变量时自己添加了,自己添加的系统就不认识但我们自己认识)。系统和哦我们自己的程序在运行时可以通过读取环境变量来知道程序的运行。这样设计的好处就是灵活,譬如我们要让一个程序更改运行方法,不用去重新修改程序代码再重新编译运行,而只要修改想要的环境变量就可以了。
    环境变量就是运行时的配置属性。

    结合arm裸机部分进行理解和印证:
    及时复习arm裸机中和现在降到的相关知识点,在复习中巩固arm裸机中学到的。这过程中原来记了笔记非常容易。以及对照原来arm裸机中讲到的相关部分,可以帮助理解当前讲到的知识点。结合arm裸机中和现在讲的,好好总结,思考。
    Uboot常用命令1:类似linux终端的行缓冲命令行
    行缓冲的意思:我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区,当我们按下回车键后系统就认为我们输入完了,然后将缓冲区中所有刚才输入的作为命令拿去分析处理。
    Linux终端设计有3种缓冲机制:无缓冲,行缓冲,全缓冲。

    譬如:printenv 命令可以简化print setenv 简化为set

    Uboot的每个命令都有事先规定好的各种格式。有些命令不带参数,譬如:printenv/print命令:有些命令带可选的参数(可以带,也可以不带,)有些就必须带参数。(setenv命令)。

    命令中的特殊符号:(单引号)uboot的有些命令带的参数非常长,为了告诉uboot这个非常长而且中间有好多个空格的东西是给他的一整个参数,所以用单引号将这个很长且中间有空格隔开的参数引起来。别的符号也许也有,而且有特殊依稀,当碰到uboot的命令行有特殊符号是要注意不是弄错了,而可能又特别的含义。
    命令族:好多个命令开头都是用同一个命令关键字的,但是后面的参数不一样,这些命令的功能和作用也不同。这就叫一个命令族。
    同一个命令族中所有的命令都有极大的管理,譬如movi 开头的命令族都和moviNand(emmc,inand)操作有关。

    movi init - Initialize moviNAND and show card info
    movi read {u-boot | kernel} {addr} - Read data from sd/mmc
    movi write {fwbl1 | u-boot | kernel} {addr} - Write data to sd/mmc
    movi read rootfs {addr} [bytes(hex)] - Read rootfs data from sd/mmc by size
    movi write rootfs {addr} [bytes(hex)] - Write rootfs data to sd/mmc by size
    movi read {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc read"
    movi write {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc write"
    第一个命令:printenv print
    作用是打印出系统中所有的环境变量。
    环境变量就好像程序的全局变量一样。程序中任何地方都可以根据需要去调用或者更改环境变量(一般都是调用),环境变量和全局变量不同之处在于:全局变量的生命周期是在程序的一次运行当中,开始运行时诞生程序结束时死亡,下次运行程序时从头开始;但是环境变量被存储在Flash的另一块专门区域,一旦我们在程序中保存了该环境变量,那么下次开机时该环境变量的值将维持上一次更改保存后的值。

    printenv
    - print values of all environment variables
    printenv name ...
    print value of environment variable 'name'
    setenv name value ...
    - set environment variable 'name' to 'value ...'
    setenv name
    - delete environment variable 'name'

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

    主机地址(由子网掩码来区分那一部分是网段地址,那一部分是ip地址)。在子网掩码是255.255.255.0的情况下,192.168.1.10这个ip地址的前三部分(192.168.1)属于网段地址,第4部分(10)属于主机地址。
    展开全文
  • bootloader 与 uboot的区别

    千次阅读 2019-02-18 11:50:37
    uboot基础与常用命令 2018年01月25日 10:48:38 隋边边 阅读数:676  版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Setul/article/details/79158932 1. bootloader 与 uboot的...

    uboot基础与常用命令

    2018年01月25日 10:48:38  阅读数:676

     版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Setul/article/details/79158932

    1. bootloader 与 uboot的区别

    BootLoader是嵌入式设备中用来启动操作系统内核的一段程序。 
    uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。 
    uboot的核心作用就是启动操作系统内核,uboot的本质就是一段裸机程序。

    2. uboot的特性

    2.1 硬件管理

    uboot要能够进行Soc级(Soc内部外设)和板级(Soc外部外设)硬件管理。

    uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在刷机时LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口。譬如uboot要实现网络功能就必须驱动网卡芯片。

    2.2 能够完成镜像烧录(刷机)

    uboot要能够被借助完成刷机操作。参考下SD卡刷机的步骤:

    1. 烧录uboot到SD卡中。 
      有2种烧写方法:一种是在windows中用刷卡工具去制作启动SD卡;另一种是在linux中用dd命令。制作完SD后将SD卡插入开发板,然后开机就可以进入uboot界面。
    2. 使用uboot的fastboot命令,并借助PC中的fastboot软件完成包括uboot、kernel、rootfs等的镜像的烧录。

    从上面就可以看出,刷机依靠的是uboot的fastboot命令,将镜像写到相应的FLASH中。

    2.3 uboot的“生命周期”

    uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。

    2.4 uboot要提供命令式shell界面

    shell是用户操作接口的意思。shell有命令行的shell,如windows下的cmd,如linux下的终端;也有GUI式的shell,比如常用的windows下的各种界面。shell是一种封装后留出来的接口,uboot也要有这样的一个接口。

    shell的原理是:由消息接收、解析、执行构成的一个死循环。我之前用过3D打印机的固件(firmware)也是这样的模式。

    uboot的shell使用的也是行缓冲的模式。也就是以回车键(换行键)作为一个命令输入的结束。对应的其他缓冲模式还有无缓冲和全缓冲:无缓冲就是输入一个字符就当做一个命令处理;全缓冲就是无论输入什么都缓冲起来知道缓冲区满了才做一次处理。

    3. uboot的常用命令

    3.1 环境变量介绍与操作命令

    环境变量:就是整个系统的一个全局变量。其余全局变量不同的就是,全局变量在一次程序结束后下一次要重新开始;而全局变量可以保存在FLASH中,继续使用上次修改的值。

    • printenv(或print
      打印出环境变量。
    • setenv(或set
      新建一个环境变量,使用 set var value 
      更改一个环境变量,使用set var value 
      删除一个环境变量,使用 set var
    • saveenv(或save
      保存环境变量。保存环境变量这一指令的意义在于用set指令更改了环境变量之后,只是在DDR内存中做了改变,用save即命令将环境变量从DDR中写入FLASH。从这里也可以看出,环境变量在整个系统中是有两套的,FLASH中一套,DDR中一套。

    具体的uboot的各项环境变量的意思在后面详细讲述。

    3.2 网络测试指令:ping命令

    ping是测试开发板和主机之间的网络链接,其使用格式为:ping ip地址 


     


    如上图所示,ping指令要想成功,三个环节要做好:

     

    1. 主机IP地址设置正确;
    2. 网线连接正常;
    3. 开发板IP地址设置正确。注意,主机IP和开发板IP应该位于同一网段才可以(如下图,子网掩码相同的IP地址位于同一网段)。设置开发板IP地址的方法就是更改uboot中的环境变量ipaddr。

    这里写图片描述
    值得一提的是当主机使用的是linux虚拟机时,设置其IP地址的方式如下:

    1. 虚拟机设置成桥接方式。虚拟机的网卡设置可以选择好几种方式,常用的就是NAT和桥接(bridged)。虚拟机要和开发板进行网络通信,只能通过桥接方式连接。
    2. 虚拟机的菜单“虚拟网络编辑器”,设置为“桥接到有线网卡”。(默认是自动的,自动的一般会影响ping通。因为电脑一般都有2个网卡:一个有线的,一个无线的。如果选了自动,那么虚拟机会自动桥接到无线网卡上)
    3. 在虚拟机ubuntu中设置IP地址(可以通过/etc/network/interfaces文件来设置静态的然后重启;也可以直接命令行ifconfig去设置)。

    3.3 SD卡/iNand操作指令:movi

    movi指令是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存。

    如movi read的使用方法为:movi read {u-boot | kernel} {addr}

    其中,{u-boot | kernel}代表的是SD卡或iNAND中的一个分区。 {addr}代表DDR中的地址。上面的意思就是把uboot的某一个分区写到DDR的地址addr处。

    这里也插播一个小知识:uboot是把iNAND分区管理的,一般有以下几个分区:

    • uboot分区:uboot必须从Flash起始地址开始存放,一般设计为512KB或者1MB;
    • 环境变量分区:环境变量分区一般紧贴着uboot来存放,大小为32KB或者更多一点。
    • kernel分区:kernel可以紧贴环境变量存放,大小一般为3MB或5MB或其他。
    • rootfs分区:剩下的就是自由分区,一般kernel启动后将自由分区挂载到rootfs下使用

    一般分区规律如下:

    • 各分区彼此相连,前面一个分区的结尾就是后一个分区的开头。
    • 整个flash充分利用,从开头到结尾。
    • uboot必须在Flash开头,其他分区相对位置是可变的。
    • 各分区的大小由系统移植工程师自己来定;
    • 分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。

    3.4 内存操作指令

    内存操作指令主要有三个:md(memory display 显示内存)、mw(memory write 写内存)、mm(memory modify 内存修改) 
    使用help查看各个指令的用法: 
    md [.b, .w, .l] address [# of objects] 
    mw [.b, .w, .l] address value [count] 
    mm [.b, .w, .l] address 
    其中,可选项[.b .w .l]的意思是使用字节(b,8位,一个内存地址内容)还是字(w,16位,两个内存地址内容),还是长整型(l,32位,4个内存地址内容)来操作内存。[# of objects]、count 代表要操作内存的数目。

    3.5 启动内核指令

    uboot的终极目标就是启动操作系统内核,其指令为bootm addr

    4 uboot环境变量详解

    使用print命令打印出uboot环境变量如下所示:

    <span style="color:#000000"><code>bootcmd=movi read kernel <span style="color:#006666 !important">30008000</span>; movi read rootfs <span style="color:#006666 !important">30</span>B00000 <span style="color:#006666 !important">300000</span>; bootm <span style="color:#006666 !important">30008000</span> <span style="color:#006666 !important">30</span>B00000
    mtdpart=<span style="color:#006666 !important">80000</span> <span style="color:#006666 !important">400000</span> <span style="color:#006666 !important">3000000</span>
    baudrate=<span style="color:#006666 !important">115200</span>
    ethaddr=<span style="color:#006666 !important">00</span>:<span style="color:#006666 !important">40</span>:<span style="color:#006666 !important">5</span>c:<span style="color:#006666 !important">26</span>:<span style="color:#006666 !important">0</span>a:<span style="color:#006666 !important">5</span>b
    ipaddr=<span style="color:#006666 !important">192.168</span>.<span style="color:#006666 !important">1.88</span>
    serverip=<span style="color:#006666 !important">192.168</span>.<span style="color:#006666 !important">1.102</span>
    gatewayip=<span style="color:#006666 !important">192.168</span>.<span style="color:#006666 !important">0.1</span>
    netmask=<span style="color:#006666 !important">255.255</span>.<span style="color:#006666 !important">0.0</span>
    bootdelay=<span style="color:#006666 !important">3</span></code></span>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.1 bootdelay 与 bootcmd

    在uboot开启之后,会有一个倒计时的操作,如果检测到按键输入就进入到uboot命令行下执行各种命令,否则将执行 bootcmd 这个环境变量中保存的命令集,而这个倒计时的秒数就是由环境变量 bootdelay 表示的。

    分析一下bootcmd环境变量的内容,首先将内核和根文件系统读进内存中,然后使用bootm启动内核。在自己修改这个环境变量的时候,命令如下: 
    set bootcmd 'movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000' 
    注意两点,一是需要用单引号把值给引起来,表示是一个整体;二是单引号之间的命令间要有空格隔开!

    4.2 网络相关

    • ipaddr是开发板的本地IP地址
    • serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
    • gatewayip是开发板的本地网关地址
    • netmask是子网掩码
    • ethaddr是开发板的本地网卡的MAC地址。

    4.3 内核传参

    linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。这样的设计是为了灵活,为了内核在不重新编译的情况下可以用不同的方式启动。 
    我们要做的事情就是:在uboot的环境变量中设置bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。

    在我的环境变量中没有看到bootargs这个环境变量,但是mtdpart、baudrate都是bootargs的一部分。

    展开全文
  • IMX8 UBOOT源码分析(一)

    千次阅读 2019-02-21 21:33:59
    分析UBOOT源码之前,首先要做些准备工作。 1. 下载UBOOT源码 去http://ftp.denx.de/pub/u-boot/网站下载最新的UBOOT源码u-boot-2019.04-rc2.tar.bz2 2.下载交叉编译工具 去linaro官网...
  • 2017.1.7 _u-boot的初步认识

    千次阅读 2017-01-18 09:53:06
    今天结束了C语言部分和裸机部分,现在开始学习UBOOT,学习完毕UBOOT后以后就是在操作系统的基础上来进行操作裸机了。UBOOT是用来启动操作系统的。 当我们学习前面的简单的知识的时候可能觉得学不清楚,这是因为没有...
  • Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析

    万次阅读 多人点赞 2016-03-04 22:33:11
    Uboot 所用版本 u-boot-2013.01  u-boot-2013.01 有上千文件,要想了解对于某款开发板,使用哪些文件、哪些文件首先执行、可执行文件占用内存的情况,最好的方法就是阅读它的Makefile。 根据顶层Readme文件的...
  • 嵌入式linux之Uboot和系统移植--基础

    千次阅读 2016-10-04 17:27:16
    uboot和系统移植-第1部分-uboot学习前传》 (观看朱友鹏老师视频后整理的笔记)   1.为什么要有uboot 2.为什么是uboot 3.uboot必须解决哪些问题 4.uboot的工作方式 5.uboot的常用命令1 6.uboot的常用命令...
  • openwrt-uboot-mt7628-master框架分析

    千次阅读 2018-10-24 21:36:50
    在顶层目录执行 make menuconfig 时: menuconfig: clean config.in ... $(CONFIG_SHELL) scripts/Menuconfig config.in 可以看到 menuconfig 目标的依赖是 clean 命令和 config.in 文件 然后执行 scrip...
  • 树莓派3/A20 Bootloader加载过程分析

    万次阅读 2014-03-15 10:44:35
    作为一名树莓派3的玩家,可能会将会感兴趣于这个板子的启动过程,就嵌入式linux而言,...后面,将会在此基础上继续介绍如何进一步挂载跟文件系统,启动到shell甚至GUI图形界面,从而构建一个完整、可用的linux系统。
  • 硬件平台:tiny4412系统:linux-3.5-20151029文件系统:busybox-...本文将记录从零使用uboot在tiny4412上搭建linux系统的。由于之前只是学了2440,完成这个流程也遇到各种,现在总结如下。其中参考了多篇博客才得以
  • 02. Uboot配置与编译

    千次阅读 2018-07-02 09:26:38
    uboot源码目录分析 x210 uboot目录结构如下图所示 说明1:x210使用的uboot版本相对较早(2008年8月版本),目前较新的uboot目录结构有所调整 ① 增设了arch目录,统一管理不同架构的cpu和lib_arch目录 ② 将common...
  • Hi3516A开发--编译内核、uboot

    万次阅读 2016-09-18 16:33:55
    有两种编译方式 一、整个编译 (1)编译整个osdrv目录: make OSDRV_CROSS=arm-hisiv300-linux all 或者 make OSDRV_CROSS=arm-hisiv400-linux all /* 如果单板使用spi接口nand flash作为存储介质,请在编译整个目录...
  • uboot分析之Makefile(一)

    千次阅读 2017-06-22 17:25:09
    牢骚:  嵌入式行业当中,大都以做产品和解决方案居多。对于做产品的公司,BSP相关的工作相对少些甚至没有直接让方案公司来搞定。其实底层工作是还可以细分的,比如BSP和内核驱动。...其实uboot也是一个博大精深
  • GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析

    万次阅读 多人点赞 2012-12-01 20:54:17
    在理解bootloader后,花些时间重新学习了开源软件的makefile和相关脚本之后,自己的u-boot移植工作也比较顺利的完成了:  移植环境:  ubuntu 12.04  U-Boot 2012.07 (Nov 28 2012 - 20:05:48) ...
  • uboot配置和编译过程详解

    万次阅读 2019-03-28 12:52:12
    希望你也加入到人工智能的队伍来!点击浏览教程。写得特别用心喔~ →→→→→→大神朋友简介:从事十几年人工智能研究,麻省理工博士学位,目前在百度继续进行着人工智能的研究。。。 ▲▲▲▲▲▲▲▲▲▲▲▲▲...
  • uboot和Linux内核移植

    千次阅读 2020-01-03 05:24:04
    这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文。请发送「uboot和Linux内核移植」到公众号后台获取下载...
  • 一.uboot主Makefile分析1 1、uboot version确定(Makefile的24-29行) Makefile代码部分 (1)uboot的版本号分3个级别: VERSION:主板本号 PATCHLEVEL:次版本号,即补丁版本号 SUBLEVEL:再次版本号 ...
  • uboot常用命令与环境变量一文,已经对uboot的基本认识有了一个简单的介绍,也知道了uboot是引到操作系统启动和部署整个计算机系统的最重要的一部分,下面对uboot的配置和编译过程代码进行详细分析。 首先说明该...
1 2 3 4 5 ... 20
收藏数 2,368
精华内容 947
关键字:

uboot中shell分析