b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

解决方案:cpu缓存CPU缓存的原理和操作

电脑杂谈  发布时间:2020-09-03 02:01:37  来源:网络整理

cpu cache arm_cpu cache_cpu cache ratio

CPU缓存原理

CPU高速缓存(Cache Memory)是位于CPU和内存之间的临时存储. 它的容量比内存小得多,但是交换速度比内存快得多. 缓存的出现主要是为了解决CPU运算速度与内存读写速度之间的矛盾,因为CPU运算速度比内存读写速度快得多,这会使CPU花很长时间等待用于数据到达或将数据写入存储器. 高速缓存中的数据仅占内存的一小部分,但是CPU将在短时间内访问这小部分. 当CPU调用大量数据时,它可以避免内存并直接从缓存中调用它,从而加快读取速度.

缓存一致性问题

由于高速缓存存在于CPU和内存之间,因此对内存的任何外设修改都不能保证高速缓存中的更新相同,并且处理器对高速缓存内容的相同修改也不能保证内存中的数据已更新. 当使用DMA传输数据或处理器运行自修改代码时,缓存中的数据与内存中的数据之间的这种不同步和不一致可能会导致错误.

DMA和缓存

在DMA操作期间,如果缓存操作不正确,则可能会发生以下两个错误:

1. DMA从设备读取数据到处理器. DMA将外部数据直接传输到内存,但是旧数据仍保留在缓存中,因此处理器在访问数据时直接访问缓存,并会得到错误的数据.

2. DMA将处理器提供的数据写入设备. 当处理器处理数据时,数据将首先存储在缓存中. 此时,缓存中的数据可能没有时间写回内存中的数据. 如果DMA此时直接从内存中获取数据并将其传输到设备,则设备可能会收到错误的数据.

为了正确执行DMA传输,必须执行必要的缓存操作. 缓存操作主要分为无效(invalidate)和写回(write back)(写回),有时两者一起使用.

以Linux下的DMA操作功能为例:

参考: kernel / arch / arm / mm / dma-mapping.c

/ *

cpu cache_cpu cache arm_cpu cache ratio

*使设备的区域保持一致.

*注意: 驾驶员不应直接使用此功能,否则会损坏

*个具有CONFIG_DMABOUNCE的平台.

*使用驱动程序DMA支持-请参阅dma-mapping.h(dma_sync _ *)

* /

void dma_cache_maint(const void * start,size_t size,int direction)

{

void(* inner_op)(const void *,const void *);

void(* outer_op)(无符号长,无符号长);

BUG_ON(!virt_addr_valid(start)||!virt_addr_valid(start + size-1));

开关(方向){

情况DMA_FROM_DEVICE: / *仅使无效* /

cpu cache arm_cpu cache_cpu cache ratio

inner_op = dmac_inv_range;

outer_op = external_inv_range;

休息;

情况DMA_TO_DEVICE: / *仅写回* /

inner_op = dmac_clean_range;

outer_op = outside_clean_range;

休息;

case DMA_BIDIRECTIONAL: / *写回并使* /

无效

inner_op = dmac_flush_range;

outer_op = external_flush_range;

休息;

cpu cache arm_cpu cache_cpu cache ratio

默认值:

BUG();

}

inner_op(start,start + size);

outer_op(__ pa(开始),__pa(开始)+大小);

}

EXPORT_SYMBOL(dma_cache_maint);

1. 当DMA从设备读取数据到处理器时,它会使操作无效. 这将迫使处理器在读取缓存中的数据时首先从内存中将数据读取到缓存中,从而确保缓存和内存中数据的一致性.

2. 当DMA将处理器提供的数据写入外设时,可以进行回写操作. 这样,可以在DMA传输数据之前将缓冲区中的数据写回到内存中.

如果您不知道DMA操作的方向,则还可以同时执行无效和写回操作. 该操作的结果等于无效操作和写回操作的效果之和.

Wince操作系统还具有一组缓存操作接口:

()

cpu cache_cpu cache arm_cpu cache ratio

void OEMCacheRangeFlush(
  LPVOID pAddr,
  DWORD dwLength,
  DWORD dwFlags 
);

dwFlags的定义如下

ValueDescription

CACHE_SYNC_WRITEBACK

回写缓存的数据.

CACHE_SYNC_DISCARD

回写并丢弃缓存的数据.

CACHE_SYNC_INSTRUCTIONS

丢弃所有缓存的指令.

自修改代码和缓存

当处理器要执行自修改代码时,处理器首先生成新代码并将其存储在高速缓存中,最后从高速缓存中加载新代码并将指令发送给处理器. 如果处理器的缓存分为D-Cache(数据缓存)和I-Cache(指令缓存),则在生成代码时将其存储在D-Cache中,并在提取代码时从I-Cache中读取. . 当Cache和I-Cache中的数据(即新生成的指令代码)不同时,将不会执行正确的指令.

为了正确执行指令,必须及时同步两个缓存中的数据: 对D-Cache的写回操作和对I-Cashe的无效操作.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-312718-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...