Qemu上运行arm大端Linux系统以及运行软件验证
1Qemu介绍
1.1简介
QEMU(Quick Emulator) 是一个开源的机器模拟器和虚拟化平台,能够在一台主机上模拟不同体系结构的计算机系统,从而运行不同架构的操作系统或应用程序。QEMU 广泛应用于操作系统开发、嵌入式系统开发、虚拟化平台以及跨架构软件测试等领域。
QEMU 通过软件方式模拟处理器、内存以及各种硬件设备,使得开发者可以在没有实际硬件设备的情况下完成系统开发和调试工作。此外,在支持硬件虚拟化技术的系统上,QEMU 可以结合 KVM(Kernel-based Virtual Machine)实现硬件加速,从而显著提升虚拟机的运行性能。
1.2QEMU主要功能
系统级模拟(System Emulation)
系统级模拟是 QEMU 的核心功能之一,它可以模拟一整台计算机系统,包括:CPU、内存、存储设备、网络设备、串口设备、PCI 设备等。
通过系统模拟,用户可以在主机上运行完整的操作系统,例如 Linux、Windows 或其他嵌入式操作系统。例如,在 x86 主机上可以模拟 ARM、RISC-V 等不同架构的开发平台,该模式常用于:操作系统开发、嵌入式系统调试、启动引导程序(Bootloader)调试、Linux 内核调试。
用户态模拟(User Mode Emulation)
用户态模拟模式只模拟 CPU 指令集,而不模拟完整的计算机系统。通过这种方式,可以在一种架构的主机上运行另一种架构编译的应用程序。
在这种模式下,QEMU 主要负责设备模拟,而 CPU 指令由 KVM 在硬件层面执行,使虚拟机性能接近原生系统。
硬件虚拟化加速
在支持硬件虚拟化的系统上,QEMU 可以结合 KVM 使用 CPU 的虚拟化扩展(如 Intel VT-x 或 AMD-V),从而将大部分 CPU 指令直接在宿主机上执行,大幅提高运行效率。
在这种模式下,QEMU 主要负责设备模拟,而 CPU 指令由 KVM 在硬件层面执行,使虚拟机性能接近原生系统。
1.3开发环境介绍
本文档基于qemu版本qemu-w64-setup-20200805进行开发,其中用于模拟AMR架构的程序版本为5.0.93。
ARM上运行系统的开发环境为VMware® Workstation 17 Pro,版本为Ubuntu 14.04.6。
(本文档需要下载的资源也可从ftp://192.168.2.200/开发工具/Qemu上拉取)
2运行系统制作
2.1menuconfig配置
通过wget http://buildroot.org/downloads/buildroot-2018.02.12.tar.gz获取buildroot以制作系统镜像;将下载的buildroot压缩包解压tar -zxf buildroot-2018.02.12.tar.gz然后在buildroot下进行make menuconfig配置然后出现以下界面
如果出现提示如下图则说明窗口过小,扩大就能解决。
按下Enter键进入menuconfig中的Target option选项按下图配置:选择目标架构(Target Architectur)为aarch64(big endian)表示大端arm64位架构,目标二进制格式为ELF为linux可执行文件格式,目标设备的具体CPU型号(Target Architecture Variant)这里使用的是cortex-A57,浮点数策略(Floating point strategy)这里默认使用FP-ARMv8就行。
exit回到menuconfig主界面,Build option使用默认配置:
menuconfig主界面下进入Toolchain:C library选择glibc,勾选Enable C++ support、Build cross gdb for the host、Copy gconv libraries
回到menuconfig进入System configurration:Root password输入1,Network interface to configure through DHCP输入eth0,Root filesystem overlay directories输入board/qemu/rootfs-overlay
进入Kernel:勾选Linux Kernel,在Defconfig name填入def,其他保持默认
在menuconfig/Target packages中选择要安装的功能
首先进入Target packages中的Debugging, profiling and benchmark:勾选gdb、gdbserver、full debugger
然后退出再进入Development tools:勾选make、tree
再退出进入Target packages下的Filesystem and flash utilities:勾选e2fsprogs,并且再在e2fsprogs下选择:fsck, resize2fs

之后在Target packet下的Milscellaneous:勾选havged
最后在Target packages中的Networking applications:勾选openssh
回到menuconfig进入Filesystem images:勾选ext2/3/4 root filesystem,然后在ext2/3/4 variant选择ext4,exact size 选择2048M,并取消勾选tar the root filesystem
2.2make构建
退出menuconfig并保存,退出后执行make,之后会遇到下图的错误,这时进入buildroot-2018.02.12/output/build/linux-4.15.16/arch/arm64/configs执行mv defconfig def_defconfig对其进行重命名。
再执行make会出现以下错误:
然后执行指令mkdir -p board/qemu/rootfs-overlay/etc和vi board/qemu/rootfs-overlay/etc/inittab,按i在进入编辑模式后写入以下指令来跳过虚拟机开启后需要输入用户名和密码:
::sysinit:/etc/init.d/rcS
ttyAMA0::respawn:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
之后再执行make,当控制台输出以下内容时表示系统内核和文件系统已经完成了编译
进入buildroot-2018.02.12/output/images下可以看到并通过./aarch64_be-linux-objcopy -O binary …/…/images/vmlinux …/…/images/Image命令将vmlinux转为Image格式。
2.3虚拟机配置
使用以下指令启动虚拟机,其中D:\huike\qemu\qemu-system-aarch64.exe为qemu下qemu-system-aarch64的绝对路径,D:\huike\qemu\aarch64\Image和D:\huike\qemu\aarch64\rootfs.ext4为系统镜像和文件系统的绝对路径:
D:\huike\qemu\qemu-system-aarch64.exe -M virt -cpu cortex-a57 -m 4096 -nographic -smp 4 -kernel D:\huike\qemu\aarch64\Image -append “console=ttyAMA0 root=/dev/vda rw rootwait” -drive if=none,file=D:\huike\qemu\aarch64\rootfs.ext4,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netdev user,id=net0,hostfwd=tcp::2222-:22 -device virtio-net-device,netdev=net0
虚拟机启动后vi /etc/init.d/rcS然后进入编辑模式输入以下内容完成虚拟文件系统挂载:
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
退出后vi /etc/ssh/sshd_config找到#PermitRootLogin prohibit-password、#PasswordAuthentication yes、#UsePAM no;去掉前面的#并改为PermitRootLogin yes、PasswordAuthentication yes、UsePAM no:

退出然后再vi /etc/init.d/S40network加入
ifconfig eth0 up
ifconfig lo up
udhcpc -i eth0
3制作交叉编译工具
3.1menuconfig配置
在https://github.com/crosstool-ng/crosstool-ng/tree/crosstool-ng-1.25.0网址上下载crosstool-ng-crosstool-ng-1.25.0.zip。
解压后cd进入crosstool-ng文件夹下执行./bootstrap生成配置脚本;然后执行配置脚本./configure --prefix=/opt/ct-ng;继续在crosstool-ng目录下执行make,最后执行sudo make install就完成了ct-ng安装。
之后在~/目录下mkdir toolchain创建文件夹,cd进入toolchain/下然后再mkdir创建aarch64eb-toolchain文件夹作为arm大端工具链存放文件夹,cd进入aarch64eb-toolchain输入命令ct-ng menuconfig。
其中Paths and misc options不作修改直接默认就行,然后Target options下:Target Architecture选arm,Endianness选择Big endian,Bitness选择64-bit,Architecture level选择armv8-a
menuconfig下的Toolchain options也不作修改,Operating System:Target OS选择linux,Version of linux选择5.14.18
menuconfig下进入Binary utilities:其中Linkers to enable选择ld,gold然后勾选 Enable threaded gold、Add ld wrapper、Enable support for plugins
然后退出再进入C-library:修改Version of glibc为2.26,删去extar target CFLAGS中的内容,取消勾选Enable -fcommon flag for older version of glibc when using GCC >=10
再进入C compiler:修改Version of gcc选择6.5.0,取消勾选Use sjlj for exceptions。
进入menuconfig下的Debug facilities取消勾选ltrace和gdb下的gdbserver
3.2ct-ng 构建
Companion libraries和Companion tools保存默认即可然后退出menuconfig,然后退出先输入export PATH=/opt/ct-ng/bin:PATH和exportPATH=/home/lbw/Downloads/buildroot−2018.02.12/output/host/bin:PATH和export PATH=/home/lbw/Downloads/buildroot-2018.02.12/output/host/bin:PATH和exportPATH=/home/lbw/Downloads/buildroot−2018.02.12/output/host/bin:PATH加入环境变量再输入ct-ng build进行构建
当出现报错如下图,用vi打开.config,然后在官网https://zlib.net/fossils/下载zlib-1.2.12.tar.gz并将其拷入~/src(如果没有src则mkdir创建一个)
然后从https://github.com/libexpat/libexpat/releases/download/R_2_4_1/expat-2.4.1.tar.xz下载expat同样放入src;从http://ftp.gnu.org/gnu/gcc/gcc-6.5.0/gcc-6.5.0.tar.xz下载gcc放入src;从http://ftp.gnu.org/gnu/gdb/gdb-8.3.1.tar.xz下载gdb放入src;当输出如下图表示编译完毕
3.3编译工具导入虚拟机
通过上位机将该路径下的文件夹拷入虚拟机
在虚拟机中进入下图路径下,输入chmod -R a+x ./bin/添加可执行权限然后再cd 进入aarch64_be-unknown-linux-gnu
找到以下路径chmod +x cc1添加可执行权限
再在以下路径chmod +x a*、chmod +x ld、chmod +x ld.bfd
之后就可以通过/root/aarch64_be-unknown-linux-gnu/aarch64_be-unknown-linux-gnu/bin/aarch64_be-unknown-linux-gnu-gcc test.c -o test进行编译了
3.4制作libxml
https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.7.8下载xml的库然后将libxml2-2.7.8.tar.xz拷入开发环境
tar xvf libxml2-2.7.8.tar.xz解压后通过一下两个指令下载配置并拷入libxml2-2.7.8:wget -O config.guess https://git.savannah.gnu.org/cgit/config.git/plain/config.guess和wget -O config.sub https://git.savannah.gnu.org/cgit/config.git/plain/config.sub。然后cd libxml2-2.7.8进入目录输入以下指令
./configure --build=x86_64-pc-linux-gnu --host=aarch64_be-buildroot-linux-gnu --prefix=/usr --without-python --without-zlib --disable-static --enable-shared ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes
当控制台输出下图表示配置完成,再在libxml2-2.7.8下mkdir -p _install创建一个文件夹,然后执行make install DESTDIR=$PWD/_install
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)