Using Zephyr as User OS

This tutorial describes how to run Zephyr as the User OS on the ACRN hypervisor. We are using Kaby Lake-based NUC (model NUC7i5DNHE) in this tutorial. Other ACRN supported platforms should work as well.

Introduction to Zephyr

The Zephyr RTOS is a scalable real-time operating-system supporting multiple hardware architectures, optimized for resource constrained devices, and built with safety and security in mind.

Steps for Using Zephyr as User OS

  1. Build Zephyr

    Follow the Zephyr Getting Started Guide to setup the Zephyr development environment.

    The build process for ACRN UOS target is similar to other boards. We will build the Hello World sample for ACRN:

    $ cd samples/hello_world
    $ mkdir build && cd build
    $ cmake -DBOARD=acrn ..
    $ make
    

    This will build the application ELF binary in samples/hello_world/build/zephyr/zephyr.elf.

  2. Build grub2 boot loader image

    We can build grub2 bootloader for Zephyr using boards/x86/common/scripts/build_grub.sh which locate in Zephyr Sourcecode.

    $ ./boards/x86/common/scripts/build_grub.sh x86_64
    

    The EFI executable binary will be found at boards/x86/common/scripts/grub/bin/grub_x86_64.efi.

  3. Preparing the boot device

    $ dd if=/dev/zero of=zephyr.img bs=1M count=35
    $ mkfs.vfat -F 32 zephyr.img
    $ sudo mount `sudo losetup -f -P --show zephyr.img` /mnt
    

    Create the following directories.

    $ sudo mkdir -p /mnt/efi/boot
    $ sudo mkdir -p /mnt/kernel
    

    Copy zephyr.elf and grub_x86_64.efi

    $ sudo cp boards/x86/common/scripts/grub/bin/grub_x86_64.efi /mnt/efi/boot/bootx64.efi
    $ sudo cp samples/hello_world/build/zephyr/zephyr.elf /mnt/kernel
    

    Create /mnt/efi/boot/grub.cfg containing the following:

    set default=0
    set timeout=10
    
    menuentry "Zephyr Kernel" {
        multiboot /kernel/zephyr.elf
    }
    

    Unmount the loopback device:

    $ sudo umount /mnt
    

    You now have a virtual disk image with a bootable Zephyr in zephyr.img. If the Zephyr build system is not the ACRN SOS, then you will need to transfer this image to the ACRN SOS (via, e.g, a USB stick or network )

  4. Follow Getting started guide for Intel NUC to boot “The ACRN Service OS”

  5. Boot Zephyr as User OS

    On the ACRN SOS, prepare a directory and populate it with Zephyr files.

    $ mkdir zephyr && cd zephyr
    $ cp /usr/share/acrn/samples/nuc/launch_zephyr.sh .
    $ cp /usr/share/acrn/bios/OVMF.fd .
    

    You will also need to copy the zephyr.img created in the above section into directory zephyr.

    Run the launch_zephyr.sh script to launch Zephyr as UOS.

    $ sudo ./launch_zephyr.sh
    

    Then Zephyr will boot up automatically. You will see a console message from the hello_world sample application:

    Hello World! acrn