在嵌入式应用程序中,我们有一个表格,描述了在目标板上有效的各种地址范围。此表用于设置 MMU。
RAM 地址范围标记为可缓存,但其他区域标记为不可缓存。这是为什么?
7 回答
这样做是为了使处理器不会因为缓存而使用过时的值。当您访问(常规)缓存 RAM 时,处理器可以“记住”您访问的值。下次您查看相同的内存位置时,处理器将返回它记住的值,而无需查看 RAM。这是缓存。
如果位置的内容可以在处理器不知道的情况下发生变化,如果您有一个内存映射设备(例如,FPGA 返回一些数据包),处理器可能会返回上次“记住”的值,这会错的。
为避免此问题,您将该地址空间标记为不可缓存。这确保处理器不会尝试记住该值。
不应缓存用于 DMA 或其他硬件交互的任何内存区域。
如果一个内存区域同时被硬件和软件访问(例如:硬件配置寄存器或 DMA 的分散聚集列表),这个区域必须定义为非缓存。对于实际的 DMA,内存缓冲区可以定义为缓存,在大多数情况下,建议缓存缓冲区以允许应用程序级快速访问该缓冲区。在将缓冲区传递给 DMA 或应用程序之前刷新/使缓存无效是驱动程序的责任。
如果我们有专门的硬件,即高速缓存一致性互连(CCI),它将同步各种硬件块对内存的访问,上面的小更新肯定是不正确的。
也许它用于内存映射 I/O?
考虑到缓存一致性。假设内存中有一个位置 X 可以被设备使用 DMA 访问,因此当设备向 X 写入新值时,cpu 不会被察觉。如果 cpu 之前缓存过 X 的内容,当 cpu 需要该值时,它会从缓存中获取。在这种情况下,cpu 会获得陈旧的值。同样,使用 DMA 的设备也可能读取过时的值。
来自 wiki Direct_memory_access
现代控制器可以将 L2 缓存用于 DMA,这意味着它们保留了用于 DMA 访问的缓存内存区域的一致性。这也称为由控制器(通过 DMA)执行的“可窥探内存事务”。
有些区域如 Flash 可以在一个周期内读取,因此不需要缓存。