我需要在Beaglebone上的Linux之上运行Java应用程序。我知道ARM内核确实支持Jazelle技术在硬件中执行Java字节码。无论如何,我不清楚我需要什么来利用这项技术。我需要以某种方式"激活"Jazelle吗?我需要一个支持Jazelle的Java虚拟机吗?部署和运行利用Jazelle技术的Java软件的流程是什么?使用Jazelle需要许可证吗?
谢谢。
Jazelle是ARM体系结构中的一种执行模式,它"为Java虚拟机(JVM)执行字节码的硬件加速提供体系结构支持"-引用自ARM体系结构手册。
看起来还有两种口味的Jazelle;DBX和RCT。以下文本来自Cortex-A系列程序员指南(v3)
2.2.2Jazelle
Jazelle DBX(直接字节码执行)是在ARMv5TEJ中引入的,用于加速Java性能,同时节省电源。内存可用性的提高和JIT编译器的改进降低了它在应用程序中的价值处理器。因此,许多ARMv7-a处理器没有实现这种硬件加快Jazelle DBX最适合在非常有限的系统中提供高性能Java内存(例如功能手机或低成本嵌入式使用)在当今的系统中,它主要用于向后兼容性
2.2.3 Thumb执行环境(ThumbEE)
在ARMv7-A中引入并要求ThumbEE,有时被称为Jazelle RCT(运行时编译目标)。它涉及对Thumb指令集的小更改它是在受控环境中运行时生成代码的更好目标(例如,通过Java、Dalvik、C#、Python或Perl等托管语言)。ThumbEE被设计为由实时(JIT)或提前(AOT)编译器使用,在那里它可以减少重新编译的代码的代码大小。托管代码的编译在外部本文件的范围。
据我所知,Jazelle DBX的大部分用途都是在Java卡实现中,您真的希望通过一个小芯片提供大量性能。这个真正受限的域可以通过直接在cpu上执行字节码来利用一些额外的提升。
然而,大多数现代嵌入式系统,如Beaglebone,已经比Java在当时的典型台式机上首次亮相时拥有了更多的内存和cpu能力,这使得Jazelle DBX不再必要。这主要是因为您可以将JIT编译到本机主机。(JIT实现对于Java卡来说太大了。)
ThumbEE/Jazelle RCT的有用性也值得怀疑。引用安卓移植讨论:
通过所有这些来获得免费的空指针检查并不能很有道理。
总之,我不知道有任何Java VM实现使用任何Jazelle风格,包括Android的Dalvik。如果我必须在嵌入式设备上运行Java,我会在两者之间进行选择;Dalvik、JamVM或Java SE Embedded。
您需要转到http://infocenter.arm.com.beaglebone使用Cortex-A8,它是ARMv7。在左侧的Cortex-A系列处理器下,Cortex-A8获得最新的手册r3v2(版本3.2)。在ARM架构下,展开您想要的ARMv7 AR的参考手册(问题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(版本3.2)核心。正如手册所说,支持ThumbEE、Jazelle、thumb和ARM。
现在令人困惑的是ti网站上的TRM,ARM TRM都说Jazelle是受支持的,直到你关注这个:
Jazelle扩展
Cortex-A8处理器提供了Jazelle扩展的琐碎实现。这意味着处理器不会加速任何字节码的执行,所有字节码都由软件例程执行。
在Jazelle扩展的实施中:
不支持Jazelle状态
BXJ指令的行为与BX指令类似。
这告诉我们一些事情。这真的意味着这个处理器中没有Jazelle硬件吗?尽管其他地方说是这样?
它还向我们展示了要运行jazelle代码,你可以bxj到达那里,就像你bx在手臂和拇指模式之间切换一样。所以我试了一下:
.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
但是该代码从该地址的arm指令返回一个2。不知道这是否意味着什么,也许你还需要做其他事情才能让贾泽工作。不过我觉得那里真的没有jazelle核心,我觉得你去买软件库。
Jazelle文档似乎是那种你必须联系ARM才能访问的文档。所以我不知道更多关于如何实际使用它的信息。
在ARM中进一步阅读。ID_ISAR1寄存器显示1表示
0b0001
将BXJ指令和PSR中的J位相加。
此设置可能表示Jazelle扩展的实现微不足道。
说,然后,ID_PFR0寄存器的ARM ARM描述比TRM有更多的信息
Jazelle扩展的琐碎实现由值0b0001表示。
0b0001是我们为寄存器中的字段读取的值。
我挖掘得越多,这就越像是一个"琐碎的实现",对我来说意味着"不存在"。JMCR寄存器显示,如果它是一个微不足道的实现,那么读取应该返回为零(RAZ),写入应该被忽略(WI),它们就是这样,我写了一个1,读回来它是零。即便如此,我还是尝试了BXJ指令,它仍然执行arm代码。
基本上,作为一家产品供应商,您可以从ARM获得在Jazelle技术上启用和运行代码的许可(付费)。费用将基于预测数量、实际结果等。我不熟悉实际的价格水平。在输入/退出Java代码时,需要某些代码片段来切换CPU执行字节外代码。除非你支付特权,否则设备供应商Jazelle是不可操作的,可以被悄悄忽略。第一代的Jazelle解决了在RAM空间有限的系统上快速执行Java的需求,在此之前,字节码解释器是唯一可用的选择。JIT需要RAM进行编译,早期的手机通过降低内存大小进行了低成本优化。一些最早的音乐手机使用Jazelle来提高MIDlet的执行性能,但在随后的产品中,内存很快就增长到可以容纳各种多媒体智能手机级别的功能。然后JIT编译器变得可行,并且实际上在整体性能方面表现出色。Jazelle在大多数情况下只是将字节码映射到机器代码中的二进制代码,可以说"不能比字节码运行得更快"。而JIT有时可以将某些字节码序列映射到高效的本机代码,该代码比基于单个字节码操作一次运行一个更快。因此,早期的Jazelle模式不再真正有用。RAM的增长使JIT更加可行。