PCIe网卡驱动实现分析(三)--- cache一致性

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接口来保证;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值