概述

我们知道嵌入式开发调试就要和各种硬件打交道,所以学习就要专门购买各种开发版,浪费资金,开会演示效果还需要携带一大串的板子和电线,不胜其烦。然而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多平台发布


freedom
4 声望0 粉丝