caching - 在处理器 x86/x86_64 中使用物理或虚拟寻址来缓存 L1、L2 和 L3?

标签 caching x86 virtual-memory tlb virtual-address-space

处理器 x86/x86_64 中使用哪种寻址方式缓存 L1、L2 和 L3(LLC) - 物理或虚拟(使用 PT/PTE 和 TLB),不知何故 PAT(page attribute table)对它有影响吗?

在这种情况下,驱动程序(内核空间)和应用程序(用户空间)之间有区别吗?

简短回答 - 英特尔使用 虚拟索引,物理标记 (VIPT) L1 缓存:What will be used for data exchange between threads are executing on one Core with HT?

  • L1 - 虚拟 寻址(在 8-way 缓存中定义 Set 需要低 12 bits,在 virt 和 phys 中是相同的)
  • L2 - 实物寻址(需要访问 Virt-2-Phys 的 TLB)
  • L3 - 实物寻址(需要访问 Virt-2-Phys 的 TLB)
  • 最佳答案

    你的问题的答案是 - 这取决于。这严格来说是一个 CPU 设计决策,它在性能和复杂性之间进行权衡。

    以最近的英特尔酷睿处理器为例 - 它们被物理标记并虚拟索引(至少根据 http://www.realworldtech.com/sandy-bridge/7/ )。这意味着缓存只能在纯物理地址空间中完成查找,以确定该行是否存在。但是,由于 L1 是 32k,8 路关联,这意味着它使用 64 个集合,因此您只需要地址位 6 到 11 即可找到正确的集合。碰巧的是,虚拟地址和物理地址在此范围内是相同的,因此您可以在读取缓存集的同时查找 DTLB - 一个已知的技巧(请参阅 - http://en.wikipedia.org/wiki/CPU_cache 以获得很好的解释)。

    从理论上讲,可以构建一个虚拟索引 + 虚拟标记缓存,这将消除通过地址转换(TLB 查找,以及在 TLB 未命中的情况下进行页面遍历)的要求。然而,这会导致许多问题,尤其是内存别名——两个虚拟地址映射到同一个物理地址的情况。

    假设core1在这样的全虚拟缓存中有虚拟地址A缓存(它映射到物理地址C,但我们还没有做这个检查)。 core2 写入映射到相同 phys addr C 的虚拟地址 B - 这意味着我们需要某种机制(通常是“窥探”,由 Jim Goodman 创造的术语)使 core1 中的该行无效,管理数据合并和一致性管理如果需要的话。但是,core1 无法响应该监听,因为它不知道虚拟地址 B,并且不在虚拟缓存中存储物理地址 C。所以你可以看到我们有一个问题,虽然这主要与严格的 x86 系统相关,但其他架构可能更宽松,并允许对此类缓存进行更简单的管理。

    关于其他问题 - 我能想到的与 PAT 没有真正的联系,缓存已经设计好了,并且不能针对不同的内存类型进行更改。另一个问题的相同答案 - 硬件主要在用户/内核模式之间的区别之下(除了它提供的安全检查机制,主要是各种环)。

    关于caching - 在处理器 x86/x86_64 中使用物理或虚拟寻址来缓存 L1、L2 和 L3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19039280/

    相关文章:

    javascript - 防止javascript被缓存在浏览器中

    linux - 在 libc(所有文件系统)或 ext4 中创建一个当分区快满时自动删除的缓存文件?

    mysql - 即使在启用低级别缓存后,查询仍然在 Rails 应用程序的 mysql 服务器中记录为慢查询

    x86 - 分支目标预测与分支预测结合?

    assembly - X86指令在实模式下关闭计算机?

    windows - sysinternals 进程资源管理器中的 "Virtual Size"是什么

    java - 将大型数组缓存到 SQLite - Java/Android

    c - 如何从汇编代码逆向工程C整数类型?

    linux - 我可以在 Linux 上用完虚拟内存吗?