本期主题:
讲解一下qemu这个工具的使用,并且记录了qemu模拟A9处理器,启动Linux的全过程
往期链接:
- linux设备驱动中的并发
- 操作系统中的多线程问题——原子操作、自旋锁的底层实现
- 操作系统并发控制——使用互斥锁实现同步
qemu使用
- 1. qemu是什么
- 2. 操作流程
- 1. 安装qemu
- 2.安装交叉编译环境
- 3.linux源码下载并编译
- 下载linux源码
- 编译linux
- 4.文件系统构建
- initramfs
- busybox
- busybox获取及编译
- 打包镜像
- 5.启动
1. qemu是什么
网上定义:
QEMU(Quick Emulator)是一个开源的虚拟化软件,它可以模拟不同架构的硬件平台并运行虚拟机。QEMU 支持多种操作系统和硬件架构,包括 x86, ARM, PowerPC, MIPS 等,广泛用于嵌入式系统开发、操作系统测试、虚拟化环境等场景。
个人理解:
一句话描述,就是qemu是一个可以虚拟成硬件的软件,能在上面运行各种操作系统。
2. 操作流程
1. 安装qemu
sudo apt intall qemu
输入qemu看是否会补齐,出现下面的内容
2.安装交叉编译环境
sudo apt-get install gcc-arm-linux-gnueabi
同样可以使用 arm-linux-gnueabi-gcc -v 看看是否安装成功以及版本信息
3.linux源码下载并编译
下载linux源码
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.7.tar.xz
tar xvf linux-4.14.7.tar.xz
编译linux
#menuconfig中确保打开了ramfs相关的支持项
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)
menuconfig中配置的位置
生成镜像的位置在:
- zImage,前面Linux内核生成的内核镜像,a9生成的在 ./arch/arm/boot/zImage
- dtb(设备树文件),也跟着前面一起生成了,arch/arm/boot/dts/vexpress-v2p-ca9.dtb
4.文件系统构建
initramfs
我们这里使用initramfs
initramfs(Initial RAM Filesystem)
initramfs 是一个临时的根文件系统,它位于系统启动的早期阶段,通常加载到内存中,用于支持内核的初始化过程。
initramfs 并不包含完整的操作系统文件,而是提供启动所需的最小文件集和驱动程序,以便完成内核和硬件的初始化。它是一个内存文件系统,通常用于加载系统的核心模块、驱动程序、挂载最终的根文件系统(rootfs)等。
- 先建立一个initramfs文件夹,里头创建一些目录
mkdir -p initramfs/{bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
- 创建initramfs/init脚本,并且添加可执行权限,这个是必须要的
#!/bin/sh
echo "Booting into initramfs..."
mount -t proc none /proc
mount -t sysfs none /sys
exec /bin/sh
chmod +x initramfs/init
initramfs目录弄完之后应该是这样的状态:
busybox
BusyBox 是一个面向嵌入式系统的多功能工具箱。它将许多常用的 UNIX 工具整合到一个可执行文件中,提供了简化的功能版本,同时占用更少的存储和资源。
BusyBox 是 initramfs 中常用的工具集,主要原因是它轻量化且功能齐全,适合在资源受限的环境中提供基本功能。
busybox获取及编译
- 获取busybox
wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
tar -xf busybox-1.36.0.tar.bz2 - 编译busybox
-
make menuconfig
选择静态编译选项,这样编出来的busybox就是static link的文件,不需要再copy一些so过去
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)
进行编译,但是这里编译会有一个报错,但是似乎不影响最终结果,busybox文件也能生成
3. 进行busybox install
就是把刚刚一些生成的文件放到initramfs目录下
这个时候再看initramfs目录,和前面对比就多了很多东西
打包镜像
cd initramfs
find . | cpio -o --format=newc | gzip > ../initramfs.cpio.gz
cd ..
5.启动
启动命令:
qemu-system-arm -M vexpress-a9 -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb -initrd ~/Workspace/os/qemu/initramfs.cpio.gz -append "console=ttyAMA0 init=/init debug" -nographic
启动成功: