我想知道ARM内核(Cortex-A系列处理器)访问内存的顺序?从核心到内存生成的虚拟地址和从内存传输到核心的指令/数据。考虑到核心为某些数据/指令生成了一个虚拟地址,并且TLB未命中,那么地址如何到达主存储器(如果我没有错误则是DRAM)以及数据如何通过L2和L1缓存进入核心。
如果所需的数据/指令已经在L1缓存中怎么办?
如果所需的数据/指令已经存在于L2缓存中,该怎么办?
我对缓存和MMU通信感到困惑。
答案 0 :(得分:1)
tl; dr - 无论你想要什么。 ARM非常灵活,SOC供应商和/或系统程序员可能会根据终端设备的功能和需求,使内存子系统做很多不同的事情。
首先,MMU具有明确规定如何使用缓存的字段。我建议阅读 Cortex-A系列程序员指南的第9章高速缓存和第10章内存管理单元。
有些术语是,
PoC
- 一致性。PoU
- 统一点。许多MMU属性和缓存可能受到不同CP15和配置寄存器的影响。例如,一个独家配置'对于L1高速缓存中的数据永远不会在L2中使得干净地编写自修改代码和其他动态更新变得特别困难。因此,即使对于特定的Cortex-A模型,系统配置也可能会改变(回写/直写,写分配/无写分配,可缓冲,不可缓存等)。
通用DDR核心存储器的典型序列是
如果所需的数据/指令已经在L1缓存中怎么办?
如果所需的数据/指令已经存在于L2缓存中,该怎么办?
对于正常情况,这些只是缓存命中。如果它是一个直写的'并且'写'然后在缓存中更新该值并将其写入内存。它是回写'该值在缓存中更新并标记为脏。 Note1 如果是读取,则使用缓存(在这两种情况下)。
对于设备内存(即内存映射USB寄存器,全局可共享内存,多核/ cpu缓冲区等),系统可能设置完全不同。设置通常取决于系统成本,性能和功耗。即,直写缓存更容易实现(功耗更低,成本更低),但性能往往更低。
我对缓存和MMU通信感到困惑。
主要是MMU将为缓存提供解析地址的信息。 MMU可以说使用/不使用缓存。它可能会告诉缓存它可以帮助' gang'一起写(write-bufferable),但不应无限期地存储它们等等。因此许多MMU说明符可以有选择地改变缓存的行为。由于未定义Cortex-A高速缓存参数(由每个SOC制造商决定),通常情况下特定MMU位可能在不同系统上具有替代行为。
注1 :'脏缓存'可能有额外的广播' strex
和ldrex
类型访问的排除监视器信息。