为什么内存区域会被标记为非缓存?

问题描述 投票:0回答:7

在嵌入式应用程序中,我们有一张表描述了目标板上有效的各种地址范围。该表用于设置 MMU。
RAM 地址范围被标记为可缓存,但其他区域不是。这是为什么?

memory caching embedded
7个回答
19
投票

这样做是为了让处理器不会因为缓存而使用陈旧的值。 当您访问(常规)缓存 RAM 时,处理器可以“记住”您访问的值。下次您查看同一内存位置时,处理器将返回它记住的值,而无需查看 RAM。这是缓存。

如果位置的内容可以在处理器不知道的情况下发生变化,如果您有内存映射设备(例如 FPGA 返回一些数据包),处理器可以返回上次“记住”的值,这是错误的。

为避免此问题,您将该地址空间标记为不可缓存。这确保处理器不会试图记住该值。


6
投票

不应缓存任何用于 DMA 或其他硬件交互的内存区域。


5
投票

如果内存区域同时被硬件和软件访问(例如:硬件配置寄存器或 DMA 的分散-聚集列表),则该区域必须 定义为非缓存。对于实际的 DMA,可以将内存缓冲区定义为缓存,并且在大多数情况下,建议将缓冲区缓存以允许应用程序级别快速访问该缓冲区。在将缓冲区传递给 DMA 或应用程序之前,驱动程序有责任刷新/使缓存无效。

小更新,上面的must是不正确的,如果我们有一个专门的硬件,即缓存一致性互连(CCI),它将同步各种硬件块对内存的访问。


2
投票

考虑缓存一致性。假设内存中有一个位置 X 可以被使用 DMA 的设备访问,那么当设备向 X 写入新值时,cpu 将不会感知。如果 cpu 之前缓存了 X 的内容,当 cpu 需要该值时,它会从缓存中获取它。在这种情况下,cpu 获得陈旧的价值。同样,使用 DMA 的设备也可能读取过时的值。

来自维基Direct_memory_access


1
投票

也许它用于内存映射 I/O?


1
投票

现代控制器可以将 L2 缓存用于 DMA,这意味着它们保留了用于 DMA 访问的缓存内存区域的一致性。这也称为控制器(通过 DMA)执行的“可窥探内存事务”。


-1
投票

有些区域如Flash可以在一个周期内读取,所以不需要缓存。

© www.soinside.com 2019 - 2024. All rights reserved.