raspberry树莓派--启动流程

系统启动流程

在这里插入图片描述
这个分区里存放bootcode.bin、config.txt、start.elf和u-boot.bin
config.txt中 指定 kernel=kernel.img

bootcode.bin: 启动文件
start.elf : 类似U-Boot的BootLoader文件
kernel.img: Linux内核文件
config.txt: 配置文件

从linux 命令行角度看文件系统类型:
在这里插入图片描述
在这里插入图片描述

1st stage:

power on
-> GPU读取ROM内容
->GPU运行ROM中代码

2nd stage:

GPU读取SD卡第一个FAT分区根目录下bootcode.bin
-> GPU讲bootcode.bin复制到L2 cache
-> GPU执行bootcode.bin

3rd stage:

GPU读取SD卡第一个FAT分区根目录中start.elf
-> GPU将start.elf加载到内存中
->GPU开始执行start.elf

4th stage:

GPU读取SD卡第一个FAT分区根目录中的kernel.img(Linux 内核) 到内存
->唤醒CPU
->CPU 开始运行kernel.img

总结

至此启动完成(GPU搬代码,rom->bootcode.bin->start.elf->kernel.img),与通常CPU搬代码流程(rom->bootloader->os)不同。

博通的这个GPU叫做VideoCore IV,已经出到第四代了,可以独立执行代码。
博通这样做的原因,一方面:让启动管理完全掌握自己手里,GPU资料不公开;另一方面,加速启动过程中出现画面。
geek们,通过****,**了VideoCore IV的机器码,总结出了GPU的指令集,制作了GPU编译器和一套二进制工具。
Herman Hermitage大神
(https://github.com/hermanhermitage/videocoreiv/tree/master/blinker01)
Christinna大神
(https://github.com/christinaa/rpi-open-firmware)(没错github上的路径名字和他本人名字不一样)

动态加载调试kernel

将uboot引入到SD card中,通过uboot加载网络版kernel。实现kernel动态加载和调试。
1)需要引入针对rpi的uboot代码 (https://github.com/gonzoua/u-boot-pi/tree/rpi)
2)构建编译平台 32位的arm-gcc

在这里插入图片描述
armv7l
在这里插入图片描述 3)uboot中打通ethernet (树莓派的Ethernet网络芯片是基于USB的) 4)通过tftp方式下载uImage uboot命令行, 输入以下命令: usb start dhcp bootm 用固定IP启动: usb start setenv serverip <tftp_server_ip> setenv ipaddr <a_spare_ip_address> tftpboot uImage bootm