Slide 1

Slide 1 text

終末何してますか? 忙しいですか? U-Bootデバッグして もらっていいですか? 2017-09-22 KernelVM Hokuriku 3

Slide 2

Slide 2 text

$ who @tnishinaga

Slide 3

Slide 3 text

本日の内容 U-Bootデバッグ時に知ってると便利な情報をご紹介

Slide 4

Slide 4 text

U-Bootとは ● 組み込みでよく使うブートローダーの1つ ● Linuxなどのブートに必要

Slide 5

Slide 5 text

U-Bootの役割 https://speakerdeck.com/tnishinaga/kernelvmshi-armmaikonru-men

Slide 6

Slide 6 text

U-Bootのデバッグ ● こんなときに必要 ○ U-Bootを新しい組み込みボードに移植したい ○ U-Bootのドライバを追加したい ○ U-Bootを直したい ● 今回はARMマイコンボードを想定して解説

Slide 7

Slide 7 text

デバッグ方法 1. コードを眺める 2. U-Bootの動作を大まかに理解する 3. GDBでリロケートアドレスにシンボル情報をロードする 4. 問題の場所とコードを見つける 5. Breakpointを仕込む 6. 動作をみる 7. 治す

Slide 8

Slide 8 text

U-Bootのコード概要(私がよく使うとこだけ抜粋) ● ./arch ● ./board ● ./drivers ● ./include ● ./configs ● ディレクトリ構造自体はLinuxに似ている ○ Tips: パッチの送り方やチェック方法もほぼLinuxと同じ

Slide 9

Slide 9 text

./arch ● ./arch/arm/cpu/armv* ○ CPUアーキテクチャ共通のコードがあるところ ○ cacheとかtimerとか ● ./arch/arm/mach-* ○ チップベンダごとの共通なコードがあるところ ○ 例: ./arch/arm/mach-stm32/stm32f7 ■ SoC初期化のコードやタイマーなど stm32f7共通のコードがある ● ./arch/arm/dts ○ デバイスの定義を書いたデバイスツリーソースのあるところ

Slide 10

Slide 10 text

./board ● ./board/* ○ マイコンボード固有のコードがあるところ ○ 例: STM32F746-discovery ■ ./board/st/stm32f746-disco 以下にある ■ DRAM初期化とか、NICの初期化とかを行う

Slide 11

Slide 11 text

./drivers ● ./drivers/* ○ 各種ドライバのあるところ ○ 例: STM32のGPIO ■ ./drivers/gpio/stm32_gpio.c

Slide 12

Slide 12 text

./include ● ./include/configs/* ○ 各種マイコンやボードごとの基本設定定義があるところ ○ 後述のdefconfigやmenuconfigで設定できないところは ここをいじると変えられる ○ 例: STM32F746-dicoveryの設定ファイル ■ ./include/configs/stm32f746-disco.h

Slide 13

Slide 13 text

./configs ● ./configs/* ○ 各種マイコンやボードのデフォルト設定のあるディレクトリ ■ make ..._defconfig で適応するやつ ○ 例: STM32F746-dicoveryのdefconfig設定ファイル ■ ./configs/stm32f746-disco_defconfig

Slide 14

Slide 14 text

やりたいことと見るべきコード ● 新たなボードでU-Boot動くようにしたい! ○ 今回紹介したコード全部 ● その他! ○ 質問してください(ARMマイコン関係ならある程度お応えできるはず) ○ しかし、大体今回紹介した部分は全部見ることになるはず……

Slide 15

Slide 15 text

U-Bootの動作(うろ覚え) 1. CPUを初期化 2. ペリフェラルを初期化 3. (ある場合は)SDRAMを初期化 4. U-Boot自身をROMからRAMにリロケート

Slide 16

Slide 16 text

U-Bootのリロケート ● U-Bootは各種初期化完了後にROMから読み書き可能な RAMにU-Boot自身をコピーする ● 以降はRAM上にコピーしたU-Bootを動かす ROM RAM U-Boot メモリ U-Boot

Slide 17

Slide 17 text

U-Bootのリロケートとデバッグ ● GDBはROM上のシンボル情報しか持ってない ○ リロケート後のデバッグがつらい ● GDBにリロケーと後のシンボル情報追加が必要 ROM RAM U-Boot メモリ ROM RAM U-Boot メモリ U-Boot

Slide 18

Slide 18 text

リロケーションアドレスの調べ方 ● U-Bootの以下のコマンドで得られる ○ U-Boot > bdinfo ROM RAM U-Boot メモリ U-Boot relocaddr: 0xC07B9000

Slide 19

Slide 19 text

GDBへシンボル情報を流し込む ● u-bootのELFファイルからシンボル情報を流し込む ○ (gdb) add-symbol-file u-boot 0xC07B9000 ● 以降はRAM上のU-Bootをシンボル情報つきデバッグできる

Slide 20

Slide 20 text

まとめ ● U-Bootのどこにどんなコードがあるか紹介した ● U-Bootは起動時にリロケーションされる ● リロケーション後のデバッグはシンボルテーブル情報追加が 必要 ● リロケーションアドレスはbdinfoコマンドで得られる ● シンボルテーブル追加はadd-symbol-fileコマンドで行う

Slide 21

Slide 21 text

おわり あとはデバッグするだけ! がんばっ!