【问题标题】:Access cpu registers访问 CPU 寄存器
【发布时间】:2014-11-26 15:51:44
【问题描述】:

有什么方法可以像在 Assembly 中一样从 Java 访问/修改 cpu 的寄存器? (eax、rip、ax 等) 我不知道它是否会以任何方式有用,但我认为它会很有趣。

有没有办法像在 c / c++ 中一样获得变量的“保存点”:

&variable

提前致谢,希望你明白我的意思。

【问题讨论】:

  • Akim,如果你的 Java 程序在 ARM/MIPS/PowerPC/软件模拟上运行会发生什么?无法获取对象或变量的地址 - JVM 可以随意移动它们。
  • 这是可能的,但您将依赖于底层架构应用程序或库。我不认为 java 是为了在那个级别上工作。
  • 简答无。长答案是的,但是您需要使用本机代码。 JNI 或 JNA。
  • 有趣的问题,但是我认为这根本不是 Java 的意思!!!

标签: java assembly cpu cpu-registers


【解决方案1】:

简短回答:

Java 以跨平台字节码编译。组装是特定于平台的。

关于“保存点”,它们在 c/c++ 中称为指针,而在 Java 中,您正在操作引用。

有关指针和引用的更多详细信息,请参阅Pointers in Java

【讨论】:

  • 你确定这不可能吗?例如本机方法?
  • @Maksym 我认为“不”作为“不可能”是对问题“我不知道它是否有用,但我认为它会是很有趣”。如果 OP 甚至不知道 JVM 和 JIT(或 AOT)内部发生了什么,那么试图破解 JNI 调用或 JVM 内部状态的一些副作用并不是走向“有用的东西”的方法
  • 我不是说这个功能的可用性......问题是“有没有办法从Java访问/修改cpu的寄存器”......我们不知道作者在做什么,也许他为另一个使用寄存器的程序编写了一些技巧。如果你问我是否会为此使用 Java,我的答案是不会,但我们不能说这是不可能的。
  • @Maksym 虽然JVM 可以访问CPU 寄存器,并且通过JNI 接口(或JNA)附加到JVM 的本机代码也可以访问CPU 注册它并不意味着有办法从Java 访问CPU 寄存器(“..就像在汇编中一样..”)。另见cs.princeton.edu/~appel/papers/safejni.pdf(和meta.stackexchange.com/a/43020/259228
【解决方案2】:

由于 Java 在虚拟机中运行,因此无法访问低级硬件,例如 CPU 的寄存器。尤其是因为它们的表示和存在可能会从一个系统更改为另一个系统。此外,访问寄存器也可能违反安全规定。

您也无法仅使用 java 来确定对象的内存地址。也因为程序驻留在所述虚拟机中。您可能会获得 JVM 堆内存中的位置。

【讨论】:

    【解决方案3】:

    你不应该这样做。 Java 是一种高级语言,无需使用 cpu 寄存器即可处理您的任务。事实上,如果需要优化,JVM 可以使用 cpu 寄存器。

    您可以使用 volatile 保护 CPU 缓存的使用。

    反正你可以尝试写自己的native方法,不知道会不会成功。

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 2021-03-25
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多