QEMU & GDB 调试内核

瘦欲@ 提交于 2020-01-26 18:08:43

简介

本篇文章用来QEMU & GDB 调试内核使用

文件的分布


ROOT=/root/runlinux/Chapter1

ROOTFS=$ROOT/fs
ROOTFS_IMG=$ROOT/rootfs.img
ROOTFS_IMG_MOUNT=/mnt/rootfs

KERNEL_ROOT=$ROOT/linux-4.0
KERNEL_IMG=$KERNEL_ROOT/arch/arm/boot/zImage
KERNEL_DTB=$KERNEL_ROOT/arch/arm/boot/dts/vexpress-v2p-ca9.dtb

编译内核

首先修改Makefile 文件中的架构以及编译工具链

# ARCH		?= $(SUBARCH)
ARCH 		?= arm
# CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%)
CROSS_COMPILE	?= arm-linux-gnueabi-

以及 将 优化等级修改为 -O1

ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS	+= -O1 $(call cc-disable-warning,maybe-uninitialized,)
else
KBUILD_CFLAGS	+= -O1
endif

最开始是想修改为 -O0 的,但是编译出现了问题。就只好修改为 -O1。区别不是太大。

修改config配置

root@zhou 12:03:35 ~/r/C/linux-4.0 # make vexpress_defconfig
root@zhou 12:03:48 ~/r/C/linux-4.0 # make menuconfig
#   Kernel hacking  --->
#       Compile-time checks and compiler options  --->
#           [*] Compile the kernel with debug info

编译

make bzImage -j2
make dtbs

运行

生成最小文件系统的步骤,暂时略过。大致的思路就是,制作一个镜像。然后将其格式化为 一个 ext3的文件系统镜像。其他的格式也可以。

    qemu-system-arm -M vexpress-a9 -smp 4 -m 100M -kernel $KERNEL_IMG \
    -dtb $KERNEL_DTB -nographic \
    -append "root=/dev/mmcblk0 rw rdinit=/linuxrc console=ttyAMA0 loglevel=8 slub_debug kmemleak=on" \
    -sd $ROOTFS_IMG \
    -S -s
    # -S 表示 QEMU 将会冻结虚拟机
    # -s 表示在 1234端口接收 GDB的调试

gdb 开始调试

root@zhou 14:27:57 ~ # apt-get install gdb-multiarch
root@zhou 14:28:06 ~ # cd runlinux/Chapter1/linux-4.0
# 在次文件夹下面拥有 vmlinux  文件
root@zhou 23:47:06 ~/r/C/linux-4.0 # gdb-multiarch vmlinux 
(gdb) set architecture arm
(gdb) target remote localhost:1234
(gdb) b start_kernel

参考资料

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!