カーネル開発デバッグ環境の構築
2514 ワード
暇な時、カーネル開発デバッグ環境の構築過程を総括して、私と同じカーネル初心者たちに役に立つことを望んでいます.
私のテストシステムはQEMUで実行され、HostとGuestのアーキテクチャはx 86_です.64は、Busyboxで生成するinitrdをルートファイルシステム、KGDBをデバッガとする.
カーネルの中で開く必要がある選択肢は
Busyboxの
または
2番目のコマンドはKGDBを開き、GuestシステムのシリアルポートをHostシステムの1234ポートにマッピングし、起動中にgdbの接続を待つ.
カーネルがKGDBを開く場合、実行
次に普通のgdbと大きな違いはありません.例えばsched_clock関数でブレークポイントを設定
また、運転中にテストシステムで実行することができる
ついでにgithubにプロジェクトを建てて、自動的にカーネル開発のデバッグ環境全体を構築することができて、詳しくはREADMEを参照してください.
http://github.com/adam8157/kernel-studio
Posted by Adam Lee Apr 5th, 2012
イニシアチブ
私のテストシステムはQEMUで実行され、HostとGuestのアーキテクチャはx 86_です.64は、Busyboxで生成するinitrdをルートファイルシステム、KGDBをデバッガとする.
カーネルの生成
カーネルの中で開く必要がある選択肢は
CONFIG_EXPERIMENTAL
、CONFIG_DEBUG_INFO
、 CONFIG_KGDB
およびCONFIG_KGDB_SERIAL_CONSOLE
、同時に閉じる必要があるCONFIG_DEBUG_RODATA
オプションである.そしてmake bzImage
生成カーネルをコンパイルする.具体的なオプションの意味はカーネルドキュメントをひっくり返すことができて、ここでくどくどしません.ルートファイルシステムの生成
Busyboxの
CONFIG_STATIC
およびCONFIG_INSTALL_NO_USR
オプションを開き、make
およびmake install
コンパイルして生成し、次の手順を参照してinitrdルートファイルシステムを作成します.mkdir temp && cd temp
#
mkdir -p dev etc/init.d mnt proc root sys tmp
chmod a+rwxt tmp
cp -rf ../busybox/_install/* ./
#
cat << EOF > etc/fstab
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
EOF
cat << EOF > etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
EOF
cat << EOF > etc/init.d/rcS
#!bin/sh
/bin/mount -a
# mdev
/sbin/mdev -s
EOF
chmod 755 etc/init.d/rcS
find ./ | cpio -o -H newc | gzip > ../rootfs.img
QEMUの起動
qemu-system-x86_64 -kernel kernel.img -append \
"root=/dev/ram rdinit=/sbin/init" -initrd rootfs.img
または
qemu-system-x86_64 -kernel kernel.img -append \
"root=/dev/ram rdinit=/sbin/init kgdboc=ttyS0,115200 kgdbwait" \
-initrd rootfs.img -serial tcp::1234,server
2番目のコマンドはKGDBを開き、GuestシステムのシリアルポートをHostシステムの1234ポートにマッピングし、起動中にgdbの接続を待つ.
gdbの起動
カーネルがKGDBを開く場合、実行
gdb vmlinux
vmlinuxが非圧縮カーネルである.そしてtarget remote localhost:1234
kgdbを接続する.次に普通のgdbと大きな違いはありません.例えばsched_clock関数でブレークポイントを設定
break sched_clock
、 continue
運転を続け、ブレークポイントに達したらjiffies_を印刷64変数print jiffies_64
など.また、運転中にテストシステムで実行することができる
echo g > /proc/sysrq-trigger
gdbに制御権を再取得させる.For怠け者
ついでにgithubにプロジェクトを建てて、自動的にカーネル開発のデバッグ環境全体を構築することができて、詳しくはREADMEを参照してください.
http://github.com/adam8157/kernel-studio
git clone git://github.com/adam8157/kernel-studio.git
Posted by Adam Lee Apr 5th, 2012