Jazelle在Beaglebone上的应用

11

我需要在我的Beaglebone上运行基于Linux的Java应用程序。我知道ARM核有支持Jazelle技术在硬件中执行Java字节码。但是我不清楚我需要利用这项技术所需的条件。我需要以某种方式“激活”Jazelle吗?我需要一个支持Jazelle的Java虚拟机吗?部署和运行利用Jazelle技术的Java软件的流程是什么?使用Jazelle需要许可证吗?

谢谢。

3个回答

8

Jazelle是ARM架构中的一种执行模式,它“为Java虚拟机(JVM)的字节码执行提供硬件加速的体系结构支持”-引自ARM架构手册。

看起来还有两种Jazelle的变体; DBX和RCT。下面的文本摘自Cortex-A系列程序员指南(v3)。

2.2.2 Jazelle
Jazelle-DBX(直接字节码执行)在ARMv5TEJ中引入,以加速Java性能同时节省电力。随着内存可用性的增加和即时编译器(JIT)的改进,许多ARMv7-A处理器不实现此硬件加速,因此其价值已经降低了。
Jazelle-DBX最适合在内存非常有限的系统中提供高性能Java(例如功能手机或低成本嵌入式应用程序)。在今天的系统中,它主要用于向后兼容性。 2.2.3 Thumb Execution Environment(ThumbEE)
在ARMv7-A中引入和要求使用ThumbEE有时被称为Jazelle-RCT(运行时编译目标)。它涉及对Thumb指令集进行小的更改,使其成为受控环境中在运行时生成的代码的更好目标(例如,由管理语言如Java、Dalvik、C#、Python或Perl)。
ThumbEE旨在由即时编译器(JIT)或预先编译器(AOT)使用,其中它可以减少重新编译代码的代码大小。托管代码的编译超出了本文档的范围。
据我所知,Jazelle-DBX的大部分用途是在Java Card实现中,这里你真的希望通过直接在CPU上执行字节码来获得大量性能。然而,大多数现代嵌入式系统(如Beaglebone)已经拥有比Java首次出现时的典型台式机更多的内存和CPU功率,这使得Jazelle-DBX不再必要。这主要是因为您可以将JIT编译成本地主机。(JIT实现对于Java卡来说太大了。)
ThumbEE / Jazelle-RCT的有用性也值得怀疑。引用自android-porting讨论

通过所有这些来获得免费的空指针检查并没有多少意义。

总之,我不知道有任何使用包括Android Dalvik在内的Jazelle版本的Java虚拟机实现。 如果我必须在嵌入式设备上运行Java,我会选择DalvikJamVMJava SE Embedded之间。

2
顺便提一下,ThumbEE已经被弃用了。 - Igor Skochinsky

7
您需要前往http://infocenter.arm.com。BeagleBone使用Cortex-A8处理器,其为ARMv7体系结构。在Cortex-A系列处理器下,左侧选择Cortex-A8并获取最新手册r3v2(rev 3.2)。在ARM体系结构下扩展“参考手册”,您需要的是ARMv7-AR(截至本文撰写时,issue C是最新版本)。
以此信息为基础,我的示例网址如下:http://github.com/dwelch67/beaglebone_samples
我的BeagleBone示例特点如下:
12345678                                                                        
Hello World!                                                                    
413FC082                                                                        
410330C3                                                                        
00000000                                                                        
00001131                                                                        
00000011                                                                        
00000000                                                                        
00000000                                                                        
00000000                                                                        
00000002                                                                        
13112111                                                                        
00000000                                                                        
00000000                                                                        
00000002                                                                        
12345678               

看起来这是一个r3p2(rev 3.2)核心。根据手册,支持ThumbEE、Jazelle、thumb和ARM。

现在令人困惑的是ti网站上的TRM和ARM trm都说支持Jazelle,直到你关注这个:

Jazelle扩展

Cortex-A8处理器提供了Jazelle扩展的简单实现。这意味着处理器不会加速任何字节码的执行,所有字节码都由软件例程执行。

在Jazelle扩展的实现中:

不支持Jazelle状态

BXJ指令的行为类似于BX指令。

这告诉我们一些事情。这真的意味着这个处理器中没有Jazelle硬件,尽管其他地方说有吗?

它还向我们展示了要运行jazelle代码,您需要使用bxj进行切换,就像切换arm和thumb模式一样。所以我试了一下:

.globl bxjtest
bxjtest:
    ldr r0,=skip
    bxj r0
    mov r0,#1
    bx lr
skip:
    mov r0,#2
    bx lr

看起来汇编器已经实现了bxj指令

82000064 <bxjtest>:
82000064:   e59f0044    ldr r0, [pc, #68]   ; 820000b0 <GET32+0x8>
82000068:   e12fff20    bxj r0
8200006c:   e3a00001    mov r0, #1
82000070:   e12fff1e    bx  lr

82000074 <skip>:
82000074:   e3a00002    mov r0, #2
82000078:   e12fff1e    bx  lr

但代码返回该地址处指令的2。不确定这是否有任何意义,也许还有其他需要做的事情才能使Jazelle工作。但我印象中那里真的没有Jazelle核心,我觉得你必须购买软件库。
Jazelle文档似乎是需要联系ARM才能获取访问权限的那种。所以,我真的不知道怎么使用它。
在ARM中更深入地阅读后,ID_ISAR1寄存器显示1,表示添加了BXJ指令和PSR中的J位。
这个设置可能表明了Jazelle扩展的一个简单实现。
然后,在ID_PFR0寄存器的ARM ARM描述中,比TRM提供更多信息,它说:
值为0b0001表示对Jazelle扩展进行了一个简单的实现。
而0b0001就是我们在该寄存器字段中读取到的值。
我挖掘得越深,这似乎就是一个"简单的实现",对我来说意味着"不存在"。JMCR寄存器显示如果是一个简单实现,那么读取应该返回零(RAZ),写入应该被忽略(WI),而它们确实是这样,我写了一个1,读取回来是0。尽管如此,我还是尝试了BXJ指令,但它仍然执行ARM代码。

3
基本上,作为产品供应商,您需要从ARM(支付费用)获取启用和运行Jazelle技术的代码的许可。收费将基于预测的数量、实际结果等因素。我不熟悉实际价格水平。在进入/退出Java代码时,需要某些代码片段来切换CPU以退出字节码执行。除非您作为设备供应商付费使用,否则Jazelle无法运行并且可能会被忽略。第一代Jazelle是对有限RAM空间系统上迅速执行Java的需求的回答,在此之前,字节码解释器是唯一可用的选项。JIT需要RAM进行编译,早期手机通过减小内存大小来优化低成本。一些最早的音乐手机使用Jazelle来提高MIDlet执行性能,但在后续产品中,内存很快增长以适应各种多媒体智能手机级别的功能。然后JIT编译器变得可行,并且实际上在整体性能方面表现出色。Jazelle主要将字节码映射到机器代码中的二进制代码中,因此“不能比字节码运行得更快”。虽然JIT有时可以将某些字节码序列映射到有效的本地代码,使其比逐个字节码操作更快。因此,早期的Jazelle模式不再真正有用。RAM增长使JIT更加可行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接