# Raspberry Pi 開機流程 ```graphviz digraph { node[shape=box] rankdir=LR power[label="Power Up"] video[label="Video Core"] stub[label="ARMstub"] kernel[label="Kernel"] power->video[label="start4.elf"] video->stub[label="config.txt"] stub->kernel[label="branch to\n0x80000"] } ``` ### VideoCore Raspberry Pi 在連接電源之後首先會先將 VideoCore 開啟,初始化 boot section 的檔案系統,從其中載入 start4.elf,完成後會切換到預設的 ARMstub 進行韌體的初始化。 ### ARMstub 進入到 ARMstub 後,會載入對應的 dtb 並將 exception level 從 `EL3` 切換到 `EL2`,接著轉交給 kernel 做開機。 ### kernel 因為在編譯的時候我們將 boot 的 assembly 放在 `0x80000` (`0x8000` 預設為 Aarch32 的開機位置,Aarch64 則在 `0x80000`) 開機後我們需要先將硬體切換到 `EL1` 之後進行 EL1 Exception Vectors 設定 Exception Vector 可以分為 4 種類別 - Sychronous: 常用來處理 svc 或是 hvc 所導致的 SWI (Software Interrupt) - IRQ (Interrupt Request): 中斷處理 - FIQ (Fast Interrupt Request): Secure Zone 中斷處理 - SError ## 參考資料 - [Raspberry Pi Bare Metal Tutorial - Low Level Devel](https://www.youtube.com/watch?v=pd9AVmcRc6U&list=PLVxiWMqQvhg9FCteL7I0aohj1_YiUx1x8) - [tools/armstub8.S - GitHub](https://github.com/raspberrypi/tools/blob/master/armstubs/armstub8.S) - [The Raspberry Pi Stubs | Andre Leiradella](https://leiradel.github.io/2019/01/20/Raspberry-Pi-Stubs.html) ###### tags: `raspi`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up