【发布时间】:2013-03-04 05:24:57
【问题描述】:
我有几个关于堆栈的问题。
- 堆栈在 CPU 还是 RAM 中?
- 堆栈是运行 OPcode 的地方吗?
- EIP 是在 CPU 还是 RAM 中?
【问题讨论】:
-
这些是不相关的问题。不,处理器指令很少在堆栈中。 EIP寄存器与堆栈无关,只是在调用函数时将其压入堆栈并在返回时从堆栈中弹出。
标签: memory stack cpu opcode eip
我有几个关于堆栈的问题。
【问题讨论】:
标签: memory stack cpu opcode eip
在现代架构中,堆栈映射在 ram 中。 ar C、C++、Pascal 等编程语言可以在 ram 中分配内存,这称为堆分配,而与函数一起存在的其他变量是堆栈分配的。 这要求处理器和操作系统考虑在 ram 段内映射堆栈。对于带有内存管理单元的处理器,它可以位于内存中的任何位置。然而,英特尔 8080 有一个状态位指示它何时从堆栈读取/写入,因此堆栈可以实现与 RAM 物理隔离。我不知道是否实现了这样的机器,但想想这种情况,C 指针指向什么内存,堆或堆栈。 如果堆栈分离得到普及,我们应该在现代编程语言中使用堆栈指针和堆指针。
【讨论】:
你说的是哪个 CPU?
有些可能包含 用于调用堆栈的内存,有些包含 可 用于调用堆栈但需要操作系统实现调用堆栈管理代码的内存,而其他则根本不包含可写内存。例如,x86 架构倾向于在 CPU 中内置一个或多个code caches and data caches。
某些 CPU 或操作系统会执行使特定内存区域无法执行的操作。例如,为了防止基于堆栈的缓冲区溢出,许多操作系统使用hardware and/or software-based data execution prevention,这可能会阻止堆栈内存作为代码执行。有些不; x86 CPU 数据缓存线完全有可能用于将调用堆栈和要在更快内存中执行的代码存储。
EIP 听起来像是 IA32 CPU 架构的寄存器。如果您指的是 IA-32,那么是的,这是一个 CPU 操作,尽管许多操作系统会将其切换到 RAM 或从 RAM 切换以模拟多任务。
【讨论】:
[x86],我们不能假设这个问题只针对常见的x86配置;我们必须假设其他架构也被考虑在内,除非 OP 另有特别说明。
【讨论】:
堆栈始终在 RAM 中。有一个堆栈指针保存在 CPU 的一个寄存器中,指向堆栈的顶部,即堆栈顶部位置的地址。
【讨论】: