搭建基于qemu的linux开发环境
在某些情况下,如果我们没有Mini2440开发板,或者开发板某些硬件损坏了,这时候我们还要继续学习linux内核移植和驱动开发,我们应该怎么办,这里我们可以采用qemu搭建linux开发环境。
在之前的u-boot系列博客中我们已经介绍了u-boot的移植、以及linux内核移植、根文件系统制作。并且尝试将编译后的程序烧录到开发板中运行。而这一节我们将尝试在qemu上搭建这一套开发环境。
由于我们要使用qemu模拟一个开发板,在安装了qemu之后,在系统环境下输入: qemu-system-arm -M help 可以查看qemu支持的ARM平台的开发板的型号,如下图所示:
这里是没有smdk2440这块板子的,结合一下网上的资料后发现 有关 vexpress-a9 的资料和讨论最多,所以我们选择这个开发板来进行模拟。
一、准备工作
1.1 qemu介绍
qemu 是一个硬件虚拟化程序( hypervisor that performs hardware virtualization),与传统的 VMware / VirtualBox 之类的虚拟机不同,它可以通过 binary translation 模拟各种硬件平台(比如在 x86 机器上模拟 ARM 处理器)。而 VirtualBox 等更多是通过虚拟化来进行资源隔离,以便在其上运行多个 guest os。
基于 qemu 的硬件模拟能力,我们可以轻松搭建指定硬件平台的运行实验环境。
qemu 与 VirtualBox 另一个不同点在于,在 VirtualBox 上必须安装一个完整的操作系统套件,而通过 qemu 我们可以通过参数直接启动到一个裸的 Linux Kernel,连 bootloader 都不需要关心。在此之外,按需配置相关工具套件与启动好的 Kernel 一起工作即可。
qemu 提供的这种高度可定制化的白盒能力,使得我们可以按需构建快速、轻量级的开发环境,提供流畅的开发体验。
1.2 安装qemu
在ubuntu环境下安装qemu:
sudo apt install qemu
二、编译linux内核
2.1 编译配置
这里我们使用linux-5.2.8源码,执行如下命令:
cd /work/linux-5.2.8 #源码放在这个路径 make ARCH=arm vexpress_defconfig
配置完成后相应的配置项会保存在 .config 文件中。下一次执行 make menuconfig 时可以 load 这份配置文件,在此基础上进行修改。
进入菜单配置,进行以下设置:
make ARCH=arm menuconfig
System Type -->
- [ ] Enable the L2x0 outer cache controller 取消该选项,否则qemu运行不起来
Kernel Features -->
- [*] Use the ARM EABI to compile the kernel 确保该选项被选择
2.2 编译内核和模块
编译内核镜像时,执行:
make ARCH=arm CROSS_COMPILE=arm-linux-
编译成功后,arch/arm/boot目录下生成内核镜像文件zImage。
同时在路径下生成设备树文件:arch/arm/boot/dts/vexpress-v2p-ca9.dtb
需要注意编译linux内核使用的是arm-linux-gcc4.6.4。
2.3 运行测试
编译好内核以后,我们就可以使用qemu启动内核了。只需要使用-kernel参数告诉qemu内核文件的位置即可:
qemu-system-arm \ -M vexpress-a9 \ -m 512M \ -kernel /work/linux-5.2.8/arch/arm/boot/zImage \ -dtb /work/linux-5.2.8/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ -nographic \ -append "console=ttyAMA0"
-m指定内存大小;
-kernel:指定内核文件路径;
-nographic: 不使用图形界面,只使用串口;
-dtb: 指定dtb文件路径;
-append :内核启动参数,这里是告诉内核运行的串口设备是什么;
也可以使用 qemu-system-arm --help 来查看其他参数的使用说明。
不出意外的话,就可以在启动窗口中看到内核的启动日志了。在内核启动的最后,会出现一条 panic 日志:
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
从日志内容可以看出,内核启动到一定阶段后尝试加载根文件系统,但我们没有指定任何磁盘设备,所以无法挂载根文件系统。
而且编译出来的内核模块现在也没有用上,内核模块也需要存放到文件系统中供内核需要的时候进行加载。
所以,接下来需要制作一个磁盘镜像文件供内核作为根文件系统加载。
注意:如果需要退出qemu:在qemu中输入ctrl+a 抬起后,再输入’x’。
三、根文件系统制作
根文件系统的制作,需要使用busybox工具,参考之前的文章Mini2440之yaffs2根文件系统移植,按照这篇文章的前两节进行操作,生成rootfs文件夹即可:
制作SD卡镜像:
cd /work/sambashare
dd if=/dev/zero of=rootfs.ext4.img bs=1M count=32
此时会在当前路径下生成rootfs.ext4.img文件:
-rw-r--r-- 1 root root 33554432 2月 8 22:24 rootfs.ext4.img
显然,rootfs.ext4.img并不是真正的SD卡设备,它只是我们在磁盘上创建的一个文件(为qemu创建的虚拟SD卡)。
接下来我们会假装它是一张SD卡,并正儿八经的对其进行格式化、挂载等操作。先将它按照ext4文件系统格式进行格式化:
mkfs.ext4 rootfs.ext4.img
成功后显示如下:
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-02-08 Ant Design Pro V5开发指南
2021-02-08 es6之async和await