欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

qemu+gdb调试linux内核

程序员文章站 2022-07-14 12:37:54
...

博客写作时间: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
相关标签: 内核 内核