カーネル開発デバッグ環境の構築

2514 ワード

暇な時、カーネル開発デバッグ環境の構築過程を総括して、私と同じカーネル初心者たちに役に立つことを望んでいます.

イニシアチブ


私のテストシステムはQEMUで実行され、HostとGuestのアーキテクチャはx 86_です.64は、Busyboxで生成するinitrdをルートファイルシステム、KGDBをデバッガとする.

カーネルの生成


カーネルの中で開く必要がある選択肢はCONFIG_EXPERIMENTALCONFIG_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 vmlinuxvmlinuxが非圧縮カーネルである.そしてtarget remote localhost:1234kgdbを接続する.
次に普通のgdbと大きな違いはありません.例えばsched_clock関数でブレークポイントを設定break sched_clock continue運転を続け、ブレークポイントに達したらjiffies_を印刷64変数print jiffies_64など.
また、運転中にテストシステムで実行することができるecho g > /proc/sysrq-triggergdbに制御権を再取得させる.

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

http://adam8157.info/blog/2012/04/setup-kernel-developing-environment/