c - Jmp_buf 结构中的每个条目包含什么?

标签 c callstack setjmp

我正在运行 Ubuntu 9.10 (Karmic Koala),我查看了 jmp_buf 结构,它只是一个包含 12 个整数的数组。当我使用 setjmp 并传入一个 jmp_buf 结构时——12 个条目中有 4 个被保存下来。这 4 个条目是堆栈指针、帧指针、程序计数器和返回地址。其他 8 个条目是做什么用的?它们依赖于机器吗?另一个条目是段表基址寄存器吗?正确恢复线程/进程的环境还需要什么?我查看了手册页和其他来源,但找不到 setjmp 的汇编代码。

最佳答案

在 MacOS X 10.6.2 上,标题 <setjmp.h>最终使用 <i386/setjmp.h> ,里面写着:

#if defined(__x86_64__)
/*
 * _JBLEN is number of ints required to save the following:
 * rflags, rip, rbp, rsp, rbx, r12, r13, r14, r15... these are 8 bytes each
 * mxcsr, fp control word, sigmask... these are 4 bytes each
 * add 16 ints for future expansion needs...
 */
#define _JBLEN ((9 * 2) + 3 + 16)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];

#else

/*
 * _JBLEN is number of ints required to save the following:
 * eax, ebx, ecx, edx, edi, esi, ebp, esp, ss, eflags, eip,
 * cs, de, es, fs, gs == 16 ints
 * onstack, mask = 2 ints
 */

#define _JBLEN (18)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];

#endif

您可能会在 Linux 上找到类似的要求 - jmp_buf包含足够的信息来存储必要的状态。而且,要使用它,您真的不需要知道它包含什么;您需要做的就是相信实现者是正确的。如果您想更改实现,那么您当然需要理解它。

注意 setjmp 和 longjmp 是非常机器特定的。阅读 Plauger 的“The Standard C Library”以讨论实现它们所涉及的一些问题。更现代的芯片使其更难以真正很好地实现。

关于c - Jmp_buf 结构中的每个条目包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1823778/

相关文章:

检查输入是否已输入到数组中

c - 创建二叉树的指针问题

无法让 alarm() 工作两次以上

c - 机器如何理解操作系统内核代码

c - 如何知道重命名期间哪个文件失败?

jquery - 当 jQuery 处理程序中抛出异常时,调用堆栈会丢失

r - 将函数调用强制转换为字符串

javascript - .defineProperty 方法期间调用堆栈和 this 的行为

exception - OCaml 内部结构 : Exceptions

c - 使用 setjmp 和 longjmp