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

發佈了84 篇原創文章 · 獲贊 1 · 訪問量 1893
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章