6

手把手教你搭建ARM32 QEMU环境

 7 months ago
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.
neoserver,ios ssh client

手把手教你搭建ARM32 QEMU环境

精选 原创

Linux随笔录 2024-02-04 14:13:15 ©著作权

文章标签 linux qemu 文章分类 软件研发 阅读数192

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

手把手教你搭建ARM32 QEMU环境_qemu

解压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文件系统

可以看到登录到串口上

手把手教你搭建ARM32 QEMU环境_qemu_02

退出当前运行的 qemu,使用组合键,CTRL + a,松开后然后再按 x 键。


作者潘小帅, 是一名Linux底层爱好者,平时写写技术原创文章,也有徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持, 微信关注[Linux随笔录],回复1024领取Linux大礼包

手把手教你搭建ARM32 QEMU环境_linux_03
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK