【发布时间】:2023-03-12 08:04:01
【问题描述】:
如上所述,当调用setjmp(jmp_buf env) 时,x86-64 处理器上的jmp_buf 需要进入什么软件可见的处理器状态?什么处理器状态没有?
我已经阅读了很多关于setjmp 和longjmp 的信息,但找不到我的问题的明确答案。我知道它依赖于实现,但我想知道 x86_64 架构。
来自following implementation
似乎在 x86-64 机器上,所有被调用方保存的寄存器(%r12-%r15、%rbp、%rbx)以及堆栈指针、程序计数器和当前环境的所有已保存参数都需要保存。不过我不确定,希望有人能帮我澄清一下。
【问题讨论】:
-
如果 glibc 实现这么说,是什么让你认为它不正确?
-
我只是不确定我对代码的理解,因为我对汇编和 C 比较陌生。
-
你是在问 glibc 是这样做的,还是 glibc 所做的是否正确,还是别的什么?
-
我一般问的是在 x86-64 架构上的 jmp_buf 中需要什么样的处理器状态。不是 glibc 所做的或它是否正确。例如,需要保存哪些 x86-64 寄存器?条件标志呢?例如,我认为浮点寄存器不需要保存,因为它们对程序的状态没有贡献。
-
问什么不会被保存可能更容易。不会保存所有调用方保存的寄存器。调用
setjmp就像任何其他函数一样。调用者必须在调用setjmp之前保留调用者寄存器(易失性)。在 x86-64(和 x86)上,这些数据通常通过将它们推送或存储到非易失性寄存器来保存到堆栈中。因为这个数据已经保存了,jmp_buf需要自己关心保存所有非易失性(被调用者保存)寄存器。
标签: c assembly x86 x86-64 setjmp