我需要在Beaglebone上的Linux上运行Java应用程序。我知道ARM内核确实支持Jazelle技术在硬件中执行Java字节码。无论如何,我不清楚我需要什么来利用这项技术。我需要以某种方式“激活”Jazelle吗?我是否需要支持Jazelle的Java虚拟机?部署和运行利用Jazelle技术的Java软件的流程是什么?使用Jazelle需要许可证吗?
谢谢。
发布于 2012-10-16 06:52:26
Jazelle是ARM体系结构中的一种执行模式,它“通过Java虚拟机(JVM)为字节码执行的硬件加速提供体系结构支持”-引用自ARM体系结构手册。
它看起来也有两种风格的Jazelle: DBX和RCT。以下文本来自Cortex-A系列程序员指南(v3)。
2.2.2 Jazelle
Jazelle DBX(直接字节码eXecution)是在ARMv5TEJ中引入的,目的是在节省能源的同时提高性能。内存可用性的增加和即时(JIT)编译器的改进相结合,降低了它在应用程序处理器中的价值。因此,许多ARMv7-A处理器没有实现这种硬件加速。
Jazelle-DBX最适合在内存非常有限的系统(例如,功能电话或低成本嵌入式应用)中提供高性能Java。在今天的系统中,它主要用于向后兼容。
2.2.3 Thumb执行环境(ThumbEE)
在ARMv7-A中引入并要求,ThumbEE有时被称为Jazelle-RCT (运行时编译目标)。它涉及到对Thumb指令集的小更改,使其成为在受控环境(例如,由诸如Java、Dalvik、C#、Python或Perl等托管语言)运行时生成的代码的更好目标。ThumbEE被设计为供即时或提前编译器使用,在这些编译器中,它可以减少重新编译代码的代码大小。托管代码的编译不在本文档的讨论范围内。
据我所知,Jazelle-DBX的大部分用途都是在Java Card实现中,在这些实现中,您确实希望通过一个很小的芯片来提供大量的性能。这个真正受限的域可以通过直接在cpu上执行字节码来利用一些额外的提升。
然而,大多数现代的Jazelle系统,比如您的Beaglebone,已经拥有比当时在典型台式机上首次亮相时更多的内存和能力,这使得Jazelle-DBX不再是必需的。这主要是因为您将JIT编译放到了本机主机上。(JIT实现对于Java Cards来说太大了。)
ThumbEE /Jazelle-RCT的有用性也值得怀疑。引用android-porting discussion
通过所有这些来获得免费的空指针检查是没有多大意义的。
总而言之,我不知道有任何Java VM实现使用任何Jazelle风格,包括Android的Dalvik。如果我必须在嵌入式设备上运行Java,我会选择Dalvik、JamVM或Java SE Embedded。
发布于 2012-10-16 13:17:09
你需要去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、拇指和手臂都是有支撑的。
现在令人困惑的是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核心,但我得到的印象是你去买软件库。
Jazelle文档似乎是那种你必须联系ARM才能访问的文档。所以我不知道更多的是如何实际使用它。
在手臂上读得更深。ID_ISAR1寄存器显示1,表示
0b0001
添加BXJ指令和PSR中的J位。
此设置可能表示Jazelle扩展的简单实现。
然后,ID_PFR0寄存器的ARM ARM描述比TRM有更多的信息,它说
Jazelle扩展的简单实现由值0b0001表示。
0b0001是我们在该寄存器中为该字段读取的值。
我越是深入挖掘,这看起来就越像是一个“微不足道的实现”,对我来说意味着“不在那里”。JMCR寄存器显示,如果它是一个简单的实现,那么读取应该返回为零(RAZ),写入应该被忽略(WI)。我写了一个1,读回它是一个零。尽管如此,我还是尝试了BXJ指令,它仍然执行arm代码。
发布于 2013-02-08 10:56:58
基本上,作为产品供应商,您需要向ARM授权(付费)在Jazelle技术上启用和运行代码的能力。费用将基于预测的数量,实际结果等。我不熟悉实际的价格水平。进入/退出Java代码时,需要某些代码片段将CPU切换到字节代码执行之外。除非你为设备供应商的特权买单,否则Jazelle是不可操作的,可以被悄悄地忽略。第一代的Jazelle满足了在RAM空间有限的系统上快速执行Java的需求,在此之前,字节码解释器是唯一可用的选择。JIT需要RAM来编译,早期的手机通过保持较低的内存大小来优化成本。一些最早的音乐手机使用Jazelle来提高MIDlet的执行性能,但在随后的产品中,内存很快就增长到可以容纳各种多媒体智能手机级别的功能。然后,JIT编译器变得可行,并且实际上在整体性能上优于其他编译器。Jazelle在很大程度上只是将字节码映射到机器码中的二进制代码,可以说“不能比字节码运行得更快”。而JIT有时可以将某些字节码序列映射到有效的本机代码,其运行速度比基于单个字节码操作一次一个的情况下运行得更快。所以早期的Jazelle模式已经不再有用了。RAM的增长使得JIT更加可行。
https://stackoverflow.com/questions/12904635
复制相似问题