这可能是一个愚蠢的问题,但我对 ARM CMSIS 缓存操作函数的措辞有些困惑。
ARM CMSIS 公开了可以“清除”缓存的函数、可以“使”缓存无效的函数,以及一组同时执行这两种操作的函数。
这些实际上做什么还不清楚,坦率地说,arm 文档让我感到困惑:
- 您可以在一次操作中使整个数据缓存(刷新数据缓存)无效,而无需回写脏数据。
- 您可以在不写回任何脏数据的情况下使单个行无效(刷新数据缓存单个条目)。
- 您可以逐行执行清洁。数据只有在遇到脏行时才通过写缓冲区写回,清除后的行保留在缓存中(clean data cache single entry)。您可以使用它们在数据缓存中的索引或它们在内存中的地址来清理缓存行。
- 您可以在一次操作中清理和刷新单个行,使用它们在数据缓存中的索引或它们在内存中的地址。
我的理解是,缓存中的“刷新”数据将导致其被写回主内存,而缓存中的“无效”数据将导致处理器在下次尝试访问相关数据时重新读取主内存。
然而,ARM 文档似乎暗示刷新操作实际上是一个失效操作,而我一直在想的是刷新操作实际上是一个“干净”操作。
我想我只是严重误解了文档。有人可以指出我正确的方向吗?
如果相关,我专门为皮质 M7 开发。
从 armv7-m ARM ARM 他们有这个文本。
这些操作的定义是:
干净的
缓存清理操作可确保控制缓存的观察者所做的更新对其他可以在执行操作时访问内存的观察者可见。一旦清理完成,新的内存值保证在操作执行点可见,例如统一点。仅当条目包含已由该内存位置的共享域中的观察者写入的位置时,从缓存中清除缓存条目才能覆盖已由另一个观察者写入的内存。
作废
缓存失效操作可确保在定义失效的点访问内存的观察者可见的更新对控制缓存的观察者可见。这可能会导致对由访问缓存的观察者写入的无效操作影响的位置的更新丢失。如果无效操作所针对的条目的地址没有 Normal Cacheable 属性,或者如果缓存被禁用,则无效操作还确保该地址不存在于缓存中。
我读到说清理会将缓存中尚未保存到下一级内存中的项目写出来(有些人像我这样的人称之为刷新)。Invalidate 不关心是否有未写入的值,它准备缓存,就好像没有要保存的值一样,准备接受新的地址和数据。
我就是这样读的...
| 归档时间: |
|
| 查看次数: |
4304 次 |
| 最近记录: |