这涉及基本的计算机架构,即具有堆栈的架构,没有特别的堆栈。
对于FILO(先进后出)方法,如Intel x86,您使用推送和弹出,但什么表示或确定推送了什么?
例如,我想推送一个“变量”,比如说......我们知道芯片中的所有东西都是两伏的二进制位、逻辑驱动电路、门电路、晶体管等。当我推送一个字节时,它包含的地址用二进制表示,如下所示:1000 0101、133或85(十六进制),一个值被移动到堆栈中......以下是一些问题:
1.堆栈在芯片中的确切位置?
2.芯片上堆栈的配置如何启用/禁用进出堆栈的数据块?
3.在多任务环境中,通常有多个堆栈。额外堆栈是如何或从哪里来的?
我知道这可能离题了,但我想从硬件方面更好地了解堆栈本身。不,我不想看到印版的图片,我知道这个想法,但我想设想数据如何进入堆栈,堆栈的确切位置,它在芯片中的位置,以及它是如何配置的。
1条答案
按热度按时间swvgeqrz1#
你的问题很有意思,而且一点也不主观,我想这个问题不会就此结束。
首先,我更愿意把栈称为LIFO方法--后进先出。FILO是等价的,但它不是很常见,事实上,我想我从来没有听说过它。
1.堆栈在芯片中的具体位置?
没有存储堆栈的“芯片”这样的东西。堆栈存储在内存中,当你发出
push
指令时,你将那个值推到内存中。CPU不保存堆栈--它有一些寄存器,但是push
和pop
总是使用内存。堆栈在内存中的什么位置?嗯,有一个寄存器,堆栈指针寄存器,栈顶的内存地址。汇编器可以为你初始化这个地址,或者你可以手工初始化(这取决于你工作的环境)。如果你真的想深入这个主题,想想CPU是如何工作的:它只不过是一堆逻辑电路,带有一个控制单元,用于对指令进行解码,并激活或禁用必要的位和端口。当你在汇编源文件中写入
push
时,汇编程序会将其转换为一堆位,代表操作码和指令的参数。稍后,在执行过程中,CPU的控制单元将对此信息进行解码。它查看操作码,然后说:“嘿,这是一个推送指令。嘿,你,内存,准备写入。”它最终将访问互连CPU和内存的总线,通过该总线发送二进制数据,激活写入标志,并指示存储在堆栈指针寄存器中的值作为目标地址。在深处,它所做的只是激活一系列总线和位以写入存储器位置。写入的二进制数据来自于你传递给
push
的任何参数。如果它是一个寄存器,那么在它传递给内存总线之前,CPU的寄存器文件会被访问以读取值。写入内存后,堆栈指针仅递增到下一个内存位置。
pop
则相反:它递减堆栈指针,然后读取存储在该位置的任何内容(这可以不同,例如,在push
中,您可以写入然后递增,或者您可以递增然后写入,您只需在push
和pop
中保持一致)。您可以相对快速地在汇编中实现堆栈,我建议您这样做-这是一个很好的练习,将为您提供有用的知识。
2.芯片上堆栈的配置如何启用/禁用进出堆栈的数据块?
堆栈只不过是一个特殊的内存位置,您可以使用堆栈指针寄存器来跟踪它。递增和递减此寄存器将允许您读取任意堆栈位置。如果您将此寄存器更改为完全不同的内存位置,您现在就拥有了另一个堆栈。
push
和pop
不是魔术,它只是阅读内存,递增或递减堆栈指针。3.在多任务环境中,通常有多个堆栈。额外的堆栈是如何或从哪里来的?
同样,所有的东西都在内存中。在多任务环境中,每个进程都有自己的上下文。在给进程CPU时间之前,操作系统内核代码会恢复进程上下文,这样进程本身甚至不会意识到发生了什么。进程的上下文包括寄存器的状态--也包括堆栈指针。所以,当进程被带回CPU时,它的堆栈指针寄存器将指向HIS堆栈--它在内存中被用作堆栈的位置,因为内核存储了该信息,并将其放回那里供进程使用,就像在此期间什么都没有发生一样。
请始终记住,在不同的层,内存位置由L1、L2和L3缓存插入,以加快公共访问。
比特就是这样流动的...