[讨论] 请教:Java 字节码如何执行的

JianLeiXing 2014-04-22
JVM在使用解释器执行过程中,执行Java的某个方法最终会调用如下的函数:
StubRoutines::call_stub()(
        (address)&link,
        // (intptr_t*)&(result->_value), // see NOTE above (compiler problem)
        result_val_address,          // see NOTE above (compiler problem)
        result_type,
        method(),
        entry_point,
        args->parameters(),
        args->size_of_parameters(),
        CHECK
      );

其中StubRoutines::call_stub() 会返回一个CallStub类型的函数指针(如下),该指针的值实际是StubRoutines::_call_stub_entry的值
typedef void (*CallStub)(
    address   link,
    intptr_t* result,
    BasicType result_type,
    methodOopDesc* method,
    address   entry_point,
    intptr_t* parameters,
    int       size_of_parameters,
    TRAPS
  );


StubRoutines::_call_stub_entry 的初始化在如下:
**************************************************************************
init_globals

stubRoutines_init1

......

generate_initial(){
......
StubRoutines::_call_stub_entry              =
      generate_call_stub(StubRoutines::_call_stub_return_address);
......
}
**************************************************************************
address generate_call_stub(address& return_address) {
    StubCodeMark mark(this, "StubRoutines", "call_stub");
    address start = __ pc();

-中略-

    // stub code
    __ enter();
    __ movptr(rcx, parameter_size);              // parameter counter
    __ shlptr(rcx, Interpreter::logStackElementSize); // convert parameter count to bytes
    __ addptr(rcx, locals_count_in_bytes);       // reserve space for register saves
    __ subptr(rsp, rcx);
    __ andptr(rsp, -(StackAlignmentInBytes));    // Align 

-中略-

  return start;
}

问题1:generate_call_stub 方法实现的一堆汇编指令是如何作为CallStub类型的方    法的实现?
问题2:CallStub方法中的entry_point的地址是不是method的字节码起始地址。
RednaxelaFX 2014-04-23
JianLeiXing 写道
问题1:generate_call_stub 方法实现的一堆汇编指令是如何作为CallStub类型的方    法的实现?
问题2:CallStub方法中的entry_point的地址是不是method的字节码起始地址。

问题1:啥都不用做。把那段机器码的起始地址当作指针,强制转换为CallStub类型就完事了。参见这个例子:http://rednaxelafx.iteye.com/blog/428721

问题2:传入CallStub的entry_point是method->from_interpreted_entry()。不是“字节码”起始地址,而是解释器的方法入口处理函数。
对多数还在解释执行的普通Java方法来说,这会指向解释器的zerolocals_entry。
请参考HLLVM群组之前两帖,
http://hllvm.group.iteye.com/group/topic/39806
http://hllvm.group.iteye.com/group/topic/37707
Global site tag (gtag.js) - Google Analytics