系統啓動流程
這個分區裏存放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