/var/log/messages

debugging with sixth sense

RasPI で動く Kernel ビルドとそのデバッグ

自宅にて。

以下を参考にしつつすすめます。

とりあえず toolchain を入れれ、とのこと。

$ git clone https://github.com/raspberrypi/tools

download 中に RasPI に火を入れてシリアル接続しようとするとどうも情報の送受信が微妙であることが判明。SDCard に raspbian を再度導入すべく。

$ sudo dd bs=4M if=./2014-01-07-wheezy-raspbian.img of=/dev/sdc

で、再確認してみるにこれはシリアル接続が微妙なのだな。そして原因も分からぬまま解決。シリアル接続が問題だったのは間違いないのですがorz

pi ユーザで login して

$ zcat /proc/config.gz > ./.config

で shutdown して SD から .config 持ってきます。あとは以下。

$ export CCPREFIX=../tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig

で、menuconfig で以下をナニ。

  • CONFIG_DEBUG_INFO=y
  • CONFIG_KGDB=y
  • CONFIG_KGDB_SERIAL_CONSOLE=y

どこにあるのやら。Kernel hacking かな。とりあえず CONFIG_KGDB は y デフォルトで y になっている模様。CONFIG_KGDB_SERIAL_CONSOLE も y でした。

CONFIG_DEBUG_INFO は not set とのこと。どこだろ。.config によれば

  • Kernel hacking の中
  • Compile-time checks and compiler options の中

みたい。これを y にしてその中の Reduce debugging information も一応 y にしておきます。

で、build ですね。

$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j3

ちょっと弱いですがリソース貧弱なマシンなので。これで暫く様子見。そして build 終わったので module 作って云々。

$ mkdir ../tmp
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules -j3
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=../tmp modules_install -j3

で、RasPI にはメディア経由で送付します。コピィが済んだら umount して RasPI 起動。そしてコピィした

  • lib/firmware
  • lib/modules
  • zImage

をバックアップしつつコピィ。そして再起動。どうなるか。

なんか起動中にフリーズしてるぞ

[    3.037772] smsc95xx v1.0.4
[    3.101074] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:79:dc:df

これ、eth0 な NIC のドライバなのかな。つうかこれ自体は正常動作なカンジなんですが、次の dwc_otg なるソレが微妙なのかどうか。

つうかそもそもの config によれば gdb できるみたいだったので戻してみるか。

確認したところ

正常に起動。以下あたりが駄目だった模様。

[    3.890856] udevd[156]: starting version 175
[    9.261338] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[    9.886033] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)

ちょっと確認してた部分と違う所だった。ここは別途問題解決な取り組みの時間を確保させて頂きます。

openocd

ええと、dwelch67/raspberrypi からの設定ファイルは取得しています。BakingPi な取り組みで、なのか。

どうも openocd もパケジではなくて自分で build して導入している模様。そして JTAG なソレの結線の仕方を見事に覚えていない。

とりあえず結線して openocd を起動。polling してるの確認。RasPI 電源入れて

$ telnet localhost 4444

してみましたがなんとなく微妙なカンジ。って raspi.cfg 見てみるに

set _TARGETNAME $_CHIPNAME.arm

とかなってますね。結線は正しいと信じて設定確認。

とりあえず

ちょっと時間切れというか

  • gdb が起動しない (libncurses5 が云々
  • raspi.cfg が正しいのかどうかが微妙
  • そもそも openocd の起動でエラーが出てることが判明

というあたりの不具合を何とかしないと駄目だ。

ちょっと進んだ?

ええと、SD Card の /boot な区画について

  • kernel.img は別名で保存
  • raspberrypi/armjtag/armjtag.bin を kernel.img で SD Card の /boot にコピィ

で、起動して openocd 起動したら LED 点滅。telnet したら以下なカンジに。

$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> halt
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x800001d3 pc: 0x0000813c

load_image したいのですがどうすれば、と思ったら kernel.img があるディレクトリで、なのかな。

> load_image kernel.img
3115216 bytes written at address 0x00000000
downloaded 3115216 bytes in 73.897446s (41.168 KiB/s)

ここから gdb が起動しない。libncurses.so.5 が云々。

次の日

gFab で結線からリトライしてるのですが正常動作せず。結線ミスだった模様。kernel.img を load する所までは再現できました。

こうして

> step 0x8190
target state: halted
target halted in ARM state due to single-step, current mode: Supervisor
cpsr: 0x800001d3 pc: 0x00008194
> 

あとは gdb 起動するだけなのですが libncurses5 問題が。とりあえず

$ sudo apt-get install -fy libncurses5:i386

したら違うステイトになりました。

error while loading shared libraries: libpython2.7.so.1.0: wrong ELF class: ELFCLASS64

あ、これって使う gdb が違うのかな。gcc-linaro-arm-linux-gnueabihf-raspbian-x64 のを使ったら

version `GLIBC_2.14' not found

と出た。確認してみるに

$ ls /lib/x86_64-linux-gnu/libc.so.6  -l
lrwxrwxrwx 1 root root 12 Dec 23  2013 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.13.so

とのこと。こりゃ微妙だなぁ。testing にすれば 2.14 以上のが入るのだろうな。

sid な chroot 作ってみる

どんどん脱線しているような気もしますが仕方無い。とりあえず kernel.img が置いてあるディレクトリにて以下。

$ mkdir sid
$ sudo debootstrap sid . http://cdn.debian.or.jp/debian

debootstrap 終わったんですが、これって gdb の中で 5555 なポートに接続できるのだろうか。

そのまた次の日

chroot なソレのためにいくつか初期設定が必要らしい (UbuntuなノートPC上にDebian sidのchroot環境を作る を参考にさせて頂きました)。

  • /etc/fstab の設定追加
  • /etc/resolv.conf の link を chroot の中に
  • /etc/hosts の link を chroot の中に
  • /etc/hostname の link を chroot の中に
  • ユーザとグループの情報
  • /etc/debian_chroot

$ cd sid
$ sudo chroot .

で良いのかどうか。あとは gdb するだけなのかな。ええと、target remote なポートが分からない。3333 とか 6666 とかリスンしてるのですが 3333 で良いのかどうか。

(gdb) target remote :3333
Remote debugging using :3333
0x00008144 in ?? ()

何これ

kernel.img を読み込むと not in executable format って言われるな。

ちょっと今日は限界

手順を控えておきます。

  • 結線
  • openocd 起動
  • telnet localhost 4444 で接続し、halt して load_image kernel.img する
  • sid な chroot に接続 (cd sid && sudo chroot .)
  • $HOME は共有しているので移動して gdb 起動
  • target remote :3333 で接続できているのかどうか

gdb 起動時、あるいは file コマンドなどで実行ファイル (kernel.img) をアレすると叱られてしまうのが今の状況です。

file の出力が以下ですね。

$ file kernel.img 
kernel.img: Linux kernel ARM boot executable zImage (little-endian)

ちょっと一旦ここで中断します。

Comments