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