使用 vscode 单步调试内核 f2fs
973字约3分钟
2025-03-16
本文记录了如何使用 vscode 单步断点调试内核 f2fs 的读写路径。
实验部分
使用qemu配合gdb完成对f2fs的调试
- 首先下载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"
- F2FS工具的准备 主要使用到用于格式化的mkfs.f2fs工具,ubuntu下可以执行以下命令进行安装
sudo apt-get install f2fs-tools
- 编译可运行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 才能到代码断点。