memory - ARM中 transient 和非 transient 内存的概念和优势?

标签 memory arm cpu-architecture mmu

在 ARM 架构手册中提到缓存可以是 transient 的和非 transient 的,并且它是由实现定义的。我无法理解关于缓存的 transient 内存的概念和使用。我正在尝试编写启用 MMU 的软件,并且我已经启用了 L1 和 L2 缓存。我正在使用 LPAE。我知道 MAIR 寄存器控制这个属性。我没有得到任何关于它的好的文档。

我想知道这个概念,以便检查将其应用于当前设计的可行性。

arm-v7-a-r 第 134 页

“对于包含大物理地址扩展的 ARMv7-A 实现,实现定义是否支持可缓存的 Normal 内存区域的 Transient 属性。如果实现支持此属性,则 Normal 的一组可能的可缓存性属性内存区域变为:
• 直写可缓存,非 transient
• 回写式可缓存、非 transient
• 直写可缓存, transient
• 可回写高速缓存, transient
• 不可缓存。”

最佳答案

ARM ARM 在您引用的部分之后不久说:

The transient attribute indicates that the benefit of caching is for a relatively short period, and that therefore it might be better to restrict allocation, to avoid possibly casting-out other, less transient, entries.

换句话说,它是对缓存系统的提示。 As Peter suggests in the comments ,当缓存具有可预测的替换策略(例如 LRU 或循环)时,这可以通过直接分配到已经非常接近驱逐的位置来实现。另一种选择是将临时/非临时访问仅分配到较低级别的缓存中,因为与 L1 中的热门数据相比,这些通常表示最近使用较少的数据。

这对某些流式工作负载具有理论上的好处 - 例如,通过将大型数据缓冲区映射为可缓存但 transient ,通过这些缓冲区工作的处理算法仍然可以从访问局部性(即多次命中)方面受益于缓存在同一行中)并自动预取后续行以用于常规访问模式,但不会在缓存的其余部分中颠簸和中断指令获取、堆栈访问等。但另一方面,大多数现代缓存足够聪明,至少可以检测到持续的定期写入访问模式并自动进入非分配流模式,这完全透明地提供了一些相同的好处,而无需程序员乱搞属性。

从实际的角度来看,最重要的问题是它是否值得担心:总的来说,它是不值得的。快速浏览了一些 TRM,Cortex-A7 ignores the transient attribute entirely ;皮质-A15 might actually go wrong if you try to use it ; Cortex-A12/17和 Marvell 的 v7 核心(根据 public Armada XP functional spec )似乎根本没有提到它,所以在没有任何特定实现特定定义的情况下,我猜他们也可能会忽略它(特别是因为他们也提到了伪随机缓存替换策略)。我不知道 Qualcomm Krait 或任何其他实现,因为没有公开文档。

根据我对 CPU 设计的了解, transient 属性给人的印象是这些特性之一,它不仅在非常特殊的利基之外没有任何好处,而且还为设计和验证增加了相对较大的成本。换句话说,我怀疑有人会在没有非常具体的要求的情况下去那里,尽管它存在于架构中的事实意味着几乎可以肯定一些硬件在那里运行一些更适合实现它的工作量。但是,除非您已经知道自己拥有该硬件和该工作负载,否则我倾向于简单地忘记它。

关于memory - ARM中 transient 和非 transient 内存的概念和优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38636326/

相关文章:

arm - 如何使用aarch64-linux-gnu-objdump反汇编V7模式指令(A32,T32)

performance - 为什么当我的循环包含在一个缓存行中时,它会快得多?

c - kmalloc 许多结构,我应该一次全部分配还是分别分配

linux - 当我在 cavium thunderx 上安装 centos 时安装停止

android - 禁用自动关闭应用程序 Android

c - 什么是执行区域和输入部分的过度对齐?

gcc - 自动展开并输出C/C++代码

x86 - 现代英特尔处理器有多少种超标量方式?

android - 如何使用 fragment 解决 Android Studio 中的 java.lang.OutOfMemoryError

ios - 核心数据导入 - 不释放内存