天天看點

搭建核心開發調試環境

閑來無事, 總結一下核心開發調試環境的搭建過程, 希望能對和我一樣的核心新手們有所幫助.

方案

我的測試系統在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

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

繼續閱讀