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内核启动之后内存的管理模块会接管整个内存空间。
内存分区的关键就是避免不同功能使用了同一块内存造成互相踩踏。