cache一致性
1、cache一致性的基本原理
2、DMA与cache一致性
一、cache一致性的基本原理
在现代处理器系统中,CPU的主频远高于主存读写速度,主存的读写速度成为程序执行效率的瓶颈;为了解决这个问题,在CPU和主存之间引入了Cache存储器,基于程序执行的局部性原理,在程序执行时,将正在使用的数据从主存拷贝一份到Cache,这样CPU就可以直接从Cache读写数据以改善主存读写速度慢的问题;
引入Cache存储器后,同样的数据就有可能同时存在于主存和Cache中,那么CPU或外部设备在读写数据的时候就需要保证读写到最新的数据,这个最新的数据可能在Cache也可能在主存里面(而且每个CPU都有各自的Cache,也就是数据可能同时存在于多个CPU的Cache里面),那么就需要有机制来保证读写数据时访问到最新数据,也就是Cache一致性;
在一个处理器系统中,主设备(cpu或者外部设备)进行存储器访问时,将试图从存储器系统(主存储器或者其他cpu的cache)中获得最新的数据副本;如果该主存访问的数据没有在本地命中时,将从其他cpu的cache中获得数据,如果这些数据仍然没有在其他cpu的cache中命中,主存储器将提供数据;外部设备进行存储器访问时,也需要进行cache共享一致性。
为了解决Cache一致性,现代处理器系统引入了Cache一致性处理协议,这些协议由硬件实现,不需要软件干预(需要注意的是,这个协议需要硬件支持,有的soc硬件支持,有的sos硬件是不支持的),以MOESI协议为例,这个协议使用5个状态位描述每一个Cache行:
M位:该位为1表示当前Cache行中包含的数据与主存不一致,并且仅在本cpu的cache中有效,不在其他cpu的cache中存在副本,并且cache中的数据比主存新;
E位:该位为1表示当前Cache行中包含的数据与主存一致,并且仅在本cpu的cache中有效,不在其他cpu的cache中存在副本;
O位:该位为1表示在当前Cache行中包含的数据是当前处理器系统最新的数据副本,并且在其他cpu中一定具有该Cache的副本,其他cpu的cache行状态为S;
S位:如果其他cpu存在O位置1的副本,那么本cache行的数据与主存不一致,如果其他cpu不存在O位置1的副本,那么本cache行的数据与主存一致;
I位:该位为1表示当前Cache行中没有有效数据或者该Cache行没有使能;
MOESI协议根据这几个状态位实现了一个状态机(如下),当cpu读取数据时,硬件就会根据状态位,按照状态机行为做相应处理,比如,当cpu A读取的数据从cpu B中命中时,如果在cpu B中cache行的状态为M时,将迁移到O,同时cpu B将数据传送给cpu A新申请的cache行中,而且cpu A的cache行状态将被更改为S;
二、DMA与cache一致性
外部设备使用DMA读写内存时,由于cache存储器的存在,内存数据可能存在于cache中,这时就需要处理cache一致性问题;比如,使用DMA读内存数据时,如果cache中的数据比内存新,那么就需要先把cache的数据刷新到内存再读,使用DMA往内存写数据时,如果cache数据比内存旧或与内存一致,那么直接无效cache行,然后往主存写数据,如果cache数据比内存新,那么就需要先将cache的数据刷新到内存,然后DMA再往内存写数据;
如果硬件支持cache一致性处理协议,那么使用DMA时,软件就不需要处理cache一致性的问题,如果硬件不支持cache一致性处理协议,那么就需要软件来处理cache一致性的问题,在linux操作系统上,软件有2种接口来处理DMA的cache一致性问题:
1、使用cache一致性的接口dma_alloc_coherent申请DMA读写的内存
这个接口linux内核做了特殊处理,具体的实现可以由soc厂商定制;该接口默认申请的内存是nocache属性的,但是,如果硬件支持cache一致性协议,厂商可以定制该接口,使得该接口申请的内存是cache属性的;
2、使用流式DMA
这种方式假设硬件不支持cache一致性协议,DMA使用的内存又是cache属性的,因此,由软件来保证DMA读写的cache一致性,操作步骤大致如下:
DMA读内存数据到外设:
1. 启动DMA读内存前使用dma_map_single接口将cache数据刷新到内存,保证DMA读到最新数据;
2. DMA读完数据后,在cpu操作内存前,需要使用dma_unmap_single接口操作内存,这个接口会刷新cache,保证cpu读写到最新数据;
DMA写数据到内存:
1.启动DMA写内存前使用dma_map_single接口将cache数据刷新到内存,保证DMA操作时,内存中的数据最新,如果内存要反复使用,那么也可以使用dma_sync_single_for_device接口来刷cache到内存;
2. DMA写完数据后,在cpu操作内存前,需要使用dma_unmap_single接口操作内存,这个接口会刷新cache,保证cpu读写到最新数据,也可以使用dma_sync_single_for_cpu接口来保证;
标签:---,Cache,DMA,cache,网卡,内存,数据,cpu From: https://www.cnblogs.com/lztutumo/p/17004015.html