1

我知道 cpu 如何在 TLB 和缓存的帮助下访问数据。但是我很困惑,数据缓存和 TLB 是否共享相同的 CPU 缓存或 MMU 硬件是否具有用于 TLB 的单独缓存。当上下文切换发生时,谁来刷新 TLB 和数据缓存的内容?

4

1 回答 1

0

这在很大程度上取决于 CPU。

既然你在谈论“MMU 硬件”,我假设你有一本很旧的书。至少在过去的 20 年中,MMU 已经非常紧密地集成到大多数 CPU 中。

无论如何,让我们从缓存开始。在您每天都会遇到的大多数 CPU 上,例如 i386 和 x86_64,缓存是物理索引的。这意味着它们在物理内存访问中缓存内容,因此无需在上下文切换时刷新它们。

在其他具有虚拟缓存的 CPU 架构上,有多种机制可以确保缓存的一致性。在一些具有完全虚拟地址缓存的情况下,操作系统的工作是在上下文切换时刷新整个缓存。在某些情况下,虚拟索引缓存还具有物理标签,以确保我们从缓存中获得的任何内容都是正确的(缓存行查找与 TLB 查找并行完成,因此检查物理地址不是问题)。在其他情况下,操作系统会为每个不同的上下文分配一个明确的上下文编号,这也是缓存查找的一部分,并且无需在上下文切换时刷新缓存。

对于 TLB,基本上有三种主要风味。一个是具有显式上下文编号的那个,就像缓存一样,所以你不需要在上下文切换上做任何事情。第二种风格会在加载新页表时自动刷新 TLB(这是 i386 和 x86_64)。一些较旧的 CPU 在加载新页表后需要显式刷新 TLB。第三种实现 TLB 的方法是在特殊的陷阱处理程序中将它们完全填充到软件中。

对于 TLB 和普通缓存是否共享内存的问题。通常没有。很难在需要多少 TLB 和缓存之间取得良好的平衡。此外,在 TLB 和缓存中查找内容的方式也完全不同,并且有不同的需求来保持内容的一致性。话虽如此,传统上 TLB 总是从物理内存中加载,一些 CPU 甚至需要在加载 TLB 之前刷新缓存。在 Core 2 中,Intel 开始从 CPU 缓存中加载 TLB,这导致了早期 Core 2 CPU 中的大量错误,甚至重写了一些低级内存管理文档,这基本上使所有未来的 Intel CPU 不向后兼容,并且有许多旧的无法在 Core 2 和更新的 Intel CPU 上正确运行的操作系统内核。

于 2014-08-28T11:37:02.443 回答