Arm Cortex A9存储器访问

3
我想了解ARM核心(Cortex-A系列处理器)访问内存的顺序,从核心生成的虚拟地址到内存以及指令/数据从内存传输到核心。考虑到核心已经为某些数据/指令生成了虚拟地址,并且TLB缓存未命中,那么地址如何到达主存储器(如果我没有错的话是DRAM),数据如何通过L2和L1缓存传输到核心。
如果所需的数据/指令已经在L1缓存中,会发生什么?
如果所需的数据/指令已经在L2缓存中,会发生什么?
我对缓存和MMU通信感到困惑。
1个回答

2
简化版:无论您想要什么,ARM都非常灵活,SOC供应商或系统程序员可以根据最终设备的特点和需求使内存子系统执行许多不同的操作。MMU具有明确规定缓存使用方式的字段。建议阅读《Cortex-A系列程序员指南》中的第9章“高速缓存”和第10章“内存管理单元”。一些术语包括PoC(协同点)、PoU(统一点)、Strongly ordered(强排序)、Device(设备)和Normal(普通)。
许多MMU属性和缓存可以受到不同的CP15和配置寄存器的影响。例如,对于L1缓存中的数据的“独占配置”永远不在L2中,这可能会使得编写自修改代码和其他动态更新变得特别困难。因此,即使对于特定的Cortex-A型号,系统配置也可能改变一些东西(写回/写直通、写分配/不写分配、可缓冲、不可缓存等)。
一般DDR核心内存的典型序列是:
将文本翻译成中文:
  1. 解析虚拟地址 -> 物理地址
    1. 是否存在微型TLB?是,有“物理地址”
    2. 是否存在TLB?是,有“物理地址”
    3. 表项遍历。有“物理地址”或故障。
  2. 访问标记为可缓存?是,执行2.1。否则执行步骤4。
    1. 在L1缓存中吗?是,执行2b。
    2. 如果是读,则返回数据。如果是写,则填充数据并标记为脏(写回)。
  3. 在L2缓存中吗?是,执行3.1
    1. 如果是读,则返回数据。如果是写,则填充数据并标记为脏(写回)。
  4. 在AXI总线上运行物理周期(可能路由到子总线)。

如果所需的数据/指令已经在L1缓存中怎么办?

如果所需的数据/指令已经在L2缓存中怎么办?

如果所需的数据/指令已经在L1或L2缓存中,则可以直接从缓存中读取,而不需要执行表项遍历或在AXI总线上运行物理周期。这将大大提高数据/指令的访问速度。
对于正常情况,这些只是缓存命中。如果是“写穿透”和“写入”,则该值会更新到缓存并写入内存。如果是“写回”,则该值会在缓存中更新并标记为脏。注1如果是读取,则缓存内存将在两种情况下使用。
系统可能完全针对设备内存(例如,内存映射的USB寄存器、可共享的世界内存、多核/CPU缓冲区等)进行设置。通常,设置将取决于系统成本、性能和功耗。即,写穿透缓存更容易实现(功耗更低、成本更低),但通常性能较低。

我对缓存和MMU之间的通信感到困惑。

主要,MMU将提供信息给缓存以解析地址。MMU可能会告诉缓存使用/不使用缓存。它可能会告诉缓存可以“组合”写操作(可写缓冲区),但不应无限期地存储它们等等。因此,许多MMU规范可以有选择地改变缓存的行为。由于Cortex-A缓存参数未定义(由每个SOC制造商确定),因此特定的MMU位在不同系统上可能具有替代行为。
注1:'脏缓存'可能会有额外的排除监视器信息广播,用于strex和ldrex类型的访问。

1
非常感谢。我正在阅读Cortex A PG,目前在第9章。我的理解是,在翻译表中特定地址的页面属性决定是否使用缓存,例如当C = 1时,则数据将通过L2传递,然后通过L1传递到内核(前提是其为普通可缓存的内存)。如果是强序内存或设备类型内存,则所需数据不会通过缓存传递,因为这些内存是不可缓存的,对吗? - Ganesh Kalbhor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接