概述
我们知道嵌入式开发调试就要和各种硬件打交道,所以学习就要专门购买各种开发版,浪费资金,开会演示效果还需要携带一大串的板子和电线,不胜其烦。然而Qemu的使用可以避免频繁在开发板上烧写版本,如果进行的调试工作与外设无关,仅仅是内核方面的调试,Qemu模拟ARM开发环境完全可以完美地胜任。本篇就带大家教你们如何手把手搭建QEMU环境.
注意不能模拟uboot,所以本篇没有模拟uboot启动kernel过程
环境准备
PC系统:Windows10
虚拟机:VMware-17
虚拟机系统:Ubuntu-18.04.1
模拟的32位开发板:vexpress-a9
搭建环境时使用的源码版本
qemu-8.2.0
linux-5.10.209(Linux Kernel)
busybox-1.36.1
下载编译安装QEMU
下载QEMU源码
去qemu官网上下载最新的8.2.0源码包,并解压出来
wget https://download.qemu.org/qemu-8.2.0.tar.bz2
tar -xjf qemu-8.2.0.tar.bz2
配置QEMU
配置qemu源码前要要求本地环境python版本要大于3.8和glib2.0环境依赖。
检查下自己主机的python版本,如果低于python3.8需要去python官网下载源码自行安装https://www.python.org/downloads/source/
cd Python-3.8.17/
./configure --prefix=/usr/local
make -j8
make install
rm /usr/bin/python
sudo ln -s /usr/local/bin/python3.8 /usr/bin/
然后安装各种环境
sudo apt-get install python3-venv
sudo apt-get install python3-pip
sudo apt-get update
pip3 install --upgrade pip
pip3 install sphinx
pip3 install sphinx_rtd_theme
pip3 install Ninja
sudo apt-get install libglib2.0-0 libglib2.0-dev ninja-build libpixman-1-dev
安装完配置前的环境依赖后,进入到qemu目录下,配置下qemu源码,我们只需要ARM32和ARM64架构的单板,本篇模拟ARM32的板子,下篇模拟ARM64的板子,如果需要模拟其他单板类型可以去看configs/devices/
~/qemu-8.2.0$ ls -l configs/devices/
total 124
drwxr-xr-x 2 book book 4096 Dec 19 16:24 aarch64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 alpha-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 arm-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 avr-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 cris-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 hppa-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 i386-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 loongarch64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 m68k-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 microblazeel-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 microblaze-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mips64el-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mips64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mipsel-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mips-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 nios2-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 or1k-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 ppc64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 ppc-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 riscv32-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 riscv64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 rx-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 s390x-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sh4eb-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sh4-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sparc64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sparc-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 tricore-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 x86_64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 xtensaeb-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 xtensa-softmmu
接下来创建编译目录,然后进行配置
~/qemu-8.2.0$ mkdir build/
~/qemu-8.2.0$ cd build/
~/qemu-8.2.0/build/$ ../configure --target-list=arm-softmmu,aarch64-softmmu --audio-drv-list=
其中target-list选项可以指定编译哪些指令集:
- aarch64-softmmu:ARM64指令集
- arm-softmmu:ARMv7指令集
- riscv32-softmmu:RISC-V的32bit指令集
riscv64-softmmu:RISC-V的64bit指令集
编译安装qemu
~/qemu-8.2.0/build/$ make -j8 && make install
下载编译kernel
安装好qemu模拟器后,在[www.kernel.org] 官网上,下载Linux kernel源码,我这里选的5.10源码
解压kernel源码
tar -xf linux-5.10.209.tar.xz
进入kernel目录下,修改顶层Makefile的ARCH和CROSS_COMPILE, 修改完后如下
377 ARCH ?= arm
378 CROSS_COMPILE ?= arm-linux-gnueabi-
配置单板的defconfig,生成.config
~/linux-5.10.209$ make vexpress_defconfig
我们发现配置单板过程中,如果遇到下面的错误,则ubuntu里没有安装工具链
HOSTCC scripts/kconfig/conf.o
HOSTLD scripts/kconfig/conf
scripts/Kconfig.include:39: compiler 'arm-linux-gnueabi-gcc' not found
make[1]: *** [scripts/kconfig/Makefile:88: vexpress_defconfig] Error 1
make: *** [Makefile:616: vexpress_defconfig] Error 2
解决方法是需要手动安装lib32的库
sudo apt install gcc-arm-linux-gnueabi
在执行一次make vexpress_defconfig命令
~/linux-5.10.209$ make vexpress_defconfig
#
# configuration written to .config
#
编译kernel内核
编译完的zImage存放在arch/arm/boot/下面
~/linux-5.10.209$ make zImage -j8
编译kernel modules
编译完的ko文件存放在arch/arm/boot/下面
~/linux-5.10.209$ make modules -j8
编译设备树
~/linux-5.10.209$ make dtbs
使用busybox制作根文件系统
本篇根文件系统我们使用busybox进行制作,下一篇我们也可以尝试用Buildroot进行做文件系统
先下载busybox官网上的最新版本源码,并进行解压
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
进入到busybox源码目录,修改顶层Makefile的ARCH和CROSS_COMPILE, 修改完后如下
164 CROSS_COMPILE ?= arm-linux-gnueabi-
...
190 ARCH ?= arm
执行下面命令,重新配置.config文件并编译
~/busybox-1.36.1$ make defconfig && make -j8
执行下面命令,进行安装文件系统
~/busybox-1.36.1$ make install
会默认安装在_install目录下
~/busybox-1.36.1/_install$ ls
bin linuxrc sbin usr
创建rootfs目录用来存放所需要的文件系统内容,把busybox里安装的目录放到这里,还需要把工具链的库放在这里
mkdir rootfs
mkdir -p rootfs/lib
cp -r /usr/arm-linux-gnueabi/lib/ rootfs/lib/
cp -r busybox-1.36.1/_install/* rootfs
mkdir -p rootfs/dev/
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
制作SD卡的文件系统镜像
dd命令生成镜像
dd if=/dev/zero of=rootfs.ext4 bs=1M count=64
格式化ext4文件系统
mkfs.ext4 rootfs.ext4
将安装做好的rootfs目录下的文件全部拷贝在/mnt目录下面
sudo mount -t ext4 rootfs.ext4 /mnt -o loop
cp -r rootfs/* mnt
umount mnt
qemu模拟kernel启动
执行下面的命令启动kernel进入到系统里
~/linux-5.10.209$ qemu-system-arm -M vexpress-a9 -m 512M -kernel ./arch/arm/boot/zImage -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0 rootwait rootfstype=ext4" -sd rootfs.ext4
- -m 512M 单板物理内存512M
- -kernel ./arch/arm/boot/zImage 指定内和镜像及路径
- -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb 指定单板的设备树文件
- -nographic 不使用图形界面,使用串口
- -append "console=ttyAMA0 rootwait rootfstype=ext4" 指定内核启动参数,串口设备使用ttyAMA0
- -sd rootfs.ext4 指定SD卡制作的rootfs.ext4文件系统
可以看到登录到串口上
退出当前运行的 qemu,使用组合键,CTRL + a,松开后然后再按 x 键。
作者潘小帅, 是一名Linux底层爱好者,平时写写技术原创文章,也有徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。