10
2024
04
20:41:24

手把手教你搭建ARM32/64 QEMU环境



推荐点击下面图片,通过本站淘宝优惠价购买:

image.png


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

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 键。



本篇咱们模拟ARM64 QEMU开发环境

环境准备

PC系统:Windows10

虚拟机:VMware-17

虚拟机系统:Ubuntu-20.04

模拟的64位cpu:cortex-a57

搭建环境时使用的源码版本

qemu-8.2.0

linux-5.10.209(Linux Kernel)

busybox-1.36.1

AARCH64的工具链安装准备:

sudo apt-get install gcc-aarch64-linux-gnu -y

下载编译安装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/python

然后安装各种环境

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源码。本篇模拟ARM64架构的开发环境,接下来创建编译目录,然后进行配置

~/qemu-8.2.0$ mkdir build/ ~/qemu-8.2.0$ cd build/ ~/qemu-8.2.0/build/$ ../configure --target-list=aarch64-softmmu --audio-drv-list=

编译安装qemu

~/qemu-8.2.0/build/$ make -j8 && make install

下载编译kernel

安装好qemu模拟器后,在[http://www.kernel.org] 官网上,下载Linux kernel源码,我这里选的5.10源码

解压kernel源码

tar -xf linux-5.10.209.tar.xz

进入kernel目录下,配置编译kernel并编译生成Image文件,存放在arch/arm/boot/下面

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image -j8

编译kernel modules  编译完的ko文件存放在arch/arm/boot/下面

~/linux-5.10.209$ make modules -j8

使用busybox制作根文件系统

本篇根文件系统我们使用busybox进行制作,下一篇我们也可以尝试用Buildroot进行做文件系统

先下载busybox官网上的最新版本源码,并进行解压

wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2 tar -xjf busybox-1.36.1.tar.bz2

设置交叉编译工具链

-> Settings

(aarch64-linux-gnu-) Cross compiler prefix

执行下面命令,重新配置.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里安装的目录拷贝到这里,创建lib目录本地安装的工具链放到这里,在创建其他所需目录

mkdir rootfs mkdir -p rootfs/lib cp -r /usr/aarch64-linux-gnu/lib/ rootfs/lib/ cp -r busybox-1.36.1/_install/* rootfs cd rootfs/ mkdir -p etc dev mnt proc sys tmp mnt root etc/init.d/ touch etc/initab etc/fstab etc/profile etc/init.d/rcS chmod +x etc/initab etc/init.d/rcS

一个完整文件系统是启机要做很多事情,这些事情都是由启机脚本去做 etc目录下创建inittab文件,它是启机后运行的第一个脚本

inittab会先去执行/etc/init.d/rcS脚本的事情,rcS脚本内容如下所示


rcS它会做三件事:

1、挂载fstab的所有系统节点

2、mdev机制实现热插拔自动创建节点

3、给eth0设置静态IP

/etc/fstab主要是存放文件系统信息内容如下


/etc/profile文件是全局的shell配置文件,简单的讲就是登陆shell前的配置文件,主要是设置环境变量路径,设置主机用户名,创建设备节点 内容如下

我尝试过aarch64架构就不能用上篇的sd卡制作文件系统,会报机器类型不支持

qemu-system-aarch64: -sd rootfs_arm64.ext4: machine type does not support if=sd,bus=0,unit=0

所以换cpio工具制作initramfs内存文件系统

~/rootfs$ find . | cpio -o -H newc > ../rootfs.img 98684 blocks ~$ cd ../ ~$ ls -lh rootfs.img  -rw-rw-r-- 1 forlinx forlinx 49M 2月   5 10:47 rootfs.img

或者cpio做出来的镜像用gzip压缩成img,两者区别是gzip压缩更小

~/rootfs$ find . | cpio -o -H newc |gzip > ../rootfs.cpio.gz ~$ cd ../ ~$ ls -lh rootfs.cpio.gz -rw-rw-r-- 1 forlinx forlinx 15M 2月   5 10:47 rootfs.cpio.gz

qemu模拟kernel启动

输入qemu命令启动内核

qemu-system-aarch64 -machine virt,virtualization=true,gic-version=3 -nographic -m size=1024M -cpu cortex-a57 -smp 4 -kernel arch/arm64/boot/Image -initrd rootfs.cpio.gz -append "root=/dev/ram console=ttyAMA0 rdinit=/linuxrc"
  • -machine virt,virtualization=true,gic-version=3 因为qemu不能模拟出具体64位机器类型,只能是virt虚拟化出64位机器类型,所以dtb就不需要指定

  • -cpu cortex-a57 目前qemu支持armv8的cpu有cortex-a53,cortex-a55,cortex-a57,cortex-a72,cortex-a76

  • smp 4 使用4核CPU

  • -m 1024M 单板物理内存1024M

  • -kernel ./arch/arm/boot/Image 指定内核镜像及路径

  • -nographic 不使用图形界面,使用串口

  • -initrd rootfs.cpio.gz 内存文件系统

  • -append "root=/dev/ram console=ttyAMA0 init=/linuxrc" 指定内核启动参数,串口设备使用ttyAMA0,告诉kernel,init进程是/linuxrc

可以看到登录到串口上


本文链接:https://www.hqyman.cn/post/5746.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:





休息一下,本站随机推荐观看栏目:


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您的IP地址是: