【问题标题】:Why does getcontext and setjmp save different registers in glibc-x86-64为什么getcontext和setjmp在glibc-x86-64中保存不同的寄存器
【发布时间】:2014-11-20 11:24:29
【问题描述】:

以下是它们的源代码: https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/unix/sysv/linux/x86_64/getcontext.S;hb=HEAD https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/x86_64/setjmp.S;hb=HEAD

如您所见,getcontext 还保存了浮点上下文和寄存器 r8 和 r9,而 setjmp 没有。这是什么原因?

【问题讨论】:

    标签: linux glibc context-switch setjmp ucontext


    【解决方案1】:

    似乎这两个例程都是错误的。 setjmp 不应忽略浮点状态,getcontext 不应保存 r8,r9。

    参考:

    http://www.boost.org/doc/libs/1_57_0/libs/context/doc/html/context/rationale/x86_and_floating_point_env.html

    【讨论】:

    • 然后呢?您是否将此报告为错误?
    • 如果得到确认,您提到的问题看起来很严重。老实说,我希望在这种情况下会有更多的抱怨,除非这些只是参考实现并且内核提供了实际代码。你为什么不打开一个快速的ticket?他们似乎反应灵敏。我会,但我知之甚少:我只是在评估 setjmp/getcontext 的使用。
    • getcontext 应该保存 r8,r9,因为它用于保存整个线程状态,而不仅仅是从非本地跳转(例如 setjmp)返回。 ucontext_t 用于信号处理程序中以更改 SIGILL/SIGSEGV/等上的 CPU 状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-06-25
    相关资源
    最近更新 更多