Skip to content

HidenoriMatsubayashi/evisor

Repository files navigation

eVisor

Build

eVisor is a light-weight Bare Metal Hypervisor (Type 1) written in C++. This project is aimed for embedded use (ARM64 devices) and educational purposes.

eVisor demo video @ Youtube - NuttX runs on Raspberry Pi4

eVisor demo

Supported devices

  • Raspberry Pi 4 Model B (BCM2711 / aarch64 only)
  • QEMU (ARM64)

TODOs

  • Switch to clang/llvm from gcc
  • Support multi CPU cores
  • Fix temporary implementation of memory management APIs like kmm_malloc
  • Add Hypervisor system call APIs like KVM
  • Full support for vCPU interrupts
  • Support GIC version 3 and 4
  • Improve scheduling algorithm
  • Improve mmc device driver (SD data transfer speed)
  • Support Linux OS
  • Restructuring / refactoring source code

System requrements

sudo apt install cmake g++-aarch64-linux-gnu

How to build

Cross-building for ARM64 on x86_64

mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/cross-toolchain-gcc-aarch64.cmake \
      -DCMAKE_BUILD_TYPE={Debug|Release} \
      -DBOARD={raspi4|qemu} \
      -DTEST_GUEST={serial|test_app|nuttx|linux}

Self-building for ARM64 on ARM64

mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE={Debug|Release} \
      -DBOARD={raspi4|qemu} \
      -DTEST_GUEST={serial|test_app|nuttx|linux}

Examples

Raspberry Pi4 + NuttX (Guest OS)

Building

mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/cross-toolchain-gcc-aarch64.cmake \
         -DCMAKE_BUILD_TYPE=Release -DBOARD=raspi4 -DTEST_GUEST=nuttx
cmake --build .

Running

Setup SD card for Rasberry Pi4 (See config/raspi4/config.txt for the detail settings):

cp config/raspi4/config.txt <path_to_sdcard>/boot

Copy NuttX image file to the SD card:

cp examples/nuttx/nuttx.bin <path_to_sdcard>/boot

Copy eVisor image file to the SD card:

cp build/kernel.bin <path_to_sdcard>/boot/kernel.bin

Serial console / UART logs

The serial console and output logs are assigned to UART0 (GPIO 14, GPIO 15), with a baud rate of 115200bps.

sudo minicom -D /dev/ttyUSB0

QEMU + NuttX (Guest OS)

Install QEMU

sudo apt install qemu-system-arm 

Building

mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/cross-toolchain-gcc-aarch64.cmake \
         -DCMAKE_BUILD_TYPE=Release -DBOARD=qemu -DTEST_GUEST=nuttx
cmake --build .

Running

qemu-system-aarch64 -cpu cortex-a53 -smp 4 -nographic \
  -machine virt,virtualization=on,gic-version=2 -net none \
  -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline \
  -kernel ./kernel.elf -m 1G

How to debug on QEMU

qemu-system-aarch64 -cpu cortex-a53 -smp 4 -nographic \
  -machine virt,virtualization=on,gic-version=2 -net none \
  -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline \
  -kernel ./kernel.elf -m 1G \
  -d mmu,in_asm,guest_errors,int,exec,page -D qemu_trace.log

Special thanks!

Special thanks the followings since I particularly referred to them in the early stage of development.