Use qemu user mode to run RISC‐V JDK - openeuler-riscv/riscv-port-jdk8u GitHub Wiki

注意需要先按照 Preparation 构建好编译环境

当交叉编译出JDK镜像以后,我们可以使用qemu user mode来快速对镜像进行验证,避免反复拷贝镜像到开发板。

获取qemu源码并解压

wget https://download.qemu.org/qemu-8.2.5.tar.xz
tar -xJvf qemu-8.2.5.tar.xz

构建步骤

cd qemu-8.2.5
./configure --target-list=riscv64-softmmu,riscv64-linux-user --prefix=$HOME/qemu-8.2.5-riscv64
make && make install

验证安装是否正确

$ $HOME/qemu-8.2.5-riscv64/bin/qemu-riscv64 --version

出现类似如下输出,则安装成功

qemu-riscv64 version 8.2.5
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

运行JDK

使用 Preparation 中的工具链的sysroot以及 Building JDK‐8 zero VM for RISC‐V platforms 中构建出的镜像,将<path-to-qemu>等替换为实际路径即可:

$ <path-to-qemu>/bin/qemu-riscv64 -L <path-to-toolchain>/sysroot <path-to-jdk>/bin/java -version

使用脚本包裹二进制文件

当需要设置JAVA_HOME来进行SPECjvm2008等测试的时候无法添加qemu相关命令,所以可以使用shell脚本来包裹jdk镜像bin目录下面的二进制文件,并且手动填写里面包含qemu和sysroot,脚本如下:

#!/bin/sh

sysroot=<path-to-toolchain>/sysroot
QEMU=<path-to-qemu>/bin/qemu-riscv64
JAVA_HOME=<path-to-jdk>
# e.g. 
# sysroot=/home/openeuler/riscv64/sysroot
# QEMU=/home/openeuler/qemu-8.2.5-riscv64/bin/qemu-riscv64
# JAVA_HOME=/home/openeuler/riscv-port-jdk8u/build/linux-riscv64-normal-zero-release/images/j2sdk-image

cd $JAVA_HOME/bin
for i in `ls|grep -v "\-bak$"`
do 
    if [ -f $i ]
    then
        if [ -f ${i}-bak ]
        then 
            continue
        fi
    echo $i
        mv $i ${i}-bak
        echo "#!/bin/sh" > ${i}
        echo "export JAVA_HOME=$JAVA_HOME" >> ${i}
        echo "$QEMU -L $sysroot \$JAVA_HOME/bin/${i}-bak \"\$@\"" >> ${i}
        chmod +x ${i}
    fi
done

将脚本中的 sysroot、QEMU 以及 JAVA_HOME(此处为编译构建生成的的JDK镜像,非源码或者bootJDK)分别修改为具体的目录,随后保存(存储路径无要求)为prepare.sh。 执行脚本:

$ bash prepare.sh 

此时可以直接执行java -version:

$ /home/openeuler/riscv-port-jdk8u/build/linux-riscv64-normal-zero-release/images/j2sdk-image/bin/java -version
openjdk version "1.8.0_452-internal"
OpenJDK Runtime Environment (build 1.8.0_452-internal-openeuler_2025_03_10_15_16-b00)
OpenJDK 64-Bit Zero VM (build 25.452-b00, interpreted mode)