1 Linux篇(调试linux)
最新主线版本: https://kernel.org/
2 initrd制作
此处我用的6.6.109版本.
1 | dracut -q --force -i ./package /my --add "busybox kernel-modules-extra kernel-modules rootfs-block" /tmp/bar.img 6.6.109 |
initrd/initramfs 本质上是一个压缩的rootfs镜像(通常是cpio格式),QEMU启动时用 -initrd 传给内核,内核会把它解压到内存里(ramfs/tmpfs),并把它临时挂载为根文件系统 /.
当内核完成自身初始化后,它必须进入用户态,去运行第一个用户进程(PID 1)。这个进程就从根文件系统里找。查找顺序大概是.
如果内核启动参数里写了 rdinit=
,它会在 initrd 文件系统里找这个路径 如果没指定 rdinit=,内核默认会尝试这些路径:
1
2
3
4/init
/sbin/init
/etc/init
/bin/init一旦找到就执行,成为 PID 1.
3 调试方法
首先编译下载完毕的内核, 根据需要进行裁剪.
这里添加一下调试内核模块的方法.
3.1 调试内核模块
1 | # 这里举个例子 |
其中先build将模块信息编译完成,之后 install 到指定的镜像根目录,后面将 ko 模块拷贝到镜像中任意位置处即可调试内核模块.
3.2 x86
client.
1 | # 这里可以不用initrd选项,使用默认的. |
remote.
1 | gdb ./vmlinux |
或者在当前目录下写个 .gdbinit
1 | file ./vmlinux |