用QEMU构建嵌入式LINUX系统

    科技2022-08-18  106

    Table of Contents

    Qemu –从源头建造

    ARM工具链

    Linux内核

    构建文件系统

    通过NFS使用根文件系统

    配置QEMU Tap网络

    创建运行脚本


    推荐阅读:《在CentOS上进行虚拟化:QEMU、Xen、KVM、LibVirt、oVirt》

     

    QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,QEMU能模拟至接近真实电脑的速度。

    目前,0.9.1及之前版本的qemu可以使用kqemu加速器。在qemu1.0之后的版本,都无法使用kqemu,主要利用qemu-kvm加速模块,并且加速效果以及稳定性明显好于kqemu。

    在我的嵌入式Linux课程中,我使用Qemu来模拟Linux系统。Qemu模拟许多电路板,包括硬件,中断,网络等。

    在本教程中,我将介绍构建包括内核,文件系统和应用程序的完整系统的步骤。

     

    Qemu –从源头建造


    您可以安装二进制版本,但最好从源代码下载并构建Qemu,因为我们可以使用源代码来模拟新硬件。

    # wget https://download.qemu.org/qemu-2.11.0.tar.xz # tar xvJf qemu-2.11.0.tar.xz # cd qemu-2.11.0 # ./configure

    最后一步检查您的系统是否满足所有qemu要求。如果收到错误消息,则需要安装缺少的软件包。我正在使用Ubuntu,很容易安装缺少的部件,例如,我收到以下消息:

    ERROR: glib-2.22 gthread-2.0 is required to compile QEMU

    搜索Google后,安装所需的软件包

    # sudo apt-get install libglib2.0-dev zlib1g-dev

    需要更多软件包:

    # sudo apt-get install libpixman-1-dev # sudo apt-get install libsdl2*

    现在再次运行configure并检查是否报告了SDL支持

    运行make

    # make # sudo make install

    要检查qemu是否正确安装,请运行

    # qemu-system-arm -M ?

     

    ARM工具链


    我们需要安装的第一件事是ARM的跨工具链。转到Arm.com并下载Linux版本,将其解压缩到〜/ armsystem / toolchain目录中

    将位置添加到PATH环境变量中:

    # export PATH=/home/developer/armsystem/toolchain/gcc-arm-none-eabi-7-2017-q4-major

     

    Linux内核


    转到https://www.kernel.org/并下载最新的内核。建议使用长期支持的版本。将文件解压缩到一个空目录〜/ armsystem / kernel中

    编辑内核Makefile(第253行)

    ARCH ?= arm CROSS_COMPILE ?= arm-none-eabi-

    设置配置文件

    # make vexpress_defconfig

    运行make

    # make -j4

    现在,我们可以使用以下命令检查QEMU中的内核:

    # qemu-system-arm -M vexpress-a15 -m 512 -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vex

    系统将启动但由于我们尚未构建文件系统而崩溃

     

    构建文件系统


    我们可以使用许多工具来构建嵌入式Linux文件系统。一些例子是buildroot,OpenWRT,yocto

    在本教程中,我们将使用buildroot,因为它是最简单的工具

    从这里下载最新的Buildroot软件包并将其解压缩到〜/ armsystem / fs中

    打开配置菜单:

    # make menuconfig

    在目标选项上,选择目标体系结构– ARM

    您可以使用buildroot从Sourcery下载并安装外部工具链(推荐),也可以使用我们已经下载的现有工具链

    我们将使用Sourcery工具链,因为它具有一些IDE插件。

    要下载Sourcery工具链–从工具链菜单中选择:

    工具链类型(外部工具链)工具链(Sourcery CodeBench ARM 2014.05)工具链的来源(要下载和安装的工具链)将gdb服务器复制到目标

    保存配置并构建它

    # make

    构建成功完成后,您可以在以下位置找到新的工具链:

    ~/armsystem/fs/buildroot-2017.02.8/output/host/usr/bin

    将其添加到PATH变量,更改内核Makefile并再次构建

    ARCH ?= arm CROSS_COMPILE ?= arm-none-linux-gnueabi-

    生成的文件系统位于buildroot / output / target中,但我们尚不能使用

     

    通过NFS使用根文件系统


    使用嵌入式板的最好方法是通过NFS(在主机上)挂载目标文件系统来实现,我们需要做一些设置:

    安装NFS服务器

    # sudo apt install nfs-kernel-server

    编辑/ etc / exports以添加NFS文件夹

    /home/developer/armsystem/outfs *(rw,sync,no_root_squash)

    重新启动NFS服务器

    # sudo /etc/init.d/nfs-kernel-server restart [ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.

     

    配置QEMU Tap网络


    Qemu可以使用Tap / Tunnel模式将私有网络与ubuntu结合使用。要进行设置,请创建文件/ etc / qemu-ifup:

    #!/bin/bash exec /sbin/ifconfig $1 192.168.0.1

    向文件添加执行权限(chmod a + x / etc / qemu-ifup)

    创建根文件系统文件夹

    复制生成的文件〜/ armsystem / outfs

    # cp -r -d [buildroot]/output/target/* ~/armsystem/outfs

    现在,使用root用户添加以下设备文件

    # sudo mknod ./dev/console c 5 1 # sudo mknod ./dev/zero c 1 5 # sudo mknod ./dev/null c 1 3 # sudo mknod ./dev/tty1 c 4 1

    如果要自动生成设备文件,请配置udev。使用buildroot非常容易:

    从系统配置菜单中选择/ dev管理(使用devtmpfs + eudev动态)

    然后从“目标软件包”>“硬件处理”菜单中,选择“ eudev”

    编译buildroot,您将看到udev在init上运行:

     

    创建运行脚本


    在〜/ armsystem中创建脚本– run_qemu

    qemu-system-arm -M vexpress-a15 -net tap -net nic -m 512 -kernel kernel/linux-4.14.10/arc

    添加执行权限并使用sudo对其进行测试(它将启动新的网络设备)

    # cd ~/armsystem # sudo ./run_qemu

    而已!!!

    现在我们可以编写一个测试应用程序,在qemu中编译并运行:

    #include<stdio.h> void main(void) { puts("hello"); } # arm-none-linux-gnueabi-gcc -o app ./a.c # cp ./app ~/armsystem/outfs/

    现在我们还可以构建复杂的应用程序,内核模块等(下一篇文章……)

     

    Processed: 0.015, SQL: 9