dev c++ 不支持string_【Java on RISC-V】OpenJ9对于RISC-V的支持进展调研与搭建测试

本文介绍了Eclipse OpenJ9,它是高性能、可扩展的Java虚拟机,是Hotspot JVM替代产品。目前OpenJ9 OpenJDK V11暂不支持Riscv64的JIT编译器。详细阐述了在Fedora(on QEMU)上运行OpenJ9的步骤,包括安装软件包、获取源码、交叉编译及测试等。
本文是根据OpenJ9官方文档对于RISC-V的支持进展进行的调研与在Fedora(on QEMU)虚拟机上的搭建测试

简介

Eclipse OpenJ9是一种高性能、可扩展的Java虚拟机(JVM)实现。它原本是IBM Java开发工具包的一部分,许多基于Java的大型系统的企业级,生产级使用它作为组件。目前它由IBM贡献给Eclipse Foundation。OpenJ9是当前在OpenJDK中最常用的Hotspot JVM的替代产品。简单地说,OpenJ9 是一个 JVM 替代方案,可将其作为 OpenJDK 二进制文件的一部分。

而OpenJ9其自身是基于IBM开源的OMR项目所构建,OMR项目由一个高度集成的开放源码C和c++组件,可用于构建大量的语言,运行时支持许多不同的硬件和操作系统平台。这些组件包括但不限于:内存管理,线程处理,平台端口(抽象)库,诊断支持,监控支持,垃圾收集和本地实时编译。

在官方给出的测试结果中,与Hotspot相比OpenJ9有如下的优势:
1)启动时的内存占用减少了66%
2)负载稳定后的内存占用减少了63%
3)启动时间缩短了42%
4)吞吐量相近
5)在CPU受限的环境中能更快的达到最大吞吐量

状态

  • 目前的移植基于OpenJDK11+OpenJ9+OMR(无JIT),OpenJ9用以替代Hotspot
  • 目前OpenJ9 OpenJDK V11暂不支持针对Riscv64的JIT编译器,在这种情况下,无论是否-Xint在命令行上指定了该选项,JDK默认都会以相同的输出结束。

尝试在Fedora(on QEMU)上运行OpenJ9

假定Ubuntu版本至少为16.04,并且已搭建好交叉编译环境和Fedora (on QEMU)。

此外还需要:

  • bootJDK_OpenJ9,仅用于生成用于主机系统上的交叉编译的构建JDK
  • Freemarker V2.3.8

1.安装用于OpenJ9交叉编译的额外(不包括交叉编译环境和Fedora (on QEMU))的软件包

1.登录QEMU虚拟机并安装在Fedora / QEMU上构建JDK所需的开发相关的软件包:

dnf install libX11-devel libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel libXext-devel
dnf install cups-devel fontconfig-devel alsa-lib-devel freetype-devel  #freetype might be skipped if already installed
dnf install libdwarf-devel libstdc++-static #optional if the DDR is enabled for compilation on the target system
dnf install wget git autoconf automake  #mostly used in the compilation on the target system
dnf install openssl-devel  #optional if the OpenSSL support is required

2.完成上述所有安装后,按以下步骤关闭Fedora OS的电源。

poweroff

3.将Fedora OS映像挂载(mount)到主机系统以进行交叉编译

<1> sudo  partx -v -a  Fedora-Developer-Rawhide-20191123.n.0-sda.raw
partition: none, disk: Fedora-Developer-Rawhide-20191123.n.0-sda.raw, lower: 0, upper: 0
Trying to use '/dev/loop0' for the loop device
/dev/loop0: partition table type 'gpt' detected
/dev/loop0: partition #1 added
/dev/loop0: partition #2 added
/dev/loop0: partition #3 added
/dev/loop0: partition #4 added
​
<2> sudo fdisk -l /dev/loop0
Disk /dev/loop0: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AD758DB6-0843-40FD-AF2E-46FE0B9F9A42
​
Device          Start      End  Sectors  Size Type
/dev/loop0p1    2048  1230847  1228800  600M Linux filesystem
/dev/loop0p2 1230848  1230911       64   32K 
/dev/loop0p3 1232896  1249279    16384    8M 
/dev/loop0p4 1249280 20971486 19722207  9.4G Linux filesystem
​
<3> mkdir fedora_mount
​
<4> sudo mount /dev/loop0p4  fedora_mount
<your_fedora_mount_directory> ls fedora_mount
bin  boot  dev  etc  home  lib  lib64  lost+found  media
mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

2.获取构建JDK的源

克隆适用于OpenJ9的OpenJDK扩展,该扩展是OpenJDK的git镜像,没有HotSpot JVM,但带有openj9分支,其中包含一些必要的修补程序。运行以下命令:

git clone https://github.com/ibmruntimes/openj9-openjdk-jdk11.git

克隆该存储库可能需要一段时间,该过程完成后将目录更改为克隆的存储库:

cd openj9-openjdk-jdk11

现在,从Eclipse OpenJ9项目及其Eclipse OMR克隆中获取其他资源:

bash get_source.sh

3.生成用于交叉编译的构建JDK

在上一步的openj9-openjdk-jdk11文件夹下进行编译:

export JAVA_HOME=/<path_to_build_JDK>  # the build JDK here is downloaded from https://api.vm.net/v3/binary/latest/11/ga/linux/x64/jdk/openj9/normal/adoptopenjdk
export PATH="$JAVA_HOME/bin:$PATH"
​
bash configure --disable-warnings-as-errors --with-freemarker-jar=/<path_to>/freemarker.jar

官方文档中给出的上述build JDK链接如果失效,可以从此处下载替代

configure可能会出现的报错:

1.configure: error: Could not find numa!configure exiting with result code 1

sudo apt-get install libnuma-dev

2.checking for nasm... noconfigure: error: Could not find required tool for NASMconfigure exiting with result code 1

sudo apt-get install nasm

生成用于以后交叉编译的build-JDK:

make all

⚠️如果只键入make,而不是make all,构建将是不完整的,因为默认make目标是exploded-image。如果要指定make而不是make all,则必须--default-make-target=images在运行configure脚本时添加。

请将生成的build-JDK build/linux-x86_64-normal-server-release/images移至其他目录,因为在下一步中将使用此镜像进行交叉编译并且会在同目录下生成RISCV64的JDK镜像。

cd ..
mv openj9-openjdk-jdk11/build/linux-x86_64-normal-server-release/images ./

4.配置交叉编译环境

运行以下configure命令以删除现有目录后,在上一步创建交叉openj9-openjdk-jdk11目录的同一目录中设置交叉编译环境

export RISCV64=/<path_to_gnu_cross_toolchain>  #e.g. /home/linux/opt/riscv
export PATH="$RISCV64/bin:$PATH"
​
bash configure --disable-warnings-as-errors  
               --disable-ddr 
               --with-boot-jdk=/<path_to_build_JDK_for_cross_compilation>    
               --with-build-jdk=/<path_to_build_JDK_for_cross_compilation>   #the `build-JDK` created at step 3
               --openjdk-target=riscv64-unknown-linux-gnu                    #the prefix for the compiled cross-toolchain
               --with-sysroot=/<path_to_your_fedora_mount_directory> 
               --with-freemarker-jar=/<path_to>/freemarker.jar
​
#<path_to_build_JDK_for_cross_compilation> the `build-JDK` created and moved at step 3,e.g. /home/linux/opt/images/jdk
#<path_to_your_fedora_mount_directory> e.g. /home/linux/opt/fedora_mount

5.交叉编译RISCV64的JDK

现在,可以使用OpenJ9交叉构建OpenJDK了

make clean CONF=linux-riscv64-normal-server-release
make all CONF=linux-riscv64-normal-server-release

6.在Fedora / QEMU上测试JDK

[1]交叉编译完成后,卸载Fedora OS映像。

sudo umount /<path_to_your_fedora_mount_directory>

[2] qemu-system-riscv64在步骤2中使用命令通过QEMU引导Fedora :

stage4 login: root
Password: riscv
Last login: Fri Oct  4 21:21:28 from 10.0.2.2

如果您已经通过QEMU启动了另一个Fedora映像,则无需卸载并启动该Fedora映像。

[3]通过以下scp命令将压缩的JDK上传到Fedora :

主机上操作:

cd /home/linux/opt/openj9-openjdk-jdk11/build/linux-riscv64-normal-server-release
zip -r jdk.zip jdk
scp -P 3333 -r /home/linux/opt/openj9-openjdk-jdk11/build/linux-riscv64-normal-server-release/jdk.zip root@localhost:~/

开启Fedora虚拟机并操作:

[your_user_name@riscv_qemu new_dir]#unzip jdk.zip

[4]转到Fedora上的jdk目录,然后尝试运行java -version命令进行简单测试。

[your_user_name@riscv_qemu jdk]# cd bin
[your_user_name@riscv_qemu bin]# ./java -version

这是一些示例输出:

9d7ffaee62d188ebf9fb0ec64e786993.png

DaCapo-9.12-bach-MR1 [xalan](Xalan-Java Version 2.7.1)测试

d020851d56f68890e46399f7438f42d4.png

[1]参考资料:https://github.com/eclipse/openj9/blob/master/doc/build-instructions/Build_Instructions_V11.md#riscv64

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值