我们知道以下调用约定:“前六个整数或指针参数在寄存器RDI,RSI,RDX,RCX(Linux内核接口中的R10 [17]:124),R8和R9中传递给c
/ c ++代码”基于以下文章的Linux平台。
https://zh.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions
但是,Linux平台中Java代码的调用约定是什么(假设JVM是热点)?以下是示例,哪些寄存器存储四个参数?
protected void caller( ) {
callee(1,"123", 123,1)
}
protected void callee(int a,String b, Integer c,Object d) {
}
没有指定JVM内部如何调用Java方法。各种JVM实现可能遵循不同的调用约定。这是它在 Linux x64* 上的 HotSpot JVM中的
工作方式。
*
每个Java方法都有一个进入解释器的入口。此项用于从解释方法跳转到另一解释方法。
rbx
包含指向Method*
结构的指针-所调用方法的内部元数据。r13
hold- sender_sp
调用方方法的堆栈指针。它可能与rsp + 8
使用c2i
适配器的情况有所不同(请参阅下文)。HotSpot源代码中有关解释程序条目的更多详细信息:templateInterpreter_x86_64.cpp。
编译方法具有其自己的入口点。编译代码通过该条目调用编译方法。
rsi
,rdx
,rcx
,r8
,r9
,rdi
。非静态方法将this
引用作为第一个参数rsi
。xmm0
… xmm7
寄存器中传递。assembler_x86.hpp中很好地说明了此约定:
|-------------------------------------------------------|
| c_rarg0 c_rarg1 c_rarg2 c_rarg3 c_rarg4 c_rarg5 |
|-------------------------------------------------------|
| rcx rdx r8 r9 rdi* rsi* | windows (* not a c_rarg)
| rdi rsi rdx rcx r8 r9 | solaris/linux
|-------------------------------------------------------|
| j_rarg5 j_rarg0 j_rarg1 j_rarg2 j_rarg3 j_rarg4 |
|-------------------------------------------------------|
您可能会注意到,Java调用约定看起来与C调用约定相似,但是右移了一个参数。这样做是有意避免在调用JNI方法时产生额外的寄存器改组(您知道,JNI方法JNIEnv*
在方法参数之前附加了额外的参数)。
Java方法可能还有两个入口点:c2i
和i2c
适配器。这些适配器是动态生成的代码,可将编译后的调用约定转换为解释器布局,反之亦然。с2i
和i2c
入口点分别用于从编译代码调用解释方法和从解释代码编译方法。
PS
JVM内部调用方法通常并不重要,因为这些只是最终用户不透明的实现细节。而且,即使在较小的JDK更新中,这些细节也可能会更改。但是,我至少知道一种情况,当Java调用约定的知识显得有用时-
分析JVM故障转储时。
以平台中保存外卖案例中的用户信息进行调试为例: 1.下载并解压开发工具,双击”启动WeX5开发工具.bat”,双击”启动MySQL数据库.bat”。 2.在sdudio窗口对baas 进行模型编译(调试模式),重启tomcat。 目的:这样java视图可以自动导入baasServer,不需要重新导入。 3.设置tomcat的启动方法,选择要进行调试的部分。如下图所示: 1)在工具栏中选择窗口–首选
问题内容: 我想开发一个小型Go应用程序,该应用程序向演示文稿的受众显示使用的按键快捷方式。 为了了解键盘事件,我将必须使用一些平台特定的代码。 封装平台特定代码的Go方法是什么? 我一直在寻找诸如编译器开关或平台模块之类的关键字,但我实际上找不到任何相关信息。 问题答案: 平台特定代码的解决方案是构建约束。 构建约束,也称为构建标记,是开始的行注释 列出了在文件中应包含文件的条件。约束可能会出现
问题内容: 有人知道Oracle在哪里可以找到描述Java代码约定的文档吗? 该URL不再可用,因此我为此主题创建了新问题。 http://www.oracle.com/technetwork/java/codeconv-138413.html 问题答案: 一种选择是使用Wayback机器,该机器似乎包含文档(这是pdf版本的直接链接)。但是,我也很想知道Oracle对它做了什么,他们是否打算摆脱
本文向大家介绍在i386和x86-64上UNIX和Linux系统调用的调用约定是什么,包括了在i386和x86-64上UNIX和Linux系统调用的调用约定是什么的使用技巧和注意事项,需要的朋友参考一下 系统调用是应用程序和Linux内核之间的基本接口。当Unix / Linux程序执行文件I / O,网络数据传输或调用某个与低级指令直接或间接交互的进程时,就会涉及系统调用。进行这些调用通常涉及使
问题内容: Linux内核代码中的EXPORT_SYMBOL_GPL是什么? 下面是一段代码,其中包含EXPORT_SYMBOL_GPL 该宏在内核代码中多次出现。 问题答案: 将某些符号(例如函数)定义为可导出(从内核可加载模块中看到)是宏。如果该符号没有“ EXPORT_SYMBOL”,则将无法从模块访问该符号。 将仅在GPL许可的模块中显示该符号,并且-在具有任何许可的模块中显示该符号。 h
在 Python 社区有一些指导你格式化代码的约定。如果你使用 Python 进行了一段时间开发,那么你可能已经熟悉了这些约定。我会继续让事情简单些并且留下一些 URLs,如果以前你还没有碰过这些话题的话你能够在这里 URLs 中找到更多的信息。 让我们来个 PEP 动员! PEP 是“Python 增强倡议”,这些倡议是被索引以及托管在 python.org。在索引中,PEPs 被分成了几类,包