本文是根据Maxine-VM官方文档对于RISC-V的支持进展进行的调研与在Fedora(on QEMU)虚拟机上的搭建测试
简介
Maxine VM是一个几乎全部以Java代码实现(只有用于启动Java虚拟机的加载器使用C语言编写)的元循环Java虚拟机。
这个项目于2005年开始,到现在仍然在发展之中,它有先进的即时编译器和垃圾收集器,可在宿主模式或独立模式下执行,其执行效率已经接近HotSpot虚拟机Client模式的水平。后来有了从C1X编译器演进而来的Graal编译器的支持,就更加如虎添翼,执行效率有了进一步飞跃。
Graal编译器现在已经是HotSpot的默认组件,是未来代替HotSpot中服务端编译器的希望。
状态
Maxine VM团队正在RISC-V上开发和测试Maxine VM的环境,目前依靠QEMU处理器仿真器在其上运行Maxine VM。架构操作系统Boot Java版本MaxineVM版本
RISC-V64Fedora 31 (on QEMU)OpenJDK8 (u222)2.9.0
解释器和编译器Maxine不含解释器(interpreter),它声称使用非常快速的基准编译器。请参阅T1X编译器。
Maxine提供了两个优化的编译器,C1X和Graal。前者是Hostpot客户端编译器(C1)的演进,官方文档中宣称非常稳定,但不再开发。Graal更类似于Hotspot服务器编译器(C2),并且正在积极开发和改进。默认映像构建仍将C1X用作优化编译器,但是可以选择Graal,用于运行时编译和VM引导映像(后者目前是不稳定的)。要将Graal作为运行时优化编译器来构建启动映像:
mx image @c1xgraal在这种情况下,优化编译器实际上是C1X和Graal的混合体,如果Graal编译失败,则将C1X用作备用选项。请注意,包括Graal在内,VM启动映像要大得多(大约100MB)。
要使用Graal编译引导映像本身:
mx image @c1xgraal-boot
mx是一种用于管理Java代码开发的命令行工具。
尝试在Fedora(on QEMU)上运行Maxine-VM
假定Ubuntu版本至少为16.04,并且已搭建好交叉编译环境和Fedora (on QEMU)。
Maxine-VM通用的生成和使用说明
Maxine 的构建过程依赖于MX工具。要获取它并将其添加到您的PATH执行中:
export WORKDIR=/home/linux/opt/maxine-src # Modify this line
sudo apt-get install python # MX depends on python
mkdir -p $WORKDIR
cd $WORKDIR
git clone https://github.com/graalvm/mx
export PATH=$PATH:$(pwd)/mx
Maxine还依赖于openJDK8,要从ubuntu存储库中获取它,请运行:
sudo apt-get install openjdk-8-jdk
为了构建maxine,我们首先需要定义许多环境变量:定义要使用的目录:
export WORKDIR=$WORKDIR # Modified last step
定义要使用的JDK:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
定义MAXINE_HOME:
export MAXINE_HOME=$WORKDIR/maxine
构建与RISC-V兼容的Maxine VM镜像
需要完成上述的Maxine-VM通用的生成和使用说明,并且根据实际的环境配置修改CC参数
mx clean
CC=riscv64-unknown-linux-gnu-gcc TARGETISA=riscv64 mx build
mx image -platform linux-riscv64
这样就会在$WORKDIR/maxine/com.oracle.max.vm.native下生成所需要的VM镜像
在Fedora RISC-V VM上运行Maxine VM
现在需要将生成的图像复制到QEMU中运行的Fedora RISC-V VM:
scp -P 3333 -r /home/linux/opt/maxine-src/maxine/com.oracle.max.vm.native root@localhost:~/
之后步骤都是在Fedora虚拟机中进行,在进入下面的步骤之前,需要安装java-1.8.0-openjdk:
dnf install java-1.8.0-openjdk-devel.riscv64java-1.8.0-openjdk.riscv64 : OpenJDK Runtime Environment 8 (only include jre)
java-1.8.0-openjdk-devel.riscv64 : OpenJDK Development Environment 8
后者名称中包含jdk实际安装后发现只含有jre,因此需要安装前者
之后可以在Fedora虚拟机运行Maxine VM:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export LD_LIBRARY_PATH=/home/riscv/maxine-src/maxine/com.oracle.max.vm.native/generated/linux
/home/riscv/maxine-src/maxine/com.oracle.max.vm.native/generated/linux/maxvm本质上可以相当于命令java。
HelloWorld测试
HelloWorld.java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld!");
}
}
在RISC-V上尝试用Maxine VM的HelloWorld部分暂时告一段落
(补充)使用docker搭建Maxine VM开发环境
官方构建文档对于构建过程已经描述的足够详细,这里补充一下实际构建过程中遇到的几个问题执行sudo docker-compose up --no-start提示
ERROR: Volume maxine-dev-mx-sync declared as external, but could not be found. Please create the volume manually using `docker volume create --name=maxine-dev-mx-sync` and try again.
解决方法:根据提示执行
sudo docker volume create --name=maxine-dev-mx-sync
执行sudo docker-compose up --no-start提示
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running? 主要原因是docker不是系统服务方式启动。 解决方法: 1、启动docker服务 service docker start 2、生成自启动服务 systemctl enable docker.service 3、查看服务状态,Active状态为:active(running) systemctl status docker.service