• 说说安腾处理器的双栈设计


    去年的时候,我曾提到,在安腾(Itanium)处理器上有两个栈。
    传统上的”栈”(包括SP寄存器所指的那个栈)是一个手动管理的内存块,函数可以从中分配空间以在执行期间使用。
    举个例子,如果你声明一个局部变量:
    TCHAR szBuffer[MAX_PATH];

    那么,这个缓冲区将会在上面所说的栈中分配内存。
    但是,不是所有的局部变量都分配在这个栈中。

    回想一下,安腾处理器上有大量的寄存器,其中大部分都参与函数调用。 因此,许多局部变量被放置在寄存器中而不是栈中,当调用函数时,这些寄存器被处理器所占用,而在函数返回时释放。 他们在哪里得到这些内存空间? 处理器通常可以将它们存储到其他未使用的寄存器中,这项技术比较复杂晦涩,我暂时不细说 (那些仍然感兴趣的人,可以阅读英特尔关于该主题的文档。)如果处理器用完了这些寄存器,它就会转为使用主存储器,进入一个称为“寄存器后备存储”的地方。 这是另一个与传统栈类似栈内存块。

    如前所述,这种双栈设计模型的一个结果是,栈溢出不会破坏函数返回地址,因为返回地址没有保存在传统栈上,相反,它保存在寄存器中或(在寄存器不够的情况下)在寄存器后备存储中。

    双栈设计另一个结果是,各种定位堆栈开始的技巧只会找到其中一个堆栈。 如果你认为对该栈进行前后偏移,能找到所有可访问的对象引用,那么错过另一个栈将导致问题。

    安腾架构挑战了许多假设,并且对各种技术上非法但没有人会真正执行的恶作剧更加不会宽容,其中一些我在之前的文章中已经讨论过。
    今天可以在这个列表中加上新的主题了,我将其命名为:”第二个栈”。

    总结

    安腾:不好意思,我设计过于先进导致提前结束了生命周期。
    F22:我也一样哈。

    最后

    Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
    本文来自:《The Itanium’s so-called stack》

  • 相关阅读:
    【GO】LGTM_Grafana_Tempo(2)_官方用例改后实操
    报错 | devtools工具安装问题
    微信小程序动态海报
    20 个提升效率的 JS 简写技巧
    Java应用工程结构
    手把手教你在项目中引入Excel报表组件
    实战| 记一次shiro序列化到接管服务器
    代码随想录训练营day3:链表part1
    两性养生网站源码 生活类减肥网站源码 健康网模板源码 支持QQ登录和百度主动推送
    Docker实践:使用Docker搭建个人开发环境(极简版)
  • 原文地址:https://blog.csdn.net/mmxida/article/details/126793729