Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Raspberry Pi 5の起動プロセスについて
Search
hotaru
March 20, 2026
1.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Raspberry Pi 5の起動プロセスについて
hotaru
March 20, 2026
More Decks by hotaru
See All by hotaru
リンカを作ってみた
hotaru_jp
0
200
デバッグ支援ハイパーバイザとRaspberry pi 5でのAMP
hotaru_jp
0
100
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
150
Paper Plane (Part 1)
katiecoart
PRO
0
8.9k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Building the Perfect Custom Keyboard
takai
2
790
Everyday Curiosity
cassininazir
0
230
What's in a price? How to price your products and services
michaelherold
247
13k
Become a Pro
speakerdeck
PRO
31
6k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
The SEO identity crisis: Don't let AI make you average
varn
0
490
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
840
Building Flexible Design Systems
yeseniaperezcruz
330
40k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Transcript
Raspberry Pi 5の起動プロセスについて Kernel/VM つくば 2026/3/20 ほたるいか
自己紹介 ほたるいか 詳細なプロフィール 東京科学大学 学士2年 SecHack365 '25 坂井ゼミ サイボウズ・ラボユース ‘25
セキュリティキャンプ 2024 全国大会 ハイパーバイザゼミ OS/ハイパーバイザ作成から基板作成まで 低レイヤーが好きです
背景 ベアメタルプログラムをRaspberry Pi 5で起動するまでの障害 Raspberry Pi 5でもベアメタル開発がしたいが、Raspberry Pi 5では起動のも難しい Uefi非対応
U-Boot非対応 独自のfirmwareに よりlinuxを起動
Raspberry Pi 5での起動プロセスの概要 Soc(BCM2712)内蔵のBoot ROMから 1st Stage BootLoaderが起動 SPI EEPROM上の
2nd Stage BootLoaderが起動 SPI EEPROMにある BOOT_ORDERに従ってBoot パーティションを探索 Bootパーティションの config.txtを読む initramfsをメモリ上にロード dtbをメモリ上にロードしてdtb overlayを適用 trusted firmwareをメモリ上にロード kernelをロード + 展開 trusted firmwareを実行 kernelを実行 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
1.Soc(BCM2712)内蔵のBoot ROMから1st Stage BootLoaderが起動 Raspberry Pi 5のSocであるBCM2712内部のROMから読み出されて実行される最初のBootlLoader 変更が不可能なので、セキュアブートの際のtrusted rootとして利用されていそう SDカードのboot
partitionにrecovery.binが配置されている場合は、それを読み出してEEPROMをそのデータで初期化する EEPROMの2nd Stage BootLoaderのアップデートに利用できる 2.SPI EEPROM上の2nd Stage BootLoaderが起動 Raspberry Pi 5に乗っているEEPROMから読み出されるSecond Stage BootLoader このBootLoaderがメモリの初期化やRP1のfirmware転送などのほとんどの初期化を担当する config.txtで挙動を変更できる 3.SPI EEPROMにあるBOOT_ORDERに従ってBootパーティションを探索 EEPROMに保存されているBOOT ORDERに沿って、デバイスのBootを試みる EEPROMで設定できる内容は以下のページにまとまっている https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#configuration-properties
4.Bootパーティションのconfig.txtを読む Bootパーティションがあるデバイスが見つかった場合、Firmwareはまずconfig.txtを読み、 その内容に従ってデバイスを起動する config.txtの設定できる内容は以下の通り https://www.raspberrypi.com/documentation/computers/config_txt.html 5.initramfsをメモリ上にロード initramfsをメモリ上にロードする config.txtのinitramfs <file> <addr>で明示指定できる
複数fileを指定できるらしい addrのところにfollowkernelとするとカーネル直後に auto_initramfs=1ならkernel_2712.img → initramfs_2712、kernel8.img → initramfs8になる 6.dtbをメモリ上にロードしてdtb overlayを適用 dtbをメモリ上にロードして、config.txtのdtoverlayで指示されているdtb overlayを適用する ロード位置は、device_tree_address=<addr>で変更できる
7.trusted firmwareをメモリ上にロード メモリ上にtrusted firmwareをロードする armstub=<file>でロードするfirmwareを変更できる(メモリ上の0番地からにロードされてアドレスの変更は出来ない?) 8.kernelをロード + 展開 kernelをメモリ上にロードして(gzipで圧縮されている場合は)展開する デフォルトではRaspberry
Pi 5用のkernel_2712.imgをロードしようとするが、無かった場合はkernel8.imgにフォールバック kernel=<file>で指定可能 kernel_address=<addr>でロードするアドレスは指定できるが、それを展開する/relocateするアドレスは固定で baremetal binaryの場合: 0x80000固定 linux binaryの場合: 0x200000固定 になっていそう 9.trusted firmwareを実行 10.kernelを実行 trusted firmwareを実行する このとき、権限レベルはEL3で実行されて、この実行が終了するときにEL2に下げられてからkernelが起動される
Raspberry Pi 5でベアメタルプログラミングをする際の注意点 elfのロードは出来ない stripされた生binary or linuxのヘッダ形式のbinaryのみ起動可能 kernelのアドレスは生binaryの場合はロード先が0x80000固定 config.txtのkernel_addressで指定できるように見えるが嘘 kernel_addressは一時ロード先の指定で、その後relocateされてしまう
アドレスの指定をミスると簡単に上書きされうる
Raspberry Pi 5でHelloWorldをRP1からしてみる RP1とはRaspberry Pi 5のGPIO等外部ペリフェラルコントローラー BCM2712(Soc)とPcie 2.0 x4で繋がっている firmwareがRP1の初期化を行ったあとリセットせずにkernelに渡してくれる
オプションがある pciex4_reset=0 # RP1をリセットせずにkernelに渡す enable_rp1_gpio=1 # RP1のGPIO 14/15から出ているuart0をGPIO含め てセットアップしてから渡すオプション enable_rp1_gpio=1があれば、何も初期化せずともRP1のuart0から文字を 出力できる 0x1c_0003_0000にあるpl011にアクセスして文字表示
Raspberry Pi 5でRP1のUARTからの割込みを受け取ってみる Cortex A76 ✕ 4 GIC-400 (Gic v2)
④:IRQ/FIQ MSI-X Interrupt Peripheral ③:SPI RP1 割込みコントローラ ②:MSI/X PL011 UARTコントローラ ①: SPI RP1(GPIOコントローラ) BCM2712(Soc) PL011 UARTコントローラ ①: SPI GIC-400 (Gic v2) Raspberry Pi 5 Raspberry Pi 4 GIC-400 (Gic v2) Cortex A72 ✕ 4 ②:IRQ/FIQ
Raspberry Pi 5でRP1のUARTからの割込みを受け取ってみる Cortex A76 ✕ 4 GIC-400 (Gic v2)
④:IRQ/FIQ MSI-X Interrupt Peripheral ③:SPI RP1 割込みコントローラ ②:MSI/X PL011 UARTコントローラ ①: SPI RP1(GPIOコントローラ) BCM2712(Soc) PL011 UARTコントローラ ①: SPI GIC-400 (Gic v2) Raspberry Pi 5 Raspberry Pi 4 GIC-400 (Gic v2) Cortex A72 ✕ 4 ②:IRQ/FIQ ここを頑張って設定
Raspberry Pi 5でRP1のUARTからの割込みを受け取ってみる 動いた! をしたかった図(なにも変えてないのに壊れた) GitHub