uboot开启shell_uboot shell - CSDN
精华内容
参与话题
  • uboot的作用和功能

    万次阅读 多人点赞 2019-02-27 10:57:35
    uboot是用来干什么的,有什么作用? uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核 所以,由上面描述的,就知道,UBOOT需要具有读写flash的能力...

    uboot是用来干什么的,有什么作用?

    uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核

    所以,由上面描述的,就知道,UBOOT需要具有读写flash的能力。

    uboot是怎样引导启动内核的?

    uboot刚开始被放到flash中,板子上电后,会自动把其中的一部分代码拷到内存中执行,这部分代码负责把剩余的uboot代码拷到内存中,然后uboot代码再把kernel部分代码也拷到内存中,并且启动,内核启动后,挂着根文件系统,执行应用程序。

    uboot启动的大过程是怎么样的?

    uboot启动主要分为两个阶段,主要在start.s文件中,第一阶段主要做的是硬件的初始化,包括,设置处理器模式为SVC模式,关闭看门狗,屏蔽中断,初始化sdram,设置栈,设置时钟,从flash拷贝代码到内存,清除bss段等,bss段是用来存储静态变量,全局变量的,然后程序跳转到start_arm_boot函数,宣告第一阶段的结束。

    第二阶段比较复杂,做的工作主要是1.从flash中读出内核。2.启动内核。start_arm_boot的主要流程为,设置机器id,初始化flash,然后进入main_loop,等待uboot命令,uboot要启动内核,主要经过两个函数,第一个是s=getenv("bootcmd"),第二个是run_command(s...),所以要启动内核,需要根据bootcmd环境变量的内容启动,bootcmd环境变量一般指示了从某个flash地址读取内核到启动的内存地址,然后启动,bootm。

    uboot启动的内核为uImage,这种格式的内核是由两部分组成:真正的内核和内核头部组成,头部中包括内核中的一些信息,比如内核的加载地址,入口地址。

    uboot在接受到启动命令后,要做的主要是,1,读取内核头部,2,移动内核到合适的加载地址,3,启动内核,执行do_bootm_linux

    do_bootm_linux主要做的为,1,设置启动参数,在特定的地址,保存启动参数,函数分别为setup_start_tag,setup_memory_tag,setup_commandline_tag,setup_end_tag,根据名字我们就知道具体的段内存储的信息,memory中为板子的内存大小信息,commandline为命令行信息,

    2,跳到入口地址,启动内核

    启动的函数为the_kernel(0,bd->bi_arch_number,bd->bi_boot_param)

    bd->bi_arch_number为板子的机器码,bd->bi_boot_param为启动参数的地址

     

    总结:uboot到底是干嘛的,对应下面uboot必须要解决哪些问题!

    1)uboot主要作用是用来启动操作系统内核。体现在uboot最后一句代码就是启动内核。

    2)uboot还要负责部署整个计算机系统。体现在uboot最后的传参。

    3)uboot中还有操作Flash等板子上硬件的驱动。例如串口要打印,ping网络成功,擦除、烧写flash是否成功等。

    4)uboot还得提供一个命令行界面供人来操作。很简单,至少你能看到。

    计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM)。而一般的PC机启动过程为:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)。

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

    3 uboot必须解决哪些问题?

    3.1自身可开机直接启动

    1)一般的SoC都支持多种启动方式,譬如SD卡启动、NorFlash启动、NandFlash启动等•••••uboot要能够开机启动,必须根据具体的SoC的启动设计来设计uboot

    2)uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。uboot中第一阶段的start.S文件中具体处理了这一块。

    3.2能够引导操作系统内核启动并给内核传参

    1)uboot的终极目标就是启动内核。

    2)linux内核在设计的时候,设计为可以被传参。也就是说我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。

    3.3能提供系统部署功能

    1)uboot必须能够被人借助而完成整个系统(包括uboot、kernel、rootfs等的镜像)在Flash上的烧录下载工作。

    2)裸机教程中刷机(ARM裸机第三部分)就是利用uboot中的fastboot功能将各种镜像烧录到iNand中,然后从iNand启动。

    3.4 能进行soc级和板级硬件管理

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

    2)SoC级(譬如串口)就是SoC内部外设,板级就是SoC外面开发板上面的硬件(譬如网卡、iNand)

    3.5 uboot的"生命周期"

    1)uboot的生命周期就是指:uboot什么时候开始运行,什么时候结束运行。

    2)uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot(意思就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot(所以uboot启动了内核后uboot自己本身就死了,要想再次看到uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生)

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

    总结:uboot的一切都是为了启动内核。

    4.S5PV210的uboot与架构

    5 uboot的工作方式

    5.1 从裸机程序镜像uboot.bin说起

    1)uboot的本质就是一个裸机程序,和我们裸机全集中写的那些裸机程序xx.bin并没有本质区别。如果非说要有区别,那就是:我们写的大部分小于16KB,而uboot大于16KB(一般uboot在180k-400k之间)

    2)uboot本身是一个开源项目,由若干个.c文件和.h文件组成,配置编译之后会生成一个uboot.bin,这就是uboot这个裸机程序的镜像文件。然后这个镜像文件被合理的烧录到启动介质中拿给SoC去启动。也就是说uboot在没有运行时表现为uboot.bin,一般躺在启动介质中。

    3)uboot运行时会被加载到内存中然后一条指令一条指令的拿给CPU去运行。

    5.2 uboot的命令式shell界面

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

    2)有些程序需要和人进行交互,于是乎程序中就实现了一个shell(shell就是提供人机交互的一个界面,回想ARM裸机全集第十六部分),uboot就实现了一个shell。

    注意:shell并不是操作系统,和操作系统一点关系都没有。linux中打开一个终端后就得到了一个shell,可以输入命令回车执行。uboot中的shell工作方式和linux中的终端shell非常像(其实几乎是一样的,只是命令集不一样。譬如linux中可以ls,uboot中ls就不识别)。

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

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

    2)命令就是uboot的shell中可以识别的各种命令。uboot中有几十个命令,其中有一些常用另一些不常用(我们还可以自己给uboot添加命令),后面会用几节课时间来依次学习uboot中常用命令。

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

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

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

    展开全文
  • 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移植之前的工作

    千次阅读 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的一部分。

    展开全文
  • Orangepi 3 全志H6 uboot的编译与烧写

    千次阅读 2020-06-15 20:06:46
    OrangePi 3 全志H6 uboot编译与烧写过程记录。
  • 什么是ubootuboot有什么用?

    千次阅读 2019-10-17 09:11:19
    一、为什么要有uboot 1.1、计算机系统的主要部件        (1)计算机系统就是以CPU为核心来运行的系统。典型的计算机系统有:PC机(台式机+笔记本)、嵌入式设备(手机、平板电脑...
  • Uboot1之什么是uboot

    2018-03-14 22:44:31
    时间:2018.3.14 作者:Tom ...1.什么是uboot?U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编...
  • 嵌入式linux之Uboot和系统移植--基础

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

    2016-05-28 12:16:42
    2.1.4.1 从uboot.bin说起 (1)uboot本质上是一裸机程序,和其他裸机程序(譬如驱动LED程序)并没有本质上的区别,只是所uboot要更复杂 ...2.1.4.2 uboot中的命令行shell界面 (1)uboot实现了一个命令行的shel
  • uboot是如何启动的:(以S5PV210为例) (1)当S5PV210开机之后,先运行IROM中的BL0,BL0的其中一项工作就是将启动介质中的前16K代码(也就是uboot的前16K)拷贝到内部的IRAM中。
  • arria 10 soc uboot编译

    千次阅读 2016-11-17 16:52:48
    windows soceds 编译出错,无奈必须搭建linux 64bit环境编译,log ...需要说明的是uboot只支持在linux host machine 上编译,但是device tree 可以在windows或者linux 机器上编译。 整个产生uboot+dtb(f
  • 硬件平台:tiny4412系统:linux-3.5-20151029文件系统:busybox-...本文将记录从零使用uboot在tiny4412上搭建linux系统的。由于之前只是学了2440,完成这个流程也遇到各种,现在总结如下。其中参考了多篇博客才得以
  • 开启开发者模式后,记录 SSH 登录信息 进入路由器后台 安装Shell工具,Windows上有 putty 和XShell等等,随意安装一个,Lunix和OSX 自带有终端工具。(个人比较喜欢用FinalShell SSH工具这款免费工具) 不死 uboot...
  • 内核编译直接生成uImage----make uImage

    千次阅读 2013-09-24 21:31:21
    在编译内核的时候,一般直接使用make uImage是不可以的,会出现时一下错误 UIMAGE arch/arm/boot/uImage "mkimage" command not found - U-Boot images will not be built Image arch/arm/boot/...
  • 1、下载NXP 官方 I.MX6ULL EVK 开发板的ubootuboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 2、使用 FileZilla Client 将 uboot拷贝到ubuntu 3、解压 tar -xjvf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 ...
  • C-Kermit在linux 下的安装和使用

    万次阅读 2012-05-03 11:08:33
    1. 到http://www.columbia.edu/kermit/ckdaily.html下载ckermit源码x.tar.gz 版本:0.9 因为较低的版本不支持波特率921600 2.编译ckermit tar xzvf x.tar.gz -C ckermit cd ckermit ...|--
  • 3.uboot 的工作方式

    2020-04-02 22:18:29
    1. 从裸机程序镜像 uboot.bin 说起 (1)uboot 的本质就是一个裸机程序,和我们裸机全集中写的那些裸机程序xx.bin 并没有本质区别。如果非说要有区别,那就是:我们写的大部分小于 16kb(一般 uboot 在 180k-400k ...
  • 1、uboot学习前传

    2016-09-16 20:34:07
    1、为什么是uboot 1.1 计算机系统的核心部件主要有:CPU、外部存储器(flash/硬盘)、内部存储器(DDR/SRAM..) 1.2 Linux系统的启动过程 :嵌入式设备上电首先根据启动方式来运行uboot例如s5pv210常用的启动有:...
1 2 3 4 5 ... 20
收藏数 2,107
精华内容 842
关键字:

uboot开启shell