Beaglebone 上的 Jazelle
Posted
技术标签:
【中文标题】Beaglebone 上的 Jazelle【英文标题】:Jazelle on Beaglebone 【发布时间】:2012-10-15 21:55:35 【问题描述】:我需要在我的 Beaglebone 上的 Linux 上运行 Java 应用程序。我知道 ARM 内核确实支持 Jazelle 技术以在硬件中执行 Java 字节码。无论如何,我不清楚利用这项技术需要什么。我需要以某种方式“激活” Jazelle 吗?我需要一个能识别 Jazelle 的 Java 虚拟机吗?部署和运行利用 Jazelle 技术的 Java 软件的流程是什么?使用 Jazelle 是否需要许可证?
谢谢。
【问题讨论】:
【参考方案1】:Jazelle 是 ARM 架构中的一种执行模式,它“为 Java 虚拟机 (JVM) 执行字节码的硬件加速提供架构支持” - 引用自 ARM 架构手册。
看起来 Jazelle 也有两种口味; DBX 和 RCT。以下文字来自Cortex-A 系列程序员指南 (v3)。
2.2.2 JazelleJazelle-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 Card 实现中,您确实希望通过一个微型芯片来提供大量性能。这个真正受限的域可以通过直接在 cpu 上执行字节码来利用一些额外的提升。
然而,与 Java 在典型桌面上首次亮相时相比,大多数现代 嵌入式 系统(如 Beaglebone)已经拥有更多的内存和 CPU 能力,这使得 Jazelle-DBX 不再是必需的。这主要是因为您将 JIT 编译到本机主机。 (JIT 实现对于 Java Card 来说太大了。)
ThumbEE / Jazelle-RCT 的实用性也值得怀疑。引用android-porting discussion:
通过所有这些来获得免费的空指针检查并不能使 很有意义。
最后,我不知道有任何 Java VM 实现使用任何 Jazelle 风格,包括 Android 的 Dalvik。 如果我必须在嵌入式设备上运行 Java,我会选择; Dalvik、JamVM 或 Java SE Embedded。
【讨论】:
顺便说一句,ThumbEE 已被弃用。【参考方案2】:你需要去http://infocenter.arm.com。 beaglebone 使用的是 ARMv7 的 Cortex-A8。在左侧的 Cortex-A 系列处理器下,Cortex-A8 获得最新的手册 r3v2 (rev 3.2)。在 ARM Architecture 下展开 Reference Manuals,您需要 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、拇指和 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 内核,我得到的印象是你去购买软件库。
Jazelle 文档似乎是您必须联系 ARM 才能访问的那种。所以我不知道如何实际使用它。
在 ARM 中进一步阅读。 ID_ISAR1寄存器显示为1表示
0b0001
在 PSR 中添加 BXJ 指令和 J 位。
此设置可能表示 Jazelle 扩展的简单实现。
然后,ID_PFR0 寄存器的 ARM ARM 描述比 TRM 包含更多信息,它说
Jazelle 扩展的一个简单实现由值 0b0001 表示。
0b0001 是我们在该寄存器中为该字段读取的内容。
我挖掘得越多,这似乎是一个“微不足道的实现”,这对我来说意味着“不存在”。 JMCR 寄存器表明,如果它是一个简单的实现,那么读取应该返回为零(RAZ)并且写入应该被忽略(WI),它们是,我写了一个,读回它是一个零。尽管如此,我尝试了 BXJ 指令,它仍然执行了 arm 代码。
【讨论】:
【参考方案3】:基本上,作为产品供应商,您从 ARM 获得许可(付费)在 Jazelle 技术上启用和运行您的代码的能力。费用将基于预测数量、实际结果等。我不熟悉实际的价格水平。当进入/退出 Java 代码时,需要某些代码片段来将 CPU 切换到不执行字节代码。除非您为特权付费,因为设备供应商 Jazelle 无法运行并且可以被悄悄忽略。第一代 Jazelle 解决了在 RAM 空间受限的系统上快速执行 Java 的需求,而在此之前,字节码解释器是唯一可用的选项。 JIT 需要 RAM 进行编译,早期的手机通过减小内存大小来优化低成本。一些最早的音乐手机使用 Jazelle 来提高 MIDlet 执行性能,但在随后的产品中,内存很快增长到适应各种多媒体智能手机级别的功能。然后 JIT 编译器变得可行,并且在整体性能方面实际上表现出色。 Jazelle 在大多数情况下只是将字节码映射到机器码中的二进制文件,并且可以说“不能比字节码运行得更快”。虽然 JIT 有时可以将某些系列的字节码序列映射到一个有效的本机代码,该本机代码运行得比它一次基于单个字节码操作更快。所以早期的 Jazelle 模式已经不再有用了。 RAM 的增长使 JIT 更加可行。
【讨论】:
以上是关于Beaglebone 上的 Jazelle的主要内容,如果未能解决你的问题,请参考以下文章
Beaglebone Black 和 Qt 上的 ALSA 问题:-lasound 未找到
从 beaglebone black 上的文件实时转码 1080p 流的选项