我正在运行Ubuntu9.10(业考拉),并且我看了看 jmp_buf 结构,该结构只是一系列的12个int.当我用 setjmp, ,并通过在一个 jmp_buf 结构—4出的12项是保存关闭。这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的“标准C库”为所涉及的一些问题的讨论在执行这些。更现代的芯片使其难以实现真的很好。

其他提示

setjmp/longjmp/sigsetjmp 高度依赖的CPU系统结构、操作系统和线程模型。第一个着名的两个功能(或臭名昭着的—根据你的POV)出现在原始的Unix内核,作为一个"结构化"的方式来放松的一个失败的系统调,作为从i/o错误或其他令人讨厌的情况。

该结构的评论意见/usr/include/setjmp.h(Linux Fedora)说 叫环境,再加上可能保存的信号遮罩。 它包括/usr/include/比特/setjmp.h声明jmp_buf有一系列的六个32位整数,显然具体的x86家庭。

虽然我不能找到源 PPC执行情况, ,意见有合理的暗示,FPU设置应该是保存。这是有道理的,因为无法恢复舍入模式,默认的操作数长度、例外处理,等等。会令人惊讶。

这是典型的系统工程师保留一个小小的更多的空间比实际需要,在这样一个结构。一些额外的字节是几乎没有任何东西汗—尤其是考虑到罕见的实际使用的 setjmp/longjmp.具有空间太小,肯定是一个危险。最突出的理由我可以认为是具有额外而不是被当场上—是,如果运行时的图书馆版本的改变需要更多的空间jmp_buf,通过具有额外的空间已经保留,就没有必要重新编译程序的参考。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top