核心内容摘要
把坑都踩完了,AI论文写作软件 千笔·专业论文写作工具 VS 云笔AI
嵌入式系统学习涉及广泛的知识和技术。
与特定种类的应用开发相比嵌入式系统软件的开发环境构建显得尤为“奢侈”。
很多时侯我们需要购买许多价格不菲、种类各异的嵌入式开发板以及配套的各类工具如JTAG/SWI烧录器、串口连接线等等。
而准备这一切不仅需要金钱还得有时间。
而QEMU则可在一定程度缓解这种尴尬。
本文记录在Ubuntu2204上基于QEMU搭建一个基础的嵌入式ARM开发板Vexpress-A9模拟运行环境的全过程。
ARM express 全称versatile express family, 是ARM公司自己推出的开发板主要用于SOC厂商设计,验证和测试自己的SOC芯片。
采用主板子板设计,主板提供各种外围接口,子板提供CPU运算支持的Cortex-A5/A9/A15/R5等处理器。
安装QEMU安装qemu虚拟机工具。
# For full system emulation sudo apt install qemu-system #For emulating Linux binaries sudo apt install qemu-user-static有兴趣的同学也可手动编译安装https://www.qemu.org/ https://wiki.qemu.org/Hosts/Linux git clone https://gitlab.com/qemu-project/qemu.git git checkout remotes/origin/stable-
2 -b stable-
2 sudo apt-get install git libglib
0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build sudo apt-get install git-email sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-dev sudo apt-get install libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev sudo apt-get install libibverbs-dev libjp
-dev libncurses5-dev libnuma-dev sudo apt-get install librbd-dev librdmacm-dev sudo apt-get install libsasl2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh-dev sudo apt-get install libvde-dev libvdeplug-dev libvte-
91-dev libxen-dev liblzo2-dev sudo apt-get install valgrind xfslibs-dev sudo apt-get install libnfs-dev libiscsi-dev ./configure --target-listarm-softmmu --audio-drv-list make sudo make install测试安装结果qemu-system-arm --version #查看支持的开发板 qemu-system-arm -M help #vexpress-a9
安装ARM交叉工具链安装arm交叉工具链sudo apt install -y gcc-arm-linux-gnueabihf sudo apt install -y g-arm-linux-gnueabihf工具链的命令规则一般是arch-core-kernel-system-language。
其中一languag译语言表示该编译器用于编译何种语言最常见的就是gccg二arch体系架构如ARMMIPS等表示该编译器用的指令集和CPU架构三core使用的是哪个CPU Core如Cortex A8或者是指定工具链的供应商。
如果没有特殊指定则留空不填。
这一组命名比较灵活在某些厂家提供的交叉编译链中有以厂家名称命名的也有以开发板命名的或者直接是none或cross的四kernel所运行的OS见过的有Linuxuclinuxbare无OS五system交叉编译链所选择的库函数和目标映像的规范如gnugnueabi等。
其中gnu等价于glibcoabignueabi等价于glibceabi。
若不指定则也可以留空不填
ABI二进制应用程序接口(Application Binary Interface(ABI) for the ARM Architecture),在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口,涵盖了数据类型的大小,布局和对齐,调用约定.
EABI嵌入式ABI 嵌入式应用二进制接口指定了文件格式,数据类型,寄存器使用,堆积组织优化和在一个嵌入式软件中的参数的标准约定.Arm-none-gnueabi-linux比arm-linux-gcc要好,在可一致性,兼容性上面早期u-boot和Linux编译可能使用的都不是一个arm-linux-gcc版本
HF启用硬浮点计算hf hard-float。
硬浮点hard-float依赖ARM CPU的浮点运算单元FPU执行浮点操作速度快、效率高需硬件支持如Cortex-A系列。
软浮点soft-float通过软件模拟浮点运算兼容性广但性能差适用于无FPU的低端ARM芯片如Cortex-M系列。
安装编译U-BOOT一获取uboot源码git clone https://github.com/u-boot/u-boot.git二配置编译选项make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- vexpress_ca9x4_defconfig三编译ubootmake ARCHarm CROSS_COMPILEarm-linux-gnueabihf- -j $(nproc)编译结束后会在根目录下生成两个二进制文件uboot和uboot.bin。
四测试uboot通过qemu运行uboot。
qemu-system-arm -kernel u-boot -nographic运行结果
编译Linux内核一 下载Linux内核源码git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git -b v
4 linux-
4二配置内核make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- vexpress_defconfig三编译内核make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- -j $(nproc)
内核文件编译将在arch/arm/boot下生成zImage内核压缩文件。
设备树文件在arch/arm/boot/dtb下生成vexpress-v2p-ca
dtb设备树文件。
制作根文件系统根文件系统是Linux内核启动后首先挂载的文件系统包含基本的shell命令,各种库,字符设备,配置脚本等提供了根目录/可以放在: nor/nand flash, SD卡, 磁盘, 网络空间上一般使用busybox构建嵌入式根文件系统。
一编译安装busybox#
下载源代码 https://busybox.net/ #
修改Makefile ARCH arm CROSS_COMPILE arm-linux-gnueabi- #
配置 make defconfig make menuconfig Settings --- [*] Build static binary (no shared libs) #
编译 make -j $(nproc) #
安装 make install #安装生成目录_install在编译配置时建议设置为表态连接。
如果未选择“Build static binary (no shared libs)则需要将arm-linux-gnueabihf相关的库文件拷贝至根文件系统的/lib目录下。
二制作SD卡镜像制作SD卡镜像文件#
生成镜像 #bs: 缓冲区块的大小 #count: 块的个数 dd if/dev/zero ofsdcard.img bs1M count32 #
格式化为ext3文件系统 mkfs.ext4 sdcard.img初始化镜像文件#
将各种文件copy到文件系统镜像中 sudo mount -t ext4 sdcard.img /mnt -o loop #
创建基础目录 sudo mkdir etc proc sys dev var boot #
从busybox中拷贝程序与配置文件 sudo cp -rff ../busybox-
1.
3
0/_install/* /mnt/ sudo cp -rf ../busybox-
1.
3
0/examples/bootfloppy/etc/* /mnt/etc/ #
从交叉编译库中拷贝库文件 cp -avf /usr/arm-linux-gnueabihf/lib/* /mnt/lib/创建设备节点#
创建设备节点 #mknod: 创建块或字符设备节点 #-m 666: 权限读写 #tty1: 节点名称 #c: 字符设备 #4: 主设备号 #1: 次设备号 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拷贝内核镜像和设备树文件cd ../ sudo cp linux-
4/arch/arm/boot/zImage rootfs/boot/ sudo cp linux-
4/arch/arm/boot/dts/vexpress-v2p-ca
dtb rootfs/boot/修改etc/fstab文件内容如下所示proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /var tmpfs defaults 0 0修改etc/init.d/rcS文件内容如下所示#! /bin/sh /bin/mount -a /sbin/mdev -sumount镜像sudo umount /mnt
模拟运行编写启动脚本#/bin/sh qemu-system-arm -M vexpress-a9 \ -kernel u-boot \ -sd sdcard.img \ -no-reboot \ -nographic \ -m 512M运行进入uboot界面u-boot加载内核和设备树文件load mmc 0:0 0x66000000 boot/zImage load mmc 0:0 0x66500000 boot/vexpress-v2p-ca
dtb设置启动参数setenv bootargs root/dev/mmcblk0 rw consolettyAMA0,115200 init/linuxrc启动内核并运行bootz 0x66000000 - 0x66500000运行界面如下
七、