当前位置: 代码迷 >> 综合 >> Linux 之 Uboot/GRUB
  详细解决方案

Linux 之 Uboot/GRUB

热度:87   发布时间:2023-11-15 06:29:54.0

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 引导方法:

  1. 自动执行 bootcmd 环境变量内的内部的指令( copy bootm ):
    bootcmd=ext4load mmc 2:1 0X48000000; bootm 0x48000000
    a. 将内核镜像搬移到某一个地址: tftpboot 0x48000000 uImage
    b. 到这个地址进行执行 二进制的 arch架构 可执行程序 : bootm 0x48000000

  2. 在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源代码分析总结

  1. 通过对整个源代码的分析,大致上整个GRUB启动到引导其他操作系统分为如下几个步骤。
  2. 第一步 开机后,通过BIOS装载Stage1模块
  3. 第二步 通过Stage1模块装载Start模块
  4. 第三步 通过Start模块将整个GRUB的内核载入内存
  5. 第四步通过GRUB的一个Shell的机制,作为一个小型的操作系统,来通过指令的方式装载不同的其他操作系统。

****以标记列表(tagged_list)的形式来传递启动参数 --> copy&run内核–> dead * * * *