arm中缓存维护操作中的PoU和PoC

arm中缓存维护操作中的PoU和PoC,arm,cortex-a,Arm,Cortex A,阅读时手臂拱起。参考手册v7,我发现了两个概念;相干点(PoC)和统一点(PoU) 对于PoC,看起来所有代理(即CPU核心)都可以看到相同的内存副本 对于PoU,看起来所有代理(在本例中为CPU核心和MMU)都可以看到相同的内存副本 我有几个后续问题: 我的理解正确吗 如果是这样,如果我发布DCCMVAC(数据缓存清理MVA到PoC)并将MVA赋予0x40000000(假设PoC恰好是0x7000000) 是否清除0x40000000和0x7000000的VA之间的所有缓存项 然后,如果我发出

阅读时手臂拱起。参考手册v7,我发现了两个概念;相干点(PoC)和统一点(PoU)

对于PoC,看起来所有代理(即CPU核心)都可以看到相同的内存副本

对于PoU,看起来所有代理(在本例中为CPU核心和MMU)都可以看到相同的内存副本

我有几个后续问题:

  • 我的理解正确吗

  • 如果是这样,如果我发布DCCMVAC(数据缓存清理MVA到PoC)并将MVA赋予0x40000000(假设PoC恰好是0x7000000)

    是否清除0x40000000和0x7000000的VA之间的所有缓存项

  • 然后,如果我发出带有MVA 0x0的DCCMVAC,所有数据缓存项都会被清除吗

  • PoU听起来像是MMU本身有自己的数据缓存(不是TLB),用于在主内存中进行页表遍历。这是正确的吗


  • 根据ARM培训材料:

    处理器的PoU(统一点)是一个点(硬件中的物理位置),在该点上,处理器的指令和数据缓存以及转换表可以确保看到内存位置的相同副本。例如,在具有哈佛1级缓存和TLB(缓存页表条目)的系统中,统一的2级缓存将是统一点。如果不存在外部缓存,则主内存将是统一点


    PoC(系统一致性点)是指所有可访问内存的块(例如,CPU、DSP或DMA引擎)保证在特定地址下可以看到内存位置的相同副本的点。通常,这将是主要的外部系统内存。

    这是一个旧案例,但是,在某人搜索时添加一些注释

    在我看来,PoU和PoC是ARM发明的,用于定义缓存维护的一个级别。PoC和PoU的定义在ARM规范中,而其ARMv8编程指南(非ARM规范)给出了一些图表,以便更好地理解:

    一点是,在ARMV8处理器的实现下,Iside可以窥探Dside,例如,如果有一个Icache未命中,它将检查Dcache,因此可以将PoU视为一级缓存的级别。而其他ARMv8处理器可能没有这种行为

    回到原来的问题: 2) DCCMVAC 0x40000000,它将对该地址的PoC进行缓存清理,主要是一条缓存线 PoC是由SoC实现定义的,而不是由地址定义的

    3) 考虑到Q2,DCCMVAC 0x0仅适用于一条缓存线。 如果要清除整个缓存并使其无效,则需要使用by set/way遍历整个缓存

    4) PoU与MMU无关。
    MMU硬件块拥有一些缓冲区来保存TLB条目,这是一种常见的做法,对于pagetable,它是由软件在内存中构建的,通常它被定义为普通内存类型,因此它可以在通过CPU指令设置或通过MMU硬件漫游单元漫游时位于缓存中。

    而不是MMU思考/了解TLB(这是您的第四项). 若系统是高级的,则PoC可以是L1,其中SCU保持可共享内存的一致性。PoU可以是L2—正如您所说,每个人都有相同的副本。哦,我的意思是(在第4项中)当MMU访问主存中的页表时(当TLB未命中时),它是直接访问主存还是访问某种数据缓存?TLB是MMU的缓存(afaik),TLB没有缓存。TLB是MMU用于存储vapa映射的缓存。如果TLB中缺少条目,MMU必须遍历主内存中的页表。我好奇的是这一刻(MMU访问主内存)。为了避免混淆,我对这个问题进行了编辑。没有MMU的数据缓存这样的缓存。您可以阅读cortex-a系列程序员指南以了解更多信息。