【问题标题】:Is stack in CPU or RAM?堆栈在 CPU 还是 RAM 中?
【发布时间】:2013-03-04 05:24:57
【问题描述】:

我有几个关于堆栈的问题。

  1. 堆栈在 CPU 还是 RAM 中?
  2. 堆栈是运行 OPcode 的地方吗?
  3. EIP 是在 CPU 还是 RAM 中?

【问题讨论】:

  • 这些是不相关的问题。不,处理器指令很少在堆栈中。 EIP寄存器与堆栈无关,只是在调用函数时将其压入堆栈并在返回时从堆栈中弹出。

标签: memory stack cpu opcode eip


【解决方案1】:

在现代架构中,堆栈映射在 ram 中。 ar C、C++、Pascal 等编程语言可以在 ram 中分配内存,这称为堆分配,而与函数一起存在的其他变量是堆栈分配的。 这要求处理器和操作系统考虑在 ram 段内映射堆栈。对于带有内存管理单元的处理器,它可以位于内存中的任何位置。然而,英特尔 8080 有一个状态位指示它何时从堆栈读取/写入,因此堆栈可以实现与 RAM 物理隔离。我不知道是否实现了这样的机器,但想想这种情况,C 指针指向什么内存,堆或堆栈。 如果堆栈分离得到普及,我们应该在现代编程语言中使用堆栈指针和堆指针。

【讨论】:

    【解决方案2】:

    你说的是哪个 CPU?

    1. 有些可能包含 用于调用堆栈的内存,有些包含 用于调用堆栈但需要操作系统实现调用堆栈管理代码的内存,而其他则根本不包含可写内存。例如,x86 架构倾向于在 CPU 中内置一个或多个code caches and data caches

    2. 某些 CPU 或操作系统会执行使特定内存区域无法执行的操作。例如,为了防止基于堆栈的缓冲区溢出,许多操作系统使用hardware and/or software-based data execution prevention,这可能会阻止堆栈内存作为代码执行。有些; x86 CPU 数据缓存线完全有可能用于将调用堆栈和要在更快内存中执行的代码存储。

    3. EIP 听起来像是 IA32 CPU 架构的寄存器。如果您指的是 IA-32,那么是的,这是一个 CPU 操作,尽管许多操作系统会将其切换到 RAM 或从 RAM 切换以模拟多任务。

    【讨论】:

    • x86 架构中的缓存完全无关紧要,缓存除了提高性能外,没有任何作用。防止在堆栈中执行指令与堆栈的工作方式无关。 EIP 寄存器只不过是一个指向内存位置的指针。它不是 CPU 操作或 任何东西,除了 指针。堆栈实现依赖于处理器这一点非常重要。
    • 抱歉,堆栈中指令执行的阻止是相关的,因为问题询问堆栈是否是运行 OPcode 的地方。
    • @user34660 由于这个问题没有被标记为[x86],我们不能假设这个问题只针对常见的x86配置;我们必须假设其他架构也被考虑在内,除非 OP 另有特别说明。
    【解决方案3】:

    堆栈位于 RAM 中而不是 CPU 中。如下图所示,一个段专用于堆栈:

    来自Wiki

    堆栈区包含程序堆栈,一个 LIFO 结构,通常 位于内存的较高部分。

    【讨论】:

      【解决方案4】:

      堆栈始终在 RAM 中。有一个堆栈指针保存在 CPU 的一个寄存器中,指向堆栈的顶部,即堆栈顶部位置的地址。

      【讨论】:

      • +1 用于指定cpu中的一个寄存器指向栈
      • 这取决于处理器。一些处理器没有堆栈。处理器通常将主存储器用于堆栈数据,但堆栈也由堆栈寄存器和处理器指令和应用程序组成。如果没有机器指令或一些东西可以压入堆栈并从堆栈中弹出,堆栈是不可能工作的。
      猜你喜欢
      • 2017-04-17
      • 2010-11-06
      • 1970-01-01
      • 2013-09-25
      • 2019-07-06
      • 2010-11-15
      • 2016-02-04
      • 2012-04-08
      • 2011-04-08
      相关资源
      最近更新 更多