【问题标题】:Does all the data in Cache have to be in Primary Memory? [closed]缓存中的所有数据都必须在主内存中吗? [关闭]
【发布时间】:2020-04-22 21:18:29
【问题描述】:

我正在研究虚拟内存、TLB 以及它们与缓存的关系:

Source

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

【问题讨论】:

    标签: caching memory virtual-memory tlb


    【解决方案1】:

    TLB 和 Cache 的共同目的是最大限度地减少内存查找和遍历,同时生成完整的分段内存,以便对内存管理单元本身内置的页面交换机制进行编程。

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

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

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

    干杯快乐学习!

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

    1. OS 与带有特殊寄存器位的 MMU 一起进行内存管理,两者都离不开彼此的共同努力。
    2. 交换的数据实际上是在那里传输的,但应用程序总是看到从 0x0 到最大值的完整地址空间,这是在数据管理的上下文中说明的。
    3. 给定表的 OP 就像所有可能性的真值表。如果数据不存在,程序永远不会命中缓存或 tlb,因此它被标记为不可能状态,这些状态在状态机方面是无效的。

    出于安全原因,程序及其基指针始终以不干扰其他程序的方式保存。

    在外部访问内存是内存违规,并且在该机制之上还有很多支持通过编程 API 访问内存的机制

    【讨论】:

    • 大部分是好的答案,但在几点上有点模棱两可/不正确。 1. 页面管理由 OS 执行,而不是 MMU。 2. 交换的数据不仅仅是“看起来就在那里”,它还可以那里。或者,为了保持您原来的措辞,它看起来就像它开始时就在。 3. 在 OP 描述的情况下,缓存命中不是“无关紧要的”,这是不可能的,因为缓存数据是通过其物理地址访问的,而且缓存中存在换出页面的数据是一种安全隐患,因为它可能会被另一个进程读取。
    • 我尽量用普通语言回答大部分问题,因为 OP 可能没有所有架构知识,任何其他读者都会知道 TLB、MMU 和缓存的来源。除此之外,是的,还有很多更深层次的主题需要更清晰的解释和关于计算机如何在金属层面工作的预先背景。
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢。所以,他们的解释是不正确的。这不是不可能的,因为“数据不允许在缓存中”,而是因为没有翻译就不可能发生缓存命中
    • @Afonso 实际上,在这一点上是我错了。我已经更正了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多