我有一些关于堆栈的问题。
答案 0 :(得分:33)
堆栈总是在RAM中。堆栈指针保存在CPU的寄存器中,指向堆栈顶部,即堆栈顶部位置的地址。
答案 1 :(得分:9)
答案 2 :(得分:3)
你在谈论哪个CPU?
有些可能包含 用于callstacks的内存,有些内存包含可以用于callstack但需要操作系统实现callstack管理代码的内存,和其他人根本不包含可写内存。例如,x86架构往往在CPU中内置了一个或多个code caches and data caches。
某些CPU或操作系统实现使特定内存区域不可执行的操作。例如,为了防止基于堆栈的缓冲区溢出,许多操作系统使用hardware and/or software-based data execution prevention,这可能会阻止堆栈内存作为代码执行。有些不;完全有可能使用x86 CPU数据高速缓存行来存储callstack和要在更快的内存中执行的代码。
EIP听起来像是IA32 CPU架构的注册表。如果您指的是IA-32,那么是的,这是一个CPU操作,尽管许多操作系统会将其切换到RAM或从RAM模拟多任务处理。
答案 3 :(得分:0)
在现代架构中,堆栈被映射到 ram 中。 C、C++、Pascal 等编程语言可以在 ram 中分配内存,这称为堆分配,其他与函数共存的变量是堆栈分配的。 这要求处理器和操作系统考虑在 ram 段内映射堆栈。对于带有内存管理单元的处理器,它可以位于内存中的任何位置。然而,intel 8080 有一个状态位指示它何时从堆栈读取/写入,因此堆栈可以与 RAM 物理隔离。我不知道是否实现了这样的机器,但想想情况,C指针指向什么内存,堆或堆栈。 如果堆栈分离越来越流行,我们应该在现代编程语言中使用堆栈指针和堆指针。