4

I keep getting that warning little message, "The question you're asking appears subjective and is likely to be closed". But I am going to proceed on asking anyways to see if anyone here can sort out some of my confusion.

This regards basic computer architectures, i.e. ones that have stacks, none in particular.

With the FILO (first-in, last-out) approach, like with Intel x86, you use push and pop, but what signifies or determines what has been pushed?

For example, I want to push a "variable", let's say ... we know that everything in the chip is just two volt binary bits, logic-driven circuits, gates, transistors, etc. When I push, say, a byte containing the address signified in binary like this: 1000 0101, 133, or 85 (in hexadeciaml), a value is moved to the stack ... here are some questions:

1.Where exactly does the stack reside in the chip?

2.How does the configuration of the stack on the chip enable/disable blocks of data going in and out of it?

3.In a multitasking environment there's usually multiple stacks. How or where do the extra stacks come from?

I know this is likely off-topic, but I want a better vision of the stack itself from the hardware-side. No, I do not want to see pictures of plates, I get the idea, but I want to envision how the data goes to it, where exactly the stack is, what it is in the chip, and how it's configured.

Maybe Electronics.Stackexchange can help?

4

1 回答 1

2

你的问题很有趣,一点也不主观。我不认为它会被关闭。

首先,我宁愿将堆栈称为使用 LIFO 方法 - 后进先出。FILO是等价的,不过不是很常用,其实我好像没听说过。

  1. 堆栈在芯片中的具体位置是什么?

没有存储堆栈的“芯片”之类的东西。堆栈存储在内存中,当您发出push指令时,您将该值推送到内存中。CPU 不持有​​堆栈——它有一些寄存器,但push总是pop使用内存。堆栈在内存中的什么位置?嗯,有一个寄存器,堆栈指针寄存器,它指示堆栈顶部的内存地址。汇编器可以为您初始化这个地址,或者您可以手动进行(这取决于您正在使用的环境)。

如果您真的想深入探讨这个主题,请考虑一下 CPU 的工作原理:它只不过是一堆带有控制单元的逻辑电路,用于解码指令并激活或停用必要的位和端口。当您写入push汇编源文件时,汇编器会将其转换为一组表示操作码和指令参数的位。

稍后,在执行期间,CPU 的控制单元将解码此信息。它查看操作码,然后说“嘿,这是一个推送指令。嘿,你,内存,准备写入。”。它将最终访问互连 CPU 和内存的总线,通过该总线发送二进制数据,激活 WRITE 标志,并将存储在堆栈指针寄存器中的值指示为目标地址。在内心深处,它所做的只是激活一系列总线和位以写入内存位置。写入的二进制数据来自您传递给push. 如果是寄存器,则在将值传递到内存总线之前访问 CPU 的寄存器文件以读取值。

写入内存后,堆栈指针简单地递增到下一个内存位置。pop相反:它递减堆栈指针,然后读取存储在该位置的任何内容(这可能会有所不同,例如,push您可以先写入然后递增,或者您可以先递增然后再写入,您只需在两者中保持push一致pop)。

您可以相对较快地在汇编中实现堆栈,我建议您这样做 - 这是一个很好的练习,可以为您提供有用的知识。

2.片上堆栈的配置如何启用/禁用数据块进出?

堆栈只不过是一个特殊的内存位置,您可以使用堆栈指针寄存器对其进行跟踪。递增和递减此寄存器将使您可以读取任意堆栈位置。如果您将此寄存器更改为完全不同的内存位置,您现在有另一个堆栈。

push这不是魔术,pop它只是读取和写入内存,并递增或递减堆栈指针。简单的。

3.在多任务环境中通常有多个堆栈。额外的堆栈是如何或从哪里来的?

再次,一切都在记忆中。在多任务环境中,每个进程都有自己的上下文。在给进程分配 CPU 时间之前,操作系统内核代码会恢复进程上下文,因此进程本身甚至不会意识到发生了什么。进程的上下文包括寄存器的状态——还包括堆栈指针。因此,当一个进程被带回 CPU 时,它的堆栈指针寄存器将指向 HIS 堆栈——他在内存中被用作堆栈的位置,因为内核已经存储了这些信息并将其放回那里供进程使用仿佛这期间什么都没有发生。

永远记住,在不同的层,内存位置由 L1、L2 和 L3 缓存插入以加快公共访问。

这就是比特流的方式......

于 2013-11-12T23:17:29.153 回答