閑來無事, 總結一下核心開發調試環境的搭建過程, 希望能對和我一樣的核心新手們有所幫助.
方案
我的測試系統在QEMU中運作, Host和Guest的架構都是x86_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
第二個指令開啟了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