1Qemu介绍1.1简介QEMUQuick Emulator 是一个开源的机器模拟器和虚拟化平台能够在一台主机上模拟不同体系结构的计算机系统从而运行不同架构的操作系统或应用程序。QEMU 广泛应用于操作系统开发、嵌入式系统开发、虚拟化平台以及跨架构软件测试等领域。QEMU 通过软件方式模拟处理器、内存以及各种硬件设备使得开发者可以在没有实际硬件设备的情况下完成系统开发和调试工作。此外在支持硬件虚拟化技术的系统上QEMU 可以结合 KVMKernel-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主界面下进入ToolchainC library选择glibc勾选Enable C support、Build cross gdb for the host、Copy gconv libraries回到menuconfig进入System configurrationRoot password输入1Network interface to configure through DHCP输入eth0Root 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选择ext4exact size 选择2048M并取消勾选tar the root filesystem2.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/rcSttyAMA0::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 “consolettyAMA0 root/dev/vda rw rootwait” -drive ifnone,fileD:\huike\qemu\aarch64\rootfs.ext4,formatraw,idhd0 -device virtio-blk-device,drivehd0 -netdev user,idnet0,hostfwdtcp::2222-:22 -device virtio-net-device,netdevnet0虚拟机启动后vi /etc/init.d/rcS然后进入编辑模式输入以下内容完成虚拟文件系统挂载mount -t proc proc /procmount -t sysfs sysfs /sysmount -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 upifconfig lo upudhcpc -i eth03制作交叉编译工具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选armEndianness选择Big endianBitness选择64-bitArchitecture level选择armv8-amenuconfig下的Toolchain options也不作修改Operating SystemTarget OS选择linuxVersion of linux选择5.14.18menuconfig下进入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下的gdbserver3.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 ax ./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制作libxmlhttps://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.8wget -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 --buildx86_64-pc-linux-gnu --hostaarch64_be-buildroot-linux-gnu --prefix/usr --without-python --without-zlib --disable-static --enable-shared ac_cv_func_malloc_0_nonnullyes ac_cv_func_realloc_0_nonnullyes当控制台输出下图表示配置完成再在libxml2-2.7.8下mkdir -p _install创建一个文件夹,然后执行make install DESTDIR$PWD/_install2运行系统制作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主界面下进入ToolchainC library选择glibc勾选Enable C support、Build cross gdb for the host、Copy gconv libraries回到menuconfig进入System configurrationRoot password输入1Network interface to configure through DHCP输入eth0Root 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选择ext4exact size 选择2048M并取消勾选tar the root filesystem2.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/rcSttyAMA0::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 “consolettyAMA0 root/dev/vda rw rootwait” -drive ifnone,fileD:\huike\qemu\aarch64\rootfs.ext4,formatraw,idhd0 -device virtio-blk-device,drivehd0 -netdev user,idnet0,hostfwdtcp::2222-:22 -device virtio-net-device,netdevnet0虚拟机启动后vi /etc/init.d/rcS然后进入编辑模式输入以下内容完成虚拟文件系统挂载mount -t proc proc /procmount -t sysfs sysfs /sysmount -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 upifconfig lo upudhcpc -i eth03制作交叉编译工具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选armEndianness选择Big endianBitness选择64-bitArchitecture level选择armv8-amenuconfig下的Toolchain options也不作修改Operating SystemTarget OS选择linuxVersion of linux选择5.14.18menuconfig下进入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下的gdbserver3.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 ax ./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制作libxmlhttps://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.8wget -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 --buildx86_64-pc-linux-gnu --hostaarch64_be-buildroot-linux-gnu --prefix/usr --without-python --without-zlib --disable-static --enable-shared ac_cv_func_malloc_0_nonnullyes ac_cv_func_realloc_0_nonnullyes当控制台输出下图表示配置完成再在libxml2-2.7.8下mkdir -p _install创建一个文件夹,然后执行make install DESTDIR$PWD/_install![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ee5c2b6b715c46629e0e99ffbbbdd8ba.pngfile检查生成物说明确实是arm64位大端之后将整个_install拷入qemu虚拟机进入虚拟机将_install下的include里的libxml拷入编译工具的sysroot/usr/include下再将_install下的lib中的libxml2的动态库靠近虚拟机的usr/lib下4扩容在qemu路径下对文件系统rootfs.ext4进行扩容然后进入虚拟机使用resize2fs /dev/vda可以通过df -h查看磁盘空间