目录
JVM完成对函数的入参空间计算后,接下来进行栈空间分配,具体的方式上一篇日志总结了,就是入参数量乘上当前操作系统环境指针的宽度,例如32位系统指针宽度为4个字节,64位宽度为8个字节,最后加上调用者函数现场保存过程中寄存器的值,即:
入参数量 * 4(或8)字节 + 4(假设有4个寄存器) * 4(或8)字节
也就是说,调用函数总的方法栈空间,除了和入参数量,入参类型有关,还要加上一些寄存器的大小,方法栈内除了保存参数数据,还要保存某些寄存器的值,这些寄存器的作用不可忽视。
现场保存
在方法栈空间分配完成后,执行具体的被调用函数指令前,还需要做一件事,那就是现场保存,JVM使用CS:IP段寄存器执行具体的函数机器指令,CS寄存器保存段地址,IP寄存器保存偏移地址,两者结合起来确定了待执行函数的首地址,所以发生函数调用时,CS:IP段寄存器会从调用者函数跳转到被调用者函数中,两个寄存器的值也会发生改变,CPU根据两者的值来执行被调用者函数。这里有一个问题,此时CS:IP段寄存器里的值已经从指向调用者函数,变成了指向被调用者函数,那么当函数调用完成后,如何回到调用者函数中,继续执行下面的指令。

本文详细介绍了JVM在函数调用过程中如何进行现场保存,包括基地址和变址寄存器的处理,以及参数如何压栈。在函数调用前,JVM会保存调用者函数的现场,如CS:IP段寄存器、EDI、ESI和EBX寄存器的值,并将这些值压入被调用者函数的栈中。在参数压栈时,JVM遵循逆序压栈的规则,从调用者函数的栈顶开始将参数复制到被调用者函数的栈中,最后调用entry_point执行Java方法。
最低0.47元/天 解锁文章
1557

被折叠的 条评论
为什么被折叠?



