那么假设你现在已经可以正常的编译安装内核并且可以用LSM输出调试信息,并且已经在尝试添加一些实质性的功能
很快你就会发现一个问题,那就是每次代码改动都需要安装内核然后重启才可以看到代码改动的效果,这无疑是一个及其浪费时间的步骤
这就是本篇文章的重点了——QEMU内核调试
先列出自学/参考文章
简单来说,QEMU就是一个功能强大的虚拟机
可以直接用apt安装
sudo apt-get install qemu
然后使用对应的内核框架启动,比如我编译的内核源码是x86_64,那我的启动命令就是qemu-system-x86_64 xxxxxx
虚拟机运行之前肯定需要安装操作系统,我使用的是Ubuntu和Debian
下载的时候可以创建一个镜像文件作为虚拟机操作系统的文件系统
# 创建一个镜像文件,大小为40G,名为ubuntu.img
qemu-img create ubuntu.img 10G
下载好之后,在镜像所在文件运行命令
qemu-system-x86_64 -m 4G -smp 6 -drive file=ubuntu.img,format=raw -enable-kvm
参数的介绍在后面
等待安装完成之后这也只是一个普通的操作系统,一点调试的便利也没有提供,这就要引出下面的几个参数了
-kernel
: 使用指定的内核镜像文件启动虚拟机。
-append
: 向内核传递命令行参数。
通过-kernel
和-append
选项将可以快速的更换内核进行测试,直接附上我常用的命令参数
qemu-system-x86_64 -m 4G -smp 6 -enable-kvm -drive file=/home/lostsheep/Competition/qemu/ubuntu.img,format=raw -net user,hostfwd=tcp::2222-:22 -net nic -kernel /home/lostsheep/Competition/linux/arch/x86_64/boot/bzImage -append "root=/dev/sda2 ro console=ttyS0" -nographi
统一介绍一下:
qemu-system-x86_64
:启动 QEMU 虚拟机管理程序的命令,用于模拟 x86_64 架构的计算机。
-m 4G
:指定虚拟机的内存大小为 4 GB。-m 后面可以跟不同的值,例如 4G 表示 4 GB。
-smp 6
:设置虚拟机的 CPU 核数。-smp 6 表示虚拟机将使用 6 个虚拟 CPU 核。
-enable-kvm
:这个参数启用 KVM (Kernel-based Virtual Machine) 加速功能,前提是主机支持 KVM。启用 KVM 可以显著提高虚拟机的性能,因为它允许虚拟机直接利用硬件虚拟化特性。
-drive file=/home/lostsheep/Competition/qemu/ubuntu.img,format=raw
:这里指定了虚拟机的硬盘镜像文件及其格式:
file=/home/lostsheep/Competition/qemu/ubuntu.img 指定了硬盘镜像文件的路径。
format=raw 指定镜像文件的格式为 RAW 格式。如果镜像文件是其他格式(例如 qcow2),则需要相应地修改格式参数。
-net user,hostfwd=tcp::2222-:22
和 -net nic
:用于配置网络:
-net user 启用用户模式网络堆栈。
hostfwd=tcp::2222-:22 将主机的 2222 端口转发到虚拟机的 22 端口,这样可以通过 ssh -p 2222 连接到虚拟机。
-net nic 创建一个网络接口卡 (NIC)。
-kernel /home/lostsheep/Competition/linux/arch/x86_64/boot/bzImage
:
使用指定的内核镜像文件启动虚拟机。
/home/lostsheep/Competition/linux/arch/x86_64/boot/bzImage 是内核镜像文件的路径。
-append "root=/dev/sda2 ro console=ttyS0"
:向内核传递命令行参数:
root=/dev/sda2 指定根文件系统所在的设备。
ro 表示以只读方式挂载根文件系统。
console=ttyS0 指定使用串行控制台 ttyS0,这样可以通过 QEMU 的串行端口查看启动信息。
-nographic
:禁用图形输出,使 QEMU 不创建图形窗口。所有的输入输出都通过终端进行,适合在没有 GUI 环境的服务器上运行。
把这段命令写成一个脚本文件,这样每次改动代码之后只需要编译后,执行这段命令就可以查看效果了
我使用ssh连接纯属个人习惯,这个参数可以根据喜好添加
使用shell的原因是因为我虚拟机不使用图形化界面,Linux自带的终端不支持中文显示,把终端输出到控制台的话会有一些小bug,所以才采用了ssh这种方式