流程虚拟机如何实现回调支持?

时间:2015-03-05 16:07:07

标签: callback stack vm-implementation

序言:此问题被视为VM实现者,希望支持本机回调(更具体地说是wndProc)。对于Process VMs,我的意思是Smalltalk,Java,Python等。

虚拟机通常非常小心进入堆栈的内容。这是因为在GC期间,它们将使用堆栈作为一组根,并且对于堆栈中的每个单词,他们必须知道它是否是指向对象的指针。

问题出现了:在回调过程中,VM会将大量内容推入堆栈。这可能只是参数和返回地址,但也可能包含更多内容。这是一个小方案,堆栈向上增长:

oop <- managed
oop <- managed
-------------- <- native code end
... bunch of native stuff ...
-------------- <- native code start
oop <- managed
oop <- managed

从回调输入后的那一点开始,作为回调编程器,可以再次控制进入堆栈的内容。但问题是,你如何控制之前发生的事情?更具体一点,您如何检测本机代码启动限制?

我猜测VM在回调类型方面有限制,只允许在我们调出时到达的回调,因此VM可以在那时保存堆栈的限制。那是对的吗?还有其他选择吗?我认为使用单独的堆栈也可能是一种解决方案,但我不确定其性能影响。

1 个答案:

答案 0 :(得分:0)

我想我回答了自己。重点是回调不能随时到达(即异步)。原因如下。

回调是一个简单的用户编写的C风格函数,它遵循调用约定。例如,在Windows中,CALLBACK类型表示stdcall。这意味着回调只会保存一些寄存器(被保存的寄存器)并可能会覆盖其他寄存器(调用者保存的寄存器)。如果在任何时刻到达回调,则运行功能将无法准备,并且调用者保存的寄存器可能会被破坏。然后,在调用完成之后,可以同步调用回调是安全的唯一时刻,确保正确保存上下文。

可能有其他类型的回调(我考虑中断例程和调试代码)可以异步,但我认为主要问题已得到解答。