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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值