堆和栈的物理表示是什么?

电器工程 编程 中央处理器
2022-01-12 07:48:21

我可以很容易地理解 .bss 和代码如何在处理器中具有物理表示,该处理器具有用于程序计数器可以计数的指令的内存库,而 bss(块起始符号)只是全局数据。但是还有用于局部变量的堆栈和用于动态内存的堆。这些东西是如何物理地放在电路上的?

2个回答

注意:我主要指的是 x86,因为我最熟悉它并且它被广泛记录:

在 x86(和大多数其他架构)上,堆栈就像其他所有东西一样驻留在内存中。处理器通过一个指针来操作堆栈,该指针通常存储在一个寄存器中(堆栈指针)。push和pop指令会改变栈指针的值,改变栈顶的位置。

堆是一种软件抽象顾名思义,它只是一块 RAM,分配器将其切分并分发指针。在物理方面,堆看起来与 RAM 的任何其他部分没有任何不同。

然而,分页和分段与堆是切线相关的。它们主要与多任务处理有关,其中不允许进程修改它们没有明确拥有的 RAM。

从逻辑上讲,堆栈和堆通常只是内存;不过,在实现级别上,它们有望主要从缓存中提供服务。在大多数系统中,它们通过缓存算法动态地到达那里,但是有些系统支持在缓存或其他比通常更快的内存中的显式位置,并且可能还有那些支持留下特定数据应该优先放置在那里的提示的系统空间许可。

希望低级软件和编译器代码生成器的设计考虑到数据访问的组织,这可能会导致良好的缓存利用率,而不是不断的缓存未命中。

一些处理器有一个返回地址寄存器,它用作一种单深的显式堆栈缓存(可能也有一些具有几个深硬件堆栈的处理器,尽管没有想到示例)。