type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
0 准备操作
1 编译环境准备
一个最小可运行 Linux 操作系统需要内核镜像 bzImage 和 rootfs ,本文整理了其制作、安装过程,调试命令,以及如何添加共享磁盘。
我的开发环境为 Arch linux,具体的宿主机内核编译环境可以参考下面的文章。
2 内核源码准备
你可以选择直接去 https://www.kernel.org/ 下载压缩包,也可以之间克隆一个。
1 配置并编译内核
1 配置内核选项
在配置菜单中,启用内核debug,关闭地址随机化,不然断点处无法停止。
2 编译内核
开始编译内核,-j 指定并行编译作业数。最终生成
/path/to/your/kernel/code/arch/x86_64/boot/bzImage
文件。2 配置 Busybox
启动内核还需要一个具有根文件系统的磁盘镜像文件,根文件系统中提供可供交互的shell程序以及一些常用工具命令。我们借助busybox工具来制作根文件系统。
busybox 官网如下,最近版本为 BusyBox 1.36.1 (stable)
1 下载并解压
2 把 busybox 配置为静态编译
3 编译 busybox
3 制作 rootfs
接下来制作rootfs镜像文件,并把busybox安装到其中。
使用dd命令创建文件,并格式化为ext4文件系统。
创建用于挂载该镜像文件的目录
rootfs
,挂载后才能往里面写入 busybox。使用 mount 命令将
rootfs.img
挂载到 rootfs
目录,编译 busybox 并写入 rootfs
目录中。对写入的busybox进行补充配置。
最后,卸载rootfs.img
至此,一个带有rootfs的磁盘镜像制作完成。
4 启动qemu
使用如下命令启动无GUI的qemu,参数含义如下:
-kernel # 指定编译好的内核镜像 -hda # 指定硬盘 -append "root=/dev/sda" 指示根文件系统 console=ttyS0 把QEMU的输入输出定向到当前终端上 -nographic 不使用图形输出窗口 -s 是-gdb tcp::1234缩写,监听1234端口,在GDB中可以通过target remote localhost:1234连接
启动后如下图:
Ctrl+A 松开后按C退出qemu。
5 内核函数调试
启动命令中添加-s参数与-S参数启动qemu。
- 这个时候 qemu 终端会卡住
- 启动 gdb ,开启调试即可
至此,完成了qemu环境下使用gdb进行内核函数的调试。
6 添加共享磁盘
有时候需要在宿主机和qemu虚拟机之间共享文件,添加一个共享磁盘将有助于该项工作。
创建64MB磁盘镜像文件,并格式化为ext4,作为共享磁盘备用。
修改qemu启动命令,使用-hdb增加一个磁盘。
进入qemu系统后使用mount命令挂载sdb到mnt目录。
在原系统中挂载ext4.img,实现qemu与原系统的文件共享。
至此,可以在宿主机器share目录下,与qemu中的虚拟机器进行文件共享。
7 参考资料
- Author:tangcuyu
- URL:https://expoli.tech/articles/2023/07/05/QEMU-debugging-Linux-kernel-environment-construction
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts