Skip to content

使用 vscode 单步调试内核 f2fs

973字约3分钟

2025-03-16

本文记录了如何使用 vscode 单步断点调试内核 f2fs 的读写路径。

实验部分

使用qemu配合gdb完成对f2fs的调试

  1. 首先下载linux内核源码以及busybox源码
# 下载内核
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.10.163.tar.gz

# 下载busybox
git clone https://github.com/mirror/busybox.git

# 编译busybox
# arm optional
  export ARCH=arm
  export CROSS_COMPILE=arm-linux-gnuabi-


# [if] Make can't find curses.h
sudo apt-get install libncurses-dev

# 修改设置
Busybox Settings --->
	Build Options --->
		[*] Build BusyBox as a static binary (no shared libs)

# 完成编译
make install

# 把busybox中生成的_install目录拷贝到linux解压后的目录中
sudo mkdir etc
sudo mkdir dev
sudo mkdir mnt
sudo mkdir –p etc/init.d/

# 在_install /etc/init.d/目录下创建rcS文件,写入如下内容

#!/bin/sh
mkdir –p /proc
mkdir –p /tmp
mkdir -p /sys
mkdir –p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev –s

# 给rcS最高权限
sudo chmod 777 rcS

# 在 _install的etc目录下创建fstab文件并写入如下内容
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0

# 在_install /etc目录下创建inittab文件并写入如下内容:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

# 在_install dev目录下创建设备节点
sudo mknod console c 5 1
sudo mknod null c 1 3

首先是进入linux源码目录,然后通过menuconfig配置qemu运行参数:

$ export ARCH=arm
$ export CROSS_COMPILE= arm-linux-gnueabi-
$ export make vexpress_defconfig
$ make menuconfig

进入menuconfig界面以后,修改几个内核选项: 第一个是修改initramfs的位置,即_install目录,这样系统就会将_install目录作为启动的根目录,还需要把boot option的command string清空。

General setup --->
	[*] Initial RAM filesystem and RAM Disk (initramfs/initrd) support
		(_install) Initramfs source file(s)
Boot options -->
	()Default kernel command string

第二个选项是内存选项,配置 memory split 为“3G/1G user/kernel split”以及打开高端内存。

Kernel Features --->
	Memory split (3G/1G user/kernel split) --->
	[ *] High Memory Support

然后就可以开始编译内核:

make bzImage –j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make dtbs
vim .config

清空 "debian/canonical-certs.pem"
  1. F2FS工具的准备 主要使用到用于格式化的mkfs.f2fs工具,ubuntu下可以执行以下命令进行安装
sudo apt-get install f2fs-tools
  1. 编译可运行F2FS的内核 经过上述步骤的编译,会在Linux的根目录生成一个.config文件,打开这个文件,找到以下的内核选项,并设置为y。
CONFIG_F2FS_FS=y
CONFIG_F2FS_STAT_FS=y
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_FS_POSIX_ACL=y

# gdb调试信息
CONFIG_GDB_SCRIPTS=y

# debug信息
CONFIG_DEBUG_INFO=y

# 要先把performance那个选项关了再开这个保证Os编译优化
CONFIG_CC_OPTIMIZE_FOR_SIZE=y

记得要打开gdb调试的内核编译选项以及把编译优化参数设置为Os否则会有很多变量被优化掉 然后重新编译

make -j 4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- bzImage
make dtbs

编译结束后,创建一个文件作为F2FS的磁盘空间

dd if=/dev/zero of=a9rootfs.f2fs bs=1M count=250 # 创建250MB的F2FS空间
mkfs.f2fs a9rootfs.f2fs #使用F2FS格式化工具进行格式化

接下来,通过执行如下命令启动Qemu虚拟机,需要使用-sd选项将刚刚创建的作为F2FS磁盘空间的文件挂载到系统中:

qemu-system-arm  \
        -M vexpress-a9 \
        -m 512M \
        -kernel /home/lhuan/kernels/linux-5.10.163/arch/arm/boot/zImage \
        -dtb /home/lhuan/kernels/linux-5.10.163/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
        -nographic \
        -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" \
        -sd a9rootfs.f2fs \
        -s \
        -S

最后,Qemu完成启动之后,在Qemu的linux系统执行如下命令将F2FS挂载到linux中:

mount -t f2fs /dev/mmcblk0 /mnt/ -o loop

最终使用vscode打开该项目,创建.vscode目录并设置launch.json文件


{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "kernel debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/vmlinux",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath":"/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234"
        }
    ]

}

之后就可以在vscode中打断点查看调试信息了。

过程有点延迟,大概 1-2 s 才能到代码断点。