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

QEMU & GDB 调试内核

程序员文章站 2022-07-14 12:40:51
...

简介

本篇文章用来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配置

[email protected] 12:03:35 ~/r/C/linux-4.0 # make vexpress_defconfig
[email protected] 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 开始调试

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

参考资料

相关标签: linux