自宅にて。
以下を参考にしつつすすめます。
とりあえず 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)
ちょっと一旦ここで中断します。