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