简介
本篇文章用来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
参考资料
来源:CSDN
作者:qq_38782437
链接:https://blog.csdn.net/qq_38782437/article/details/104086386