为什么将内存区域标记为非缓存?
时间:2020-03-06 14:20:04 来源:igfitidea点击:
在嵌入式应用程序中,我们有一张表描述在目标板上有效的各种地址范围。该表用于设置MMU。
RAM地址范围标记为可缓存,但其他区域则标记为不可缓存。这是为什么?
解决方案
也许它用于内存映射的I / O?
用于DMA或者其他硬件交互的任何内存区域都不应缓存。
这样做是为了使处理器不会由于缓存而使用过时的值。
当我们访问(常规)缓存的RAM时,处理器可以"记住"我们访问的值。下次查看相同的内存位置时,处理器将返回它记住的值,而无需查看RAM。这是缓存。
如果位置的内容在处理器不知道的情况下可以更改,例如拥有内存映射的设备(例如,FPGA返回一些数据包),则处理器可以返回从上次"记住"的值会错的。
为避免此问题,请将该地址空间标记为不可缓存。这样可以确保处理器不会尝试记住该值。
如果同时通过硬件和软件(例如,DMA的硬件配置寄存器或者分散收集列表)访问存储区域,则必须将该区域定义为非缓存区域。对于实际的DMA,可以将内存缓冲区定义为已缓存,在大多数情况下,建议缓存该缓冲区,以允许应用程序级快速访问该缓冲区。在将缓冲区传递给DMA或者应用程序之前,驱动程序有责任刷新/使缓存无效。
像Flash这样的某些区域可以在一个周期内读取,因此不需要进行缓存。