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