手把手教你搭建ARM32 QEMU环境
source link: https://blog.51cto.com/u_14454597/9585649
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
手把手教你搭建ARM32 QEMU环境
精选 原创我们知道嵌入式开发调试就要和各种硬件打交道,所以学习就要专门购买各种开发版,浪费资金,开会演示效果还需要携带一大串的板子和电线,不胜其烦。然而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 vexpress-a9 模拟vexpress-a9机型板子
- -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底层爱好者,平时写写技术原创文章,也有徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持, 微信关注[Linux随笔录],回复1024领取Linux大礼包
- 赞
- 收藏
- 评论
- 分享
- 举报
上一篇:深入理解零拷贝技术
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK