Bootloader是在硬件引导时运行的引导程序,是运行操作系统的前提条件。

在操作系统内核或用户应用程序运行之前运行的代码。

在嵌入式系统中,整个系统的初始化和加载任务通常由BootLoader完成。

Bootloader运行通常分为两个阶段。

BootLoader独立于操作系统。

BootLoader不仅依赖于CPU的体系结构,而且依赖嵌入式系统板级设备的配置。

Bootloader的执行模式

自启动模式:该模式下,BootLoader按照预先设定的命令自动运行,整个过程并没有用户介入

交互模式:该模式下,BootLoader通过串口和PC机通信,接受用户命令。

U-boot 通用引导程序(universal bootloader)

uboot主要是用来启动操作系统内核的;

uboot还要用来部署整个计算机系统;

uboot中还有操作Flash等板子上硬盘驱动;

ubbot还得提供一个命令行界面供人使用。

早期的uboot的版本号类似于这样:uboo。后来版本号变成了类似于uboo。

其核心部分几乎没有变化,对于老伴的芯片,新旧版本的uboot并没有差异。

具有可移植性,具有源代码级别的移植能力,可以针对于多个开发板进行移植。

uboot必须自身可开机直接启动

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

可以在uboot中事先给Linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置区去uboot传给他的参数。

uboot的本质就是一个裸机程序,是一个开源项目

uboot运行时会被加载到内存之中然后一条一条指令去CPU执行

环境变量可以被认为是系统的全局变量,程序或者系统在运行时候可以通过读取环境变量来指导程序的运行,这要设置的好处是灵活。

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

uboot 常用命令

类似Linux终端的行缓冲命令行

行缓冲的意思就是:当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓冲区(系统认为没有输入完)

Linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲

有些命令有简化别名

printenv/print :打印环境变量

setenv/set :设置新的变量

saveenv/save :保存环境变量

ping :网路测试指令

fastboot通过USB进行数据传输

tftp通过有线网络进行

tftp :下载指令

tftp 0x30000000 zImage

nfs :启动内核命令

bootm启动内核同时给内核传参;go不传参,其内部就是一个函数指针指向一个内存地址直接调用那个函数,实质是跳转到一个内存指针去运行

环境变量有两份,一份在flash中,另一份在DDR中。uboot开机时一次性从flash中读取全部环境变量到DDR中作为初始化值,然后使用过程中都是用DDR这份,用户可以用save指令将DDR中的环境变量重新写入flash去更新。

bootdelay :开机倒数时间

reset :uboot重启

ipaddr :开发板

serverip :服务器

gatewayip :网关

netmask :子网掩码

ethaddr :开发板本地MAC地址

bootcmd :自动启动运行命令设置

bootargs :uboot给kernel传参

console=ttySAC2,115200 :控制台使用串口2,波特率115200

root=/dev/mmcblk0p2 rw :根文件系统在SD卡端口0设备第二分区,根文件系统是可读可写的

init=/linuxrc :linux的进程1的路径

rootfstype=ext3 :根文件系统的类型是ext3

uboot中对flash和DDR的管理

分区就是说对flash进行分块管理

uboot必须从flash起始地址开始存放,一般512K或1M

环境变量一般紧贴uboot存放,大小为32k

kernel可以紧贴环境变量来存放,大小为5M

rootfs

剩下的是自由分区

DDR的分区和flash的分区不同,主要是flash是掉电存在的,DDR是每次系统运行时才开始部署。

内存的分区是在Linux内核启动之前,Linux内核启动之后内存的管理模块会接管整个内存空间。

内存分区的关键就是避免不同功能使用了同一块内存造成互相踩踏。

相关推荐