CPU|说说安腾处理器的双栈设计

CPU|说说安腾处理器的双栈设计

去年的时候 , 我曾提到 , 在安腾(Itanium)处理器上有两个栈 。
传统上的”栈”(包括SP寄存器所指的那个栈)是一个手动管理的内存块 , 函数可以从中分配空间以在执行期间使用 。
举个例子 , 如果你声明一个局部变量:
TCHAR szBuffer[MAX_PATH
;
那么 , 这个缓冲区将会在上面所说的栈中分配内存 。
但是 , 不是所有的局部变量都分配在这个栈中 。
回想一下 , 安腾处理器上有大量的寄存器 , 其中大部分都参与函数调用 。因此 , 许多局部变量被放置在寄存器中而不是栈中 , 当调用函数时 , 这些寄存器被处理器所占用 , 而在函数返回时释放 。他们在哪里得到这些内存空间? 处理器通常可以将它们存储到其他未使用的寄存器中 , 这项技术比较复杂晦涩 , 我暂时不细说 (那些仍然感兴趣的人 , 可以阅读英特尔关于该主题的文档 。 )如果处理器用完了这些寄存器 , 它就会转为使用主存储器 , 进入一个称为“寄存器后备存储”的地方 。这是另一个与传统栈类似栈内存块 。
如前所述 , 这种双栈设计模型的一个结果是 , 栈溢出不会破坏函数返回地址 , 因为返回地址没有保存在传统栈上 , 相反 , 它保存在寄存器中或(在寄存器不够的情况下)在寄存器后备存储中 。
双栈设计另一个结果是 , 各种定位堆栈开始的技巧只会找到其中一个堆栈 。如果你认为对该栈进行前后偏移 , 能找到所有可访问的对象引用 , 那么错过另一个栈将导致问题 。
【CPU|说说安腾处理器的双栈设计】安腾架构挑战了许多假设 , 并且对各种技术上非法但没有人会真正执行的恶作剧更加不会宽容 , 其中一些我在之前的文章中已经讨论过 。
今天可以在这个列表中加上新的主题了 , 我将其命名为:”第二个栈” 。
总结安腾:不好意思 , 我设计过于先进导致提前结束了生命周期 。
F22:我也一样哈 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《The Itanium’s so-called stack》