cpu-architecture - 访问内存时,是否会在缓存命中情况下设置页表访问/脏位?

标签 cpu-architecture cpu-cache mmu page-tables

据我所知,CPU的一次内存访问涉及到CPU缓存和MMU。 CPU 将尝试在缓存中找到它的目标,如果发生缓存未命中,CPU 将转向 MMU。在 MMU 访问期间,对应页表项的访问/脏位将由硬件设置。

然而,据我所知,除非出现缓存未命中,否则大多数 CPU 设计都不会触发 MMU,这里我的问题是,是否仍会在缓存命中时设置页表条目的访问/脏位?还是跟架构有关?

最佳答案

我认为您可以假设这些位缓存在 TLB 中,如果与 TLB 中的值和内核完成的访问存在任何不一致,将采用微码辅助并更新这些位。例如,如果 A1 或 D 位为零并且发生访问或存储,则将检测到这种情况并设置适当的位。

您还可以假设 TLB 命中的快速路径无法进入内存并查看缓存的 TLB 位是否与 RAM 中的 PTE 一致。此外,在 x86 上,对 PTE 的更改不会通过硬件推送到 TLB,缓存无效样式;即 TLB is not coherent .

这意味着如果位在某些方面不同步,它们可能不会被正确更新。例如,如果 TLB 中的 A(相应 D)位被设置,并且发生了访问(相应的存储),那么即使 A(相应 D)位在 PTE 中实际上未设置,也不会发生任何事情。对位进行更改的实体负责刷新 TLB,以便将来正确更新位。

1 有一个带有 A == 0 的 TLB 条目很奇怪:由于访问,您希望条目在那里,因此拥有 A从一开始就设置了位。也许在某些情况下可能会发生这种情况,例如由推测访问或预取引入的页面。

关于cpu-architecture - 访问内存时,是否会在缓存命中情况下设置页表访问/脏位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280712/

相关文章:

c - 如何用 C 语言计算计算机的字长?

algorithm - 存储在缓存中的算法应该多小? (需要线索)

process - 进程之间的上下文切换是否会使 MMU(内存控制单元)失效?

c# - 针对 x86 和 x64 的设置?

exception - 当#GP 从 v8086 模式启动时,处理器是否将错误代码推送到 ring0 堆栈?

cpu - 缓存行大小背后的理论和测量是什么?

c - 为什么 ARMv7-A 在从缓存中刷新堆栈指针时会崩溃

c++ - "non-native"指针会损害缓存性能吗?

linux - Linux 内核中的 x86 分页与 mmu

linux - 在 Linux 中启用 MMU