目录
qemu
qemu搭建arm环境
程序验证
qemu
qemu是一个虚拟机,或者说是模拟器,它主要对单片机或者嵌入式等常用处理器进行模拟。 qemu是纯软件实现的,有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化以及I/O设备的虚拟化等,但性能非常低,所以通常会配合 KVM 来进行加速。KVM是一个开源的系统虚拟化模块,它使用Linux自身的调度器进行管理,所以其核心源码很少。KVM的虚拟化需要硬件支持,是基于硬件的完全虚拟化,所以KVM和qemu配合使用时,KVM主要负责比较繁琐的 CPU 和内存虚拟化,而 qemu 则负责I/O 或各种硬件的虚拟化。
qemu操作模式:
- 全系统模式:能够在任意支持的架构上为任何机器运行一个完整的操作系统
- 用户模式:能够在任意支持的架构上为另一个不同的架构运行程序
qemu安装(以Ubuntu为例):
#安装qemu
sudo apt install qemu
#若安装结束找不到qemu命令,且/usr/bin和 /bin下没有相关的可执行文件
sudo apt-get install qemu-system
#qemu相关指令
cd /usr/bin 后输入qemu再按tab键得到qemu相关的匹配结果
#查看版本信息
qemu-system-arm -version
#查看帮助信息
qemu-system-arm -h
qemu搭建arm环境
1)查看qemu支持的arm开发板
2)准备Linux内核
>> 输入sudo apt-get install gcc-arm-linux-gnueabihf 安装arm交叉编译工具链(安装时注意内核版本和编译器版本要适配)
>> 下载Linux内核并解压
#下载内核
sudo wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-6.2.6.tar.xz
#解压
tar -vxf linux-6.2.6.tar.xz
下图虽然是 linux-4.1.15的情况,但linux-6.2.6与其差不多:
>> 输入vim Makefile,按下图修改Makefile文件
>> 保存退出后,输入make vexpress_defconfig 命令,产生.config配置文件
注:1. 过程中如果出现xxx:not found的问题则需要对xxx进行安装
2. 这里用的是vexpress_defconfig,也可以在/linux-6.2.6/arch/arm/configs里面找其他的平台配置文件
>> (最后make之make menuconfig配置内核选项)输入make -j2(表示用2个核来执行编译)编译内核,编译完成之后,会在arch/arm/boot生成 Linux 内核镜像,同时在arch/arm/boot/dts下生成设备树文件
3)制作根文件系统
>> 下载busybox
#下载
wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
#解压
tar -jxvf busybox-1.36.0.tar.bz2
>> 修改Makefile文件
>> 编译
#在busybox的目录下输入如下命令
make defconfig
make menuconfig #配置busybox时注意要全屏
#BusyBox Setting->Build Options->[*]Build static binary (no shared libs)和[*]Don’t use /usr(否则busybox会安装到ubuntu的/usr下,会覆盖原系统原有的命令)
make
make install
#安装完毕后,会在busybox文件夹下生成_install文件夹
mkdir dev etc lib sys proc tmp var home root mnt usr
>> 创建/home/myqemu/rootfs路径,将_install里面的所有内容拷贝到/home/myqemu/rootfs里
>> 拷贝交叉编译工具库文件(/usr/arm-linux-gnueabihf/lib/*)至根文件系统的lib文件夹(/home/myqemu/rootfs/lib)下
4)制作虚拟存储介质
在实际板子中需要将根文件系统保存到 flash 中去或者通过nfs的方式挂载网络文件系统供linux内核启动时访问,而qemu中没有板子,更没有flash,因此需要虚拟出一个存储介质。
dd if=/dev/zero of=rootfs.ext3.img bs=1M count=512
mkfs.ext3 rootfs.ext3.img
sudo mkdir tmpfs
sudo mount -t ext3 rootfs.ext3.img tmpfs/ -o loop
sudo cp -r ~/myqemu/rootfs/* tmpfs/
sudo umount tmpfs
rm -rf tmpfs
#tmpfs相当于一个中介,使得制作的根文件系统~/myqemu/rootfs/能够复制到flash中去
5)启动linux内核
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-dtb ~/myarm/linux-6.2.6/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-kernel ~/myarm/linux-6.2.6/arch/arm/boot/zImage \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd rootfs.ext3.img
# 1. -M vexpress-a9: 模拟vexpress-a9单板, 能够使用-M ?參数来获取该qemu版本号支持的全部单板
# 2. -m 512M: 单板执行物理内存512M
# 3. -kernel xxx/zImage: 告诉qemu单板执行内核镜像路径
# 4. -nographic: 不使用图形化界面, 仅仅使用串口
#
# 5. -append "root=/dev/mmcblk0 rw console=tty0":
# 内核启动參数这里告诉内核vexpress单板执行. 其中:
# 5.1 root=/dev/mmcblk0: 文件系统的加载Root位置
# 5.2 rw: 以读写的方式打开文件系统, 以便能够创建, 修改, 删除文件
# 5.3 console=tty0: 控制台
#
# 6. -sd rootfs.ext3: 从SD卡加载系统
# 7. -dtb:设备树
过程中出现的问题:
I)can't open /dev/tty3: No such file or directory
#cd到目录~/myqemu/rootfs/dev下,输入如下命令,然后再执行制作虚拟存储介质的步骤
sudo mknod tty1 c 4 1
sudo mknod tty2 c 4 2
sudo mknod tty3 c 4 3
sudo mknod tty4 c 4 4
II)can't run '/etc/init.d/rcS': No such file or directory
#在~/myqemu/rootfs/etc下创建/init.d/rcS、inittab、fstab文件
#cd到目录~/myqemu/rootfs/dev下,输入如下命令:
sudo mknod console c 5 1
sudo mknod ttyAMA0 c 204 64
#执行制作虚拟存储介质的步骤
6) 退出qemu-linux:ctrl+a,松开后再按x
程序验证
1)编写hello.c程序
2)交叉编译:arm-linux-gnueabihf-gcc hello.c -o hello
3)将hello拷贝到根文件系统(~/myqemu/rootfs)下,制作虚拟存储介质,启动开发板,并执行hello文件
=========================================================================