从0开始使用QEMU模拟ARM开发环境之脚本制作分区镜像(rootfs+zImage+dtb)

从0开始使用QEMU模拟ARM开发环境系列一览表

文章中 u-boot、zImage 、qemu相关 参看

从0开始使用QEMU模拟ARM开发环境系列一览表

目录结构:

在这里插入图片描述

脚本介绍:

分区镜像制作脚本

make_img.sh

#!/bin/bash

if [ "$1" ];then
    echo $1
else
    echo "请传入根文件系统压缩包"
    exit 1
fi

# 目录与文件名
xdir='/tmp/sdir'
p1='/tmp/p1'
p2='/tmp/p2'
rootfs='rootfs.ext4'

# 先删除
sudo 
<think>好的,用户现在想了解如何编译Linux内核5.9.6版本,并用QEMU模拟ARM开发板进行驱动开发学习。我需要先回顾之前的对话历史,看看有没有相关信息可以参考。之前用户问过关于内核配置中修改ARM架构兼容性的问题,所以可能已经有一定的背景知识,比如配置内核选项、交叉编译工具链的使用等。 首先,用户的目标是编译特定版本的内核,然后使用QEMU模拟ARM环境进行驱动开发。这需要确保内核版本5.9.6的源码可用,并且QEMU支持对应的ARM开发板模拟。可能需要检查该内核版本是否兼容QEMU的某些板子,比如vexpress-a9或versatilepb,这些都是常用的模拟板。 接下来,我需要考虑用户可能的背景。用户可能刚开始学习内核驱动开发,对交叉编译、QEMU使用还不熟悉。因此,步骤需要详细,特别是环境搭建部分,比如安装依赖包、交叉编译工具链、QEMU本身等。同时,用户可能需要知道如何获取正确版本的内核源码,可能需要使用wget或者git,但5.9.6是一个较旧的版本,可能需要从kernel.org的存档下载。 然后,配置内核时,用户需要指定ARCH=arm使用交叉编译工具链。这里可能需要提醒用户安装正确的工具链,比如gcc-arm-linux-gnueabihf。此外,在menuconfig中,确保配置支持对应的ARM板,可能需要选择对应的SOC类型,比如vexpress,同时启用必要的驱动和模块支持,比如网络驱动、文件系统支持等,方便后续测试。 编译完成后,用户需要生成zImagedtb文件,用于QEMU启动。同时,创建根文件系统,用户可能不熟悉如何制作initramfs或者使用busybox,所以需要详细说明步骤,或者提供替代方法,比如使用预先构建的文件系统镜像。 在QEMU启动命令中,需要指定正确的机器类型、内核镜像、设备树文件、内存大小,以及根文件系统的位置。如果用户需要网络支持,可能还需要配置虚拟网络设备,比如tap设备,并启用网络驱动。 驱动开发部分,用户可能需要一个简单的示例,比如字符设备驱动,包括编写代码、Makefile,以及测试步骤。需要确保编译驱动时使用正确的内核源码路径和架构。测试时,通过insmod加载模块,查看输出,可能需要QEMU的控制台或者串口输出来调试。 潜在的问题可能包括内核版本过旧导致的依赖问题,工具链不兼容,QEMU启动参数错误,根文件系统无法挂载等。需要提醒用户注意版本匹配,检查错误日志,逐步验证每个步骤。 用户可能没有提到的深层需求是希望有一个可重复、隔离的环境进行驱动开发,避免影响宿主机系统。因此,使用QEMU模拟是非常合适的,但需要确保整个流程清晰,用户能够顺利启动模拟环境并进行测试。 总结来说,回答需要分步骤详细说明环境搭建、内核编译、QEMU配置、根文件系统准备、驱动编写和测试,同时提供常见问题的解决方法,确保用户能够一步步完成操作,并理解每个步骤的作用。</think>以下是编译 Linux 5.9.6 内核并使用 QEMU 模拟 ARM 开发板进行驱动开发学习的完整流程: --- ### **1. 环境准备** #### **1.1 安装依赖** ```bash # Ubuntu/Debian 系统 sudo apt update sudo apt install -y git build-essential gcc-arm-linux-gnueabihf qemu-system-arm libssl-dev bison flex libncurses-dev ``` #### **1.2 获取内核源码** ```bash wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.6.tar.xz tar -xvf linux-5.9.6.tar.xz cd linux-5.9.6 ``` --- ### **2. 配置内核** #### **2.1 选择默认配置** 使用 `vexpress_defconfig`(QEMU 支持的 ARM 开发板): ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig ``` #### **2.2 可选:自定义配置** 启动图形化配置界面: ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig ``` **关键配置项**: - **启用模块支持**:确保 `Enable loadable module support` 已开启。 - **调试支持**:在 `Kernel Hacking` 中启用 `Kernel debugging` 和 `Compile the kernel with debug info`。 - **驱动支持**:根据需要启用串口、网络、块设备等驱动(默认 `vexpress_defconfig` 已包含基础支持)。 --- ### **3. 编译内核** ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-j$(nproc) ``` 编译完成后生成文件: - **内核镜像**:`arch/arm/boot/zImage` - **设备树文件**:`arch/arm/boot/dts/vexpress-v2p-ca9.dtb` --- ### **4. 创建根文件系统** #### **4.1 使用 BusyBox 构建最小文件系统** ```bash # 下载并编译 BusyBox wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2 tar -xvf busybox-1.36.1.tar.bz2 cd busybox-1.36.1 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # 可选:启用静态链接 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-j$(nproc) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install ``` #### **4.2 创建 initramfs** ```bash # 创建根文件系统目录 mkdir -p rootfs/{dev,proc,sys,bin} sudo mknod rootfs/dev/console c 5 1 sudo mknod rootfs/dev/null c 1 3 # 复制 BusyBox 文件 cp -r busybox-1.36.1/_install/* rootfs/ # 创建初始化脚本 echo '#!/bin/sh mount -t proc none /proc mount -t sysfs none /sys /sbin/mdev -s exec /bin/sh' > rootfs/init chmod +x rootfs/init # 打包为 initramfs cd rootfs find . | cpio -o -H newc | gzip > ../initramfs.cpio.gz ``` -- ### **5. 启动 QEMU** ```bash qemu-system-M vexpress-a9 \ -m 512M \ -kernel linux-5.9.6/arch/arm/boot/zImage \ -dtb linux-5.9.6/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ -append "console=ttyAMA0 root=/dev/ram rdinit=/init" \ -initrd initramfs.cpio.gz \ -nographic \ -net nic -net user,hostfwd=tcp::2222-:22 # 可选:启用网络 ``` --- ### **6. 驱动开发示例(字符设备驱动)** #### **6.1 编写驱动代码 `hello.c`** ```c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #define DEVICE_NAME "hello" static int __init hello_init(void) { printk(KERN_INFO "Hello, ARM Kernel!\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_INFO "Goodbye, ARM Kernel!\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); ``` #### **6.2 编写 Makefile** ```makefile KDIR ?= /path/to/linux-5.9.6 ARCH ?= arm CROSS_COMPILE ?= arm-linux-gnueabihf- obj-m += hello.o all: make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules clean: make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) clean ``` #### **6.3 编译并测试** ```bash make # 将生成的 hello.ko 复制到 QEMU 虚拟机的根文件系统中 # 在 QEMU 中加载驱动: insmod hello.ko dmesg | tail # 查看输出 ``` --- ### **常见问题** 1. **QEMU 启动失败**: - 检查 `zImage` 和 `dtb` 路径是否正确。 - 确认 `vexpress-a9` 机器类型是否支持。 2. **驱动加载失败**: - 确保驱动编译时使用的内核版本与 QEMU 中运行的内核一致。 - 检查 `printk` 输出是否被重定向到控制台(`console=ttyAMA0`)。 3. **网络配置**: - 若需网络支持,在 QEMU 启动命令中添加 `-net user`,并在内核配置中启用网络驱动。 --- 通过以上步骤,你可以在 QEMU 模拟ARM 环境中进行完整的内核编译和驱动开发学习。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值