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
終末何してますか? 忙しいですか? U-Bootデバッグしてもらっていいですか? / Kern...
Search
Toshifumi NISHINAGA
September 22, 2017
Programming
0
990
終末何してますか? 忙しいですか? U-Bootデバッグしてもらっていいですか? / KernelVM Hokuriku 3
2017/09/22に第3回 KernelVM@北陸で発表した資料です。
U-Bootのデバッグに知っていると便利な小ネタをご紹介します。
Toshifumi NISHINAGA
September 22, 2017
Tweet
Share
More Decks by Toshifumi NISHINAGA
See All by Toshifumi NISHINAGA
BareMetalで遊ぶRaspberry Pi 5 PCIe編/KernelVM Tokyo17
tnishinaga
0
1.9k
probe-rsの紹介と最近の貢献紹介/CELF-02-03
tnishinaga
1
390
SecurityCamp2023基板作るコース講義資料/Security Camp 2023 Lecture Materials
tnishinaga
8
2.5k
RP2040のPIOを使う話/KernelVM Hokuriku 6
tnishinaga
3
1.3k
JTAGでArmプロセッサをデバッグする方法のつづき/KernelVM_Tokyo16
tnishinaga
0
420
CMSIS-DAPの概要と使い方/KernelVM Online5
tnishinaga
0
1.8k
JTAGでarmプロセッサをデバッグする話/KernelVM Online4
tnishinaga
4
3.2k
ARM入門/arm introduction
tnishinaga
14
12k
俺の仮想マシンルーターがこんなに遅いはずはない/ KernelVM online 1
tnishinaga
0
2.8k
Other Decks in Programming
See All in Programming
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
250
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
260
Jakarta EE meets AI
ivargrimstad
0
370
プログラミング言語学習のススメ / why-do-i-learn-programming-language
yashi8484
0
160
15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新
notrogue
3
490
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
920
Open source software: how to live long and go far
gaelvaroquaux
0
660
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
14
4.6k
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
120
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
40
16k
CDKを使ったPagerDuty連携インフラのテンプレート化
shibuya_shogo
0
100
バッチを作らなきゃとなったときに考えること
irof
2
520
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Embracing the Ebb and Flow
colly
84
4.6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
The Cost Of JavaScript in 2023
addyosmani
47
7.4k
Building an army of robots
kneath
303
45k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
640
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Statistics for Hackers
jakevdp
797
220k
Transcript
終末何してますか? 忙しいですか? U-Bootデバッグして もらっていいですか? 2017-09-22 KernelVM Hokuriku 3
$ who @tnishinaga
本日の内容 U-Bootデバッグ時に知ってると便利な情報をご紹介
U-Bootとは • 組み込みでよく使うブートローダーの1つ • Linuxなどのブートに必要
U-Bootの役割 https://speakerdeck.com/tnishinaga/kernelvmshi-armmaikonru-men
U-Bootのデバッグ • こんなときに必要 ◦ U-Bootを新しい組み込みボードに移植したい ◦ U-Bootのドライバを追加したい ◦ U-Bootを直したい •
今回はARMマイコンボードを想定して解説
デバッグ方法 1. コードを眺める 2. U-Bootの動作を大まかに理解する 3. GDBでリロケートアドレスにシンボル情報をロードする 4. 問題の場所とコードを見つける 5.
Breakpointを仕込む 6. 動作をみる 7. 治す
U-Bootのコード概要(私がよく使うとこだけ抜粋) • ./arch • ./board • ./drivers • ./include •
./configs • ディレクトリ構造自体はLinuxに似ている ◦ Tips: パッチの送り方やチェック方法もほぼLinuxと同じ
./arch • ./arch/arm/cpu/armv* ◦ CPUアーキテクチャ共通のコードがあるところ ◦ cacheとかtimerとか • ./arch/arm/mach-* ◦
チップベンダごとの共通なコードがあるところ ◦ 例: ./arch/arm/mach-stm32/stm32f7 ▪ SoC初期化のコードやタイマーなど stm32f7共通のコードがある • ./arch/arm/dts ◦ デバイスの定義を書いたデバイスツリーソースのあるところ
./board • ./board/* ◦ マイコンボード固有のコードがあるところ ◦ 例: STM32F746-discovery ▪ ./board/st/stm32f746-disco
以下にある ▪ DRAM初期化とか、NICの初期化とかを行う
./drivers • ./drivers/* ◦ 各種ドライバのあるところ ◦ 例: STM32のGPIO ▪ ./drivers/gpio/stm32_gpio.c
./include • ./include/configs/* ◦ 各種マイコンやボードごとの基本設定定義があるところ ◦ 後述のdefconfigやmenuconfigで設定できないところは ここをいじると変えられる ◦ 例:
STM32F746-dicoveryの設定ファイル ▪ ./include/configs/stm32f746-disco.h
./configs • ./configs/* ◦ 各種マイコンやボードのデフォルト設定のあるディレクトリ ▪ make ..._defconfig で適応するやつ ◦
例: STM32F746-dicoveryのdefconfig設定ファイル ▪ ./configs/stm32f746-disco_defconfig
やりたいことと見るべきコード • 新たなボードでU-Boot動くようにしたい! ◦ 今回紹介したコード全部 • その他! ◦ 質問してください(ARMマイコン関係ならある程度お応えできるはず) ◦
しかし、大体今回紹介した部分は全部見ることになるはず……
U-Bootの動作(うろ覚え) 1. CPUを初期化 2. ペリフェラルを初期化 3. (ある場合は)SDRAMを初期化 4. U-Boot自身をROMからRAMにリロケート
U-Bootのリロケート • U-Bootは各種初期化完了後にROMから読み書き可能な RAMにU-Boot自身をコピーする • 以降はRAM上にコピーしたU-Bootを動かす ROM RAM U-Boot メモリ
U-Boot
U-Bootのリロケートとデバッグ • GDBはROM上のシンボル情報しか持ってない ◦ リロケート後のデバッグがつらい • GDBにリロケーと後のシンボル情報追加が必要 ROM RAM U-Boot
メモリ ROM RAM U-Boot メモリ U-Boot
リロケーションアドレスの調べ方 • U-Bootの以下のコマンドで得られる ◦ U-Boot > bdinfo ROM RAM U-Boot
メモリ U-Boot relocaddr: 0xC07B9000
GDBへシンボル情報を流し込む • u-bootのELFファイルからシンボル情報を流し込む ◦ (gdb) add-symbol-file u-boot 0xC07B9000 • 以降はRAM上のU-Bootをシンボル情報つきデバッグできる
まとめ • U-Bootのどこにどんなコードがあるか紹介した • U-Bootは起動時にリロケーションされる • リロケーション後のデバッグはシンボルテーブル情報追加が 必要 • リロケーションアドレスはbdinfoコマンドで得られる
• シンボルテーブル追加はadd-symbol-fileコマンドで行う
おわり あとはデバッグするだけ! がんばっ!