Skip to content
forked from syswonder/hvisor

a Rust Hypervisor for mission-critical system

License

Notifications You must be signed in to change notification settings

Axsl666/sysHyper

 
 

Repository files navigation

sysHyper

Static Badge GitHub

Contributors GitHub Repo stars GitHub commit activity (branch)

GitHub code size in bytes GitHub repo size GitHub top language

Armv8 hypervisor based on Linux & implemented in Rust,porting from RVM1.5 & jailhouse

Progress

  • arch_entry
  • cpu
  • logging
  • exception
  • gicv3
  • memory
  • ....

Platform

  • qemu
  • imx
  • ti
  • rpi4

环境配置

安装rust

首先安装 Rust 版本管理器 rustup 和 Rust 包管理器 cargo,为了在国内加速访问,可以设置使用中科大的镜像服务器。

export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
curl https://sh.rustup.rs -sSf | sh  

最好把 Rust 包管理器 cargo 镜像地址 crates.io 也替换成中国科学技术大学的镜像服务器,来加速三方库的下载。 打开或新建 ~/.cargo/config 文件,并把内容修改为:

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git:https://mirrors.ustc.edu.cn/crates.io-index"

qemu模拟器编译

sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
              gawk build-essential bison flex texinfo gperf libtool patchutils bc \
              zlib1g-dev libexpat-dev pkg-config  libglib2.0-dev libpixman-1-dev git tmux python3 ninja-build  # 安装编译所需的依赖包
wget https://download.qemu.org/qemu-7.0.0.tar.xz  # 下载源码
tar xvJf qemu-7.0.0.tar.xz   # 解压
cd qemu-7.0.0
./configure   #生成设置文件
make -j$(nproc)   #编译
qemu-system-aarch64 --version   #查看版本

qemu版本>7.2需要额外配置,否则在启动时可能出现以下问题

network backend user is not compiled into this binary

需要在编译前进行以下设置:

sudo apt install libslirp-dev 
../configure --enable-slirp

编译完成后可以sudo make install将 Qemu 安装到 /usr/local/bin 目录下, 也可以编辑 ~/.bashrc 文件(如果使用的是默认的 bash 终端),在文件的末尾加入:

export PATH=$PATH:/path/to/qemu-7.0.0/build

启动qemu

mkdir qemu-test    # 新建一个文件夹用来测试
git submodule update --init --recursive    # 更新子模块
cp -r test-img/* qemu-test   #将所需的文件传入测试文件夹
cd qemu-test/host
./test.sh    #启动qemu

linux默认用户密码为root/root

编译sysHyper

在host执行

make     #编译得到hypervisor镜像rvmarm.bin
make scp   #将得到的rvmarm.bin文件传入qemu上运行的linux

运行sysHyper

将必要的文件传入guest linux:

scp -P 2333 -r qemu-test/guest/* root@localhost:~/

在guest linux中

./setup.sh  #设置文件路径
./enable.sh   #运行sysHyper,开启虚拟化
cat /proc/cpuinfo   #查看当前linux cpuinfo
jailhouse cell create configs/qemu-arm64-gic-demo.cell  #新建一个cell,将cpu 3 移出root cell
cat /proc/cpuinfo   #查看当前linux cpuinfo,cpu3被shutdown了
jailhouse disable  # 关闭虚拟化

output

应该可以看到hypervisor运行打印的一些信息

调试

可以使用vscode进行可视化调试,在原有qemu命令末尾加上-s -S

qemu-system-aarch64 \
-drive file=./rootfs.qcow2,discard=unmap,if=none,id=disk,format=qcow2 \
-device virtio-blk-device,drive=disk \
-m 1G -serial mon:stdio  \
-kernel Image \
-append "root=/dev/vda mem=768M"  \
-cpu cortex-a57 -smp 4 -nographic -machine virt,gic-version=3,virtualization=on \
-device virtio-serial-device -device virtconsole,chardev=con \
-chardev vc,id=con  \
-net nic \
-net user,hostfwd=tcp::2333-:22 -s -S

先启动qemu,然后按F5即可开始调试

原版jailhouse

在开发调试的过程中,为了方便与原版jailhouse做对比,还提供了v0.12版本的原版jailhouse运行环境:

  • test-img/host/jail-img 内核
  • test-img/guest/jail 原版jailhouse编译生成文件 运行命令为:
qemu-system-aarch64 \
-drive file=./rootfs.qcow2,discard=unmap,if=none,id=disk,format=qcow2 \
-m 1G -serial mon:stdio -netdev user,id=net,hostfwd=tcp::23333-:22 \
-kernel jail-img \
-append "root=/dev/vda mem=768M"  \
-cpu cortex-a57 -smp 16 -nographic -machine virt,gic-version=3,virtualization=on \
-device virtio-serial-device -device virtconsole,chardev=con -chardev vc,id=con -device virtio-blk-device,drive=disk \
-device virtio-net-device,netdev=net

在guest中:

cd jail
insmod ./jailhouse.ko
cp jailhouse.bin /lib/firmware/
./jailhouse enable configs/qemu-arm64.cell

本项目的相关文档在 https://github.com/syswonder/report

About

a Rust Hypervisor for mission-critical system

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 97.2%
  • Assembly 2.0%
  • Makefile 0.8%