我已经读过传入的jmp_buf变量中的setjmp"保存程序状态",但是我还没有找到任何关于它究竟是什么的描述.它是否复制了所有应用程序的内存?只是寄存器?堆栈?
以下内容来自Peter Prinz 和 Tony Crawford 的C in a Nutshell:
该
setjmp()宏将调用时的当前环境保存在由其参数指定的缓冲区中。环境包括堆栈,以及所有具有自动存储持续时间的变量。
以下是ISO/IEC 9899:TC2在第 7.13 节中的说明:
调用
setjmp宏的环境包含足以调用longjmp函数以将执行返回到正确块并调用该块的信息,如果它是递归调用的话。它不包括浮点状态标志、打开文件或抽象机的任何其他组件的状态。
这是 PJ Plauger 在他的书The Standard C Library 中的一个有趣的参考资料:
[实现 setjmp] 的危险之一在于表达式求值。典型的计算机具有一定数量的寄存器,用于在计算表达式时保存中间结果。但是,编写一个足够复杂的表达式,您可能会用尽可用的寄存器……
setjmp必须猜测要在jmp_buf数据对象中存储多少“调用上下文” 。可以肯定的是,必须保存某些寄存器。
最后,来自Peter Van Der Linden 的Expert C Programming。
Setjmp 将程序计数器和当前指针的副本保存到堆栈顶部。
根据上述信息,在我看来,“当前环境”是由实施决定的。
根据平台 ABI,仅需要在函数调用中保留寄存器。
来源:在各种操作系统上反汇编 x86、x64、arm32、arm64 上的 setjmp。
| 归档时间: |
|
| 查看次数: |
1547 次 |
| 最近记录: |