CPU 缓存如何适应这一点?

CPU 缓存如何适应这一点?

所以我明白了它们是如何连接在一起的。指令存储在寄存器中,EIP/RIP 指向操作这些寄存器(程序代码)的操作码。

但是我无法理解大缓存与可用的有限大小寄存器之间的关系。

答案1

嗯……当您从主内存请求某些内容时,CPU 会首先在缓存中查找。如果它在那里找到它(缓存命中),它就会很快。如果没有找到(缓存未命中),它必须转到较慢的 RAM。然后可能会将其添加到缓存中,在此过程中踢出其他内容,以加快未来的访问速度。

现代 CPU 可以有每个核心的缓存、几个核心之间共享的缓存以及整个 CPU 的缓存。通常,较小、更具体的缓存速度更快 - 但价格昂贵和/或占用太多空间,因此最终会得到多个级别的缓存,每个级别都更慢、更大,以及非常大且非常慢的主 RAM。寄存器是最快的,但它们的空间很小,因此您无法在其中存储那么多东西 - 需要 RAM 和缓存。

这是高层次的观点。从你问题的其余部分来看,可能还不够低层次。

答案2

所以我明白了它们是如何连接在一起的。指令存储在寄存器中

不,指令存储在内存中。

EIP/RIP 指向操作这些寄存器的操作码(程序代码)

EIP/RIP 指向 CPU 将要提取下一条指令的内存位置。检索到指令时,它会加 1 或更多,并且可能会在分支、跳转或中断时完全改变。

操作码是指令的一部分,它实际上告诉 CPU 要做什么。许多指令(并非全部)都包含操作码(再次强调,实际指令或“命令”)和操作码所需的数据(“操作数”)。

一些操作码直接操作寄存器(即 MOV AX,立即数),许多操作码作为副作用间接操作寄存器(大多数数学指令在某些条件下影响 FLAGS),有些操作码除了指令指针之外根本不操作寄存器(不是很多)。

缓存是 CPU 和 RAM 之间的透明层。当执行读取内存的指令时,CPU 首先检查缓存,因为缓存速度更快,并尝试将常用数据加载到缓存中。在汇编语言程序中,您无需使用特殊指令即可实现此操作。

寄存器访问与缓存没有任何关系。寄存器可能参与计算要访问的内存位置的操作,即寄存器可以用作指针和索引(“索引”或“间接”寻址),但也可以直接在汇编语言指令中指定地址(这是“绝对”寻址模式)。现在 x86 CPU 具有透明的“寄存器重命名”功能,用于支持无序执行,但它与片上缓存无关。

在 x86 中,有一些指令可以清除缓存,有些 CPU 允许您将缓存配置为“缓存为 RAM” - CPU 仅使用缓存,根本不使用 RAM。如果需要在 RAM 初始化之前运行代码(例如系统固件或操作系统启动时),或者在不干扰 RAM 的情况下运行代码(例如操作系统崩溃处理程序),则这很有用。

相关内容