BootLoader
引言:
打开设备的电源,BIOS开机自检,按BIOS中设置的启动设备的顺序(通常是硬盘)启动。跳线/帽,或者 PCB图中的顺序
PCB图中有很多的GPIO设备引脚:固定的地址,可以外接各种设备(LCD等)
接着启动设备上安装的引导程序lilo/ winPE / bootmanager 或 grub 开始拷贝、引导Linux、unix、windows
uboot嵌入式bootloader严重依赖于硬件实现
汽车ECU中, 指代码更新程序
bootloader要实现的功能:
- 初始化硬件设备
- 建立正确的内存空间映射
- 初始化栈
- 检测并初始化内存
- 初始化全局变量
- 加载程序,将非易失性存储器中的特定软件组拷贝到RAM中,传递 tags 参数 并 运行
U-Boot
# 编译&& 裁剪**
# u-boot
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_ca9x4_defconfig
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig # setting bootcmd and other load-media
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- qemu-system-arm \-M vexpress-a9 \-kernel u-boot\-nographic \-m 512M \
# -nic tap # else add some env cmd
编译添加自己的 cmd on u-boot命令行模式 !
添加自己的所有权等功能。
./common 文件夹下 add authorize.c
./common 文件夹下 modify Makefile:# echo obj-y += authorize.o" > ./common/Makefile
#include <common.h>
#include <command.h>static int authorize(struct cmd_tbl *cmdtp, int flag, int argc,char *const argv[])
{
int i = 0;for(i=0; i< argc; ++i){
printf("-author %d : [ %s ] not authored \n !", i, argv[i]);};return 0 ;
}U_BOOT_CMD(author, 4, 1, authorize, # 4 max_argv "Print the authors :","\n"," 张三,李四,王二麻子。。。"
);
U-BOOT 引导方法:
-
自动执行 bootcmd 环境变量内的内部的指令( copy bootm ):
bootcmd=ext4load mmc 2:1 0X48000000; bootm 0x48000000
a. 将内核镜像搬移到某一个地址: tftpboot 0x48000000 uImage
b. 到这个地址进行执行 二进制的 arch架构 可执行程序 : bootm 0x48000000 -
在boot倒计时 3 2 1时候(按下键盘的回车键,将进入到uboot的命令行模式) 进入uboot交互模式,自己输入命令 拷贝 / 引导 内核镜像可执行程序 :
=>tftpboot 0x48000000 uImage && bootm 0x48000000
bootargs=root=/dev/mmcblk0p8 init=/linuxrc console=ttySACI,115200 lcd=wy070ml tp=gslx680
GRUB/2
GRUB源代码分析总结
- 通过对整个源代码的分析,大致上整个GRUB启动到引导其他操作系统分为如下几个步骤。
- 第一步 开机后,通过BIOS装载Stage1模块
- 第二步 通过Stage1模块装载Start模块
- 第三步 通过Start模块将整个GRUB的内核载入内存
- 第四步通过GRUB的一个Shell的机制,作为一个小型的操作系统,来通过指令的方式装载不同的其他操作系统。