Caching 缓存中的所有数据都必须在主内存中吗?

Caching 缓存中的所有数据都必须在主内存中吗?,caching,memory,virtual-memory,tlb,Caching,Memory,Virtual Memory,Tlb,我在研究虚拟内存、TLB及其与缓存的关系: 我不明白最后一句话“不可能”背后的原因——如果页面不在内存中,则缓存中不允许数据,如果有人能给我解释一下,我将不胜感激。TLB和缓存的目的是最大限度地减少内存查找和遍历,同时为内存管理单元本身内置的页面交换机制的程序生成完整的分段内存 为了在页面中找到确切的内存位置,通常首先检查缓存,如果它丢失了,tlb和内存管理单元将负责交换适当的页面,并使其看起来像在那里一样。实际上,任何程序数据都驻留在内存管理单元提供的页面中,除非您明确告诉它利用硬件功能,否则

我在研究虚拟内存、TLB及其与缓存的关系:


我不明白最后一句话“不可能”背后的原因——如果页面不在内存中,则缓存中不允许数据,如果有人能给我解释一下,我将不胜感激。

TLB和缓存的目的是最大限度地减少内存查找和遍历,同时为内存管理单元本身内置的页面交换机制的程序生成完整的分段内存

为了在页面中找到确切的内存位置,通常首先检查缓存,如果它丢失了,tlb和内存管理单元将负责交换适当的页面,并使其看起来像在那里一样。实际上,任何程序数据都驻留在内存管理单元提供的页面中,除非您明确告诉它利用硬件功能,否则无法逃避内存管理。它们都将完整的虚拟内存空间视为自己的,并且硬件负责地址转换

GivenSource是一个真值表,它列出了所有可能的状态和状态的结果。 最后两种情况是,缓存被命中,但数据实际上不存在于物理内存中,这是不可能实现的。因为数据并不存在,程序试图访问任何内存段中的无效内存位置,所以缓存命中/未命中是不可能的,并且运行时或操作系统会引发内存异常

如果您想了解更多信息,请从英特尔8086、80286、80386等高级微处理器以及一些RISC机器的案例研究开始,了解硬件寄存器如何在软件中用于监控用户程序

祝你学习愉快

编辑: 为了给这个答案提供更多的背景,这里有几点:

操作系统与具有特殊寄存器位的MMU一起进行内存管理,两者都离不开彼此的共同努力。 交换的数据实际上是在那个里传输的,但应用程序总是看到从0x0到最大值的完整地址空间,这是在数据管理上下文中声明的。 给定的表类似于所有可能性的真值表。如果数据不存在,程序将永远不会命中缓存或tlb,因此它被标记为不可能状态,这样的状态在状态机方面是无效的。 出于安全原因,程序及其基指针始终以不干扰其他程序的方式保存


在外部访问内存是内存冲突,并且在该机制之上有许多支持通过编程API访问内存的机制

当操作系统交换虚拟内存页时,属于分配给虚拟页的物理页的所有缓存项都必须刷新。如果不是这样,那么下一个分配物理页的进程可能会在不应该的时候获得缓存命中,并从另一个进程的内存中读取数据!这是一个明显的安全隐患,因此在缓存中包含属于交换出页面的数据确实是不可能的


但是,即使数据仍在缓存中,在这种情况下也不可能获得缓存命中。这是因为缓存数据通常按其物理地址进行标记,如果没有有效的虚拟到物理内存地址转换,您将无法访问正确的缓存项。

非常感谢。因此,他们的解释是不正确的。这不是不可能的,因为缓存中不允许数据,但如果没有translation@Afonso事实上,在这一点上错的是我。我已经更正了我的答案。大部分答案都是好的,但有几点模棱两可/不正确。1.页面管理由操作系统而不是MMU执行。2.交换的数据不仅让它看起来像在那里,而且让它看起来像在那里。或者,为了保持你原来的措辞,它看起来像是从那里开始的。3.OP描述的情况下的缓存命中不是无关的,它是不可能的,因为缓存的数据是通过其物理地址访问的,而且缓存中有交换出的页面的数据是一种安全隐患,因为它可能被另一个进程读取。我尝试用普通语言回答大多数问题,因为OP可能不具备所有的体系结构知识,任何其他读者都会知道TLB在哪里,MMU和缓存来自。除此之外,还有很多更深层次的话题需要更清晰的解释,以及关于计算机如何在金属层面工作的背景知识。