一、編譯qemu
(1) 獲取qemu源碼
從qemu官網獲取源碼tar包即可,下面以5.2.0的源碼為例。
(2)解壓源碼
xz -d qemu-5.2.0.tar.xz
tar -xf qemu-5.2.0.tar
(3)進入qemu源碼目錄
cd qemu-5.2.0
(4)配置編譯選項
(x86架構)./configure --target-list=x86_64-softmmu --enable-debug --extra-ldflags='-ldl -Wl,-E'
(arm架構)./configure --target-list=aarch64-softmmu --enable-debug --extra-ldflags='-ldl -Wl,-E' --enable-kvm --enable-virtfs
(5)開始編譯
make -j
編譯產物在build目錄下。
二、使用busybox構建文件系統
(1) 獲取源碼
從busybox官網獲取最新源碼,下面以 1.36.1 版本為例。
(2) 解壓后進入源碼根目錄執行以下命令
tar -xf busybox-1.36.1.tar.bz2 && cd busybox-1.36.1
make menuconfig (具體配置參考【busybox配置】)
make
make install
(3) 在 _install 目錄下添加以下文件
etc/init.d/rcS
etc/fstab
etc/inittab
其中 etc/init.d/rcS 的內容如下:
#!/bin/sh
/bin/mount -a
/sbin/mdev -s
etc/fstab 的內容如下:
proc /proc proc nodev 0 0
sysfs /sys sysfs nodev 0 0
debugfs /sys/kernel/debug debugfs nodev 0 0
tc/inittab 的內容如下:
::sysinit:/etc/init.d/rcS
console::respawn:-/bin/sh
(4) 在 _install 目錄下創建必要的目錄
mkdir proc sys tmp
(5) 在 _install 目錄下打包 initramfs 文件系統
find . | cpio -o -H newc | gzip -9 > ../initramfs_simple.gz
【busybox配置】
(1) 靜態鏈接
進入 Settings ,選擇 Build static binary (no shared libs),即
(2) 指定自定義的庫路徑
進入 Settings -> Additional LDFLAGS
在文本框內輸入庫路徑,例如自己編譯的 glibc 庫
-B /home/ctyun/.local/lib
三、使用qemu 啟動內核
以 x86 架構為例,把待調試的內核 vmlinuz-5.10.0-136.12.0.90.ctl3.x86_64 和文件系統 initramfs_simple.gz 傳給 qemu,具體啟動內核的命令如下:
./qemu-system-x86_64 \
-M pc -nographic \
-L ./pc-bios -gdb tcp::1234 -smp 1 -m 2048 \
-append " console=tty0 console=ttyS0 nokaslr " \
-initrd initramfs_simple.gz \
-kernel vmlinuz-5.10.0-136.12.0.90.ctl3.x86_64
此后qemu 的 gdbserver 就會監聽 1234 端口,隨時等待調試客戶端接入。
四、常用的調試方法
【調試內核】
(1) 向 gdb 傳入 kernel-debuginfo 包里的 vmlinux 符號:
gdb /path/vmlinux
(2) 連接到arm服務器。假設IP是x.x.x.x,由于端口已確定為1234,則可執行以下命令:
target remote x.x.x.x:1234
(3) 在內核啟動處加斷點
hbreak start_kernel
(4) 繼續啟動內核:輸入 c 并回車
后續操作基本上與 gdb 調試用戶態程序的方法一致。
【調試內核ko模塊】
在insmod xxxx.ko 后想調試這個ko的運行代碼,那么可以按以下方法進行。
1)查看ko的各section的 addr
有2種方法.
1)方法1:在gdb里打印各section的 addr
以act_ct.ko為例。
首先用readelf -S命令查看act_ct.ko的.text .data .bss的索引,
假設查到的是1、27、33,
然后在do_init_module打斷點,斷住后執行以下命令:
p /x mod->sect_attrs->attrs[1]->address
p /x mod->sect_attrs->attrs[15]->address
p /x mod->sect_attrs->attrs[18]->address
注:不同ko的.data .bss在attrs里的索引可能不同,可通過如下命令逐一確認:
p mod->sect_attrs->attrs[x]->name
2)方法2:i在OS的shell里通過sysfs文件來查看
假設要看act_ct.ko的.text .data .bss段的 addr,那么依次執行以下命令:
cat /sys/module/act_ct/sections/.text
cat /sys/module/act_ct/sections/.data
cat /sys/module/act_ct/sections/.bss
(2) 添加 ko符號
利用上一步查到的 addr,執行以下命令:
add-symbol-file act_ct.ko [text addr] -s .data [data addr] -s .bss [bss addr]
這樣就可以添加斷點調試了。