一文详解嵌入式之uboot的作用
扫描二维码
随时随地手机看文章
U-Boot(通用引导加载程序)在嵌入式系统中的作用主要包括硬件初始化、引导操作系统内核、提供调试工具及固件升级支持,具体功能如下:
硬件初始化
U-Boot在系统启动时负责初始化CPU、内存、串口、网卡等核心硬件组件,为操作系统运行奠定基础。例如,它会设置处理器模式、内存控制器参数、时钟频率等关键硬件状态。
引导操作系统
U-Boot可从闪存、SD卡、网络等多种介质加载操作系统内核(如Linux),并将其从存储设备复制到内存中启动。它支持自定义启动参数(如内存分配、命令行参数等),并处理内核镜像的加载与验证。
系统调试与维护
U-Boot提供命令行接口(CLI),允许开发者实时查看硬件信息、修改启动参数、读写存储设备等操作。例如,通过串口或网络连接可实时调试内存状态或监控系统运行,部分工业设备仍依赖其硬实时响应能力。
固件升级支持
U-Boot支持通过网络或本地存储升级固件,适用于需要远程维护的嵌入式设备。例如,智能电网终端通过保留必要驱动模块实现快速固件更新。
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启动。
U-boot是一种开源bootloader, 作用是用来引导操作,以及给开发人员提供测试调试工具。本身算是个精简的Linux系统,主要是负责硬件的初始化和引导,本身带有一些工具,作为引导程序,常作为嵌入式设备的引导。当真正的系统开始运行的时候U-boot就把管理权限交了出去。
选择U-Boot的理由: ① 开放源码; ② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android; ③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS; ④ 较高的可靠性和稳定性; ⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦ 较为丰富的开发调试文档与强大的网络技术支持;
U-BOOT工作模式
U-Boot的工作模式有启动加载模式和下载模式。启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式操作系统从FLASH中加载到SDRAM中运行,整个过程是自动的。下载模式就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的FLASH中。用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。
当前测试uboot命令的开发板是友善之臂tin441,使用三星的EXYNOS4412,本篇文章重点是介绍uboot命令行的命令功能,用法,使用的uboot版本是2010.12,是友善之臂官方提供的uboot。
uboot
1.硬件管理 uboot要能够进行Soc级(Soc内部外设)和板级(Soc外部外设)硬件管理。 uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在刷机时LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口。譬如uboot要实现网络功能就必须驱动网卡芯片。 2.能够完成镜像烧录(刷机) uboot要能够被借助完成刷机操作。参考下SD卡刷机的步骤: a.烧录uboot到SD卡中。 有2种烧写方法:一种是在windows中用刷卡工具去制作启动SD卡;另一种是在linux中用dd命令。制作完SD后将SD卡插入开发板,然后开机就可以进入uboot界面。 b.使用uboot的fastboot命令,并借助PC中的fastboot软件完成包括uboot、kernel、rootfs等的镜像的烧录。 从上面就可以看出,刷机依靠的是uboot的fastboot命令,将镜像写到相应的FLASH中。 3.uboot的“生命周期” uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。 4.uboot要提供命令式shell界面 shell是用户操作接口的意思。shell有命令行的shell,如windows下的cmd,如linux下的终端;也有GUI式的shell,比如常用的windows下的各种界面。shell是一种封装后留出来的接口,uboot也要有这样的一个接口。 shell的原理是:由消息接收、解析、执行构成的一个死循环。我之前用过3D打印机的固件(firmware)也是这样的模式。 uboot的shell使用的也是行缓冲的模式。也就是以回车键(换行键)作为一个命令输入的结束。对应的其他缓冲模式还有无缓冲和全缓冲:无缓冲就是输入一个字符就当做一个命令处理;全缓冲就是无论输入什么都缓冲起来知道缓冲区满了才做一次处理。
bootloader 与 uboot的区别
BootLoader是嵌入式设备中用来启动操作系统内核的一段程序。 uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。 uboot的核心作用就是启动操作系统内核,uboot的本质就是一段裸机程。
首先uboot可以说是一个裸机程序,提到裸机程序直觉就是可以验证功能,所以uboot提供了强大的命令行,支持了各种硬件相关的驱动程序,所以先跑起来uboot很重要。
然后就是一些功能不方便kernel去做的,比如升级就更加的高效。因为uboot里面去操作FLASH等有更高的效率
若设置了 u-boot 启动时等待任意键输入几秒,若有输入,则退出自启动模式而进入命令行模式。
help:显示所有命令及其说明;
help 命令:显示命令详细的使用说明;
pri:查看所有环境变量,包括开机等待任意输入的时延(秒)、串口波特率(baudrate)、本地 IP 地址(ipaddr)、tftp 服务器端的 IP 地址(serverip)、自启动命令字符串(bootcmd,一般不用动)等等;
setenv <环境变量> <要设置的值>:修改某一个环境变量为要设置的值,要设置的值 若是字符串则要加双引号;
saveenv:将当前所有设置过的环境变量保存,掉电不丢失;
reset:复位;
dhcp:执行 DHCP 服务,获取 IP 地址,验证网络功能;
setenv my:恢复系统的所有环境变量为默认,即使之前用户重设的环境变量都恢复默认;
protext on/off 0~10000:对 Nor Flash 区域 [0x0 ~ 0x10000] 设置为写保护或取消写保护;
movi:对 EMMC 进行操作;
run bootcmd:,执行 bootcmd ,其是一个环境变量,为一段字符串形式的命令;上电后 u-boot 若处于自启动模式最后执行则执行的多条命令,默认为 下载内核、设备树和运行内核的多个命令,可以根据需要增加命令,以分号分隔。
boadinfo:查询板子信息命令
内存操作命令:内存操作命令md读,mw写,nm修改内存值,mm也是写但是会自增地址,cp拷贝,cmp对比内存值。