qemu+gdb调试linux内核
博客写作时间:2020-04-09 17:53
qemu+gdb调试linux内核
参考资料:
环境:
qemu2.12
linux kernel 4.6.2
gdb 7.0
busybox 1.25.0
大部分步骤按照参考资料1执行,步骤如下:
1.安装qemu
# path to qemu
./configure --enable-debug --target-list=x86_64-softmmu
sudo make && make install
2.利用busybox建立最小文件系统
按照静态库安装
# path to busybox
make defconfig
make menuconfig
make && sudo make install
在menuconfig时选择静态编译
—> Busybox Settings —>
—>Build Options —>
[*] Build BusyBox as a static binary (no shared libs)
然后可以验证busybox安装是否正确
./busybox ls
制作initramfs最小文件系统
# 创建ramdisk目录
mkdir ramdisk
# 将busybox的_install下的文件复制到ramdisk中
cp -r /path/to/busybox/_install/* /path/to/ramdisk
# 设置初始化进程init
cd ramdisk
ln -s bin/busybox init
# 设置开机启动顺序,设定程序运行的文件夹
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
# init程序访问 etc/inittab文件,编写inittab,指定开机程序
cd etc
vim inittab
inittab内容:
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
赋予inittab可执行权限
chmod +x inittab
编写/etc/init.d/rcS脚本
mkdir init.d
cd init.d
vim rcS
rcS内容:
#!/bin/sh
mount proc
mount -o remount,rw /
mount -a
clear
echo "My Tiny Linux Start :D ......"
赋予可执行权限:
chmod +x rcS
在rcS脚本中,mount -a会自动挂载/etc/fstab中设置的挂载文件系统,因此需要编写fstab文件设置自动挂载文件系统
cd ramdisk/etc
vim fstab
fstab内容:
# /etc/fstab
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devtmpfs /dev devtmpfs defaults 0 0
将ramdisk压缩成文件镜像:
cd ramdisk
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.img
至此,我们可以先测试一下根文件系统是否正确 initramfs
3.qemu+gdb调试内核
在一个窗口运行:
qemu-system-x86_64 -kernel /usr/src/linux-4.6.2/arch/x86/boot/bzImage -initrd ../initramfs.img -smp 2 -S -s -nographic -append "console=ttyS0"
先使用命令启动qemu。
qemu-system-x86_64的参数比较多,这里简单说下:
-kernel 是指定一个大内核文件,当仁不让的是bzImage。
-initrd 是指定一个 initrd.img文件,这个文件就是我们使用busybox生成的initramfs.img。
-smp 可以从名字猜想,它是给qemu指定几个处理器,或者是几个线程<嗯,大概意思就thread吧>。
-gdb则是启动qemu的内嵌gdbserver,监听的是本地tcp端口1234—如果这样写: -gdb tcp:192.168.1.100:1234 ,似乎也是没问题的。
-S 就是挂起gdbserver,让gdb remote connect it。
-s 默认使用1234端口进行远程调试,和-gdb tcp::1234类似。
-m 2048 指定内存大小为2048M
在另一个窗口用gdb远程连接:
gdb vmlinux
target remote localhost:1234
b start_kernel
c
上一篇: Spark注意事项
下一篇: Linux 进程间通信的一种实现方式