32位x86也可以按x64这么设计,不过因为32位ABI当时就那么定了,得用代码动态建立exception handler chain。
转一个比较:www dot osronline dot com /article.cfm%5earticle=469.htm
因为在 x86 上,每个使用 SEH 的函数都将上述结构作为其序言的一部分,所以据说 x86 使用基于帧的异常处理。这种方法有几个问题:
由于异常信息存储在堆栈上,因此很容易受到缓冲区溢出攻击。
高开销。异常就是异常,这意味着在常见情况下不会发生异常。无论如何,每次输入使用 SEH 的函数时,都会执行这些额外的指令。
由于 x64 是一个消除数十年来许多弊端的机会,SEH 进行了彻底改革,解决了上述两个问题。在 x64 上,SEH 已经变成基于表的,这意味着在编译源代码时,会创建一个表来完整描述模块内的所有异常处理代码。然后将该表存储为 PE 标头的一部分。如果发生异常,Windows将解析异常表以找到合适的异常处理程序来执行。由于异常处理信息安全地隐藏在 PE 标头中,因此它不再容易受到缓冲区溢出攻击。此外,由于异常表是作为编译过程的一部分生成的,因此在正常处理期间不会产生运行时开销(以push和pop指令的形式)。
当然,基于表的异常处理方案本身也有一些负面影响。例如,基于表的方案往往比基于堆栈的方案占用更多的内存空间。此外,虽然正常执行路径中的开销减少了,但处理异常所需的开销明显高于基于帧的方法。与生活中的一切一样,在评估基于表的异常处理方法还是基于帧的异常处理方法是否“最佳”时,需要考虑权衡。
【 在 hgoldfish 的大作中提到: 】
: 也就是说这个是 windows 针对 PE 格式的特殊规定。
: 32 位不支持纯粹只是因为 32 位 windows 不支持,而不是因为什么处理器的限制是吧?
:
--
FROM 222.128.162.*