首页 > 其他分享 >PCIe网卡驱动实现分析(三)--- cache一致性

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

时间:2022-12-25 15:00:37浏览次数:32  
标签:--- Cache DMA cache 网卡 内存 数据 cpu

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

相关文章

  • 实验八-Web部署
    第一步:准备过程开启华为云的弹性服务器:第二步:操作配置openEuler      安装LAMP                    安装部......
  • Django-auth认证模块
    1.auth认证模块1.django自带一个admin路由,但是需要我们自己填写管理员账号和密码。如果想要是用django的admin后台管理,首先需要创建表(直接执行数据库迁移命令会默认产......
  • 漏洞实战部分3-ContentProvider组件的openFile接口问题
    前期回顾可以关注微信公众号安卓应用漏洞学习case3本课程学习ContentProvider组件的openFile接口。ContentProvider组件主要作用实现各个应用程序之间的数据共享。可以把......
  • leetcode-521. 最长特殊序列 Ⅰ
    521.最长特殊序列Ⅰ-力扣(Leetcode)脑筋急转弯funcfindLUSlength(astring,bstring)int{ifa!=b{returnmax(len(a),len(b))}retur......
  • CMU15-445:Lecture #03 笔记
    Lecture#03:DatabaseStorage(PartI)本文是对CMU15-445课程第三节笔记的一个粗略总结和翻译。仅供个人(M1kanN)复习使用。1.Storage存储我们将关注一个"面向......
  • 20221419卢冠宇 实验八-Web部署
    配置华为云访问设置弹性云服务器ECS远程访问推荐使用MobaXterm。输入弹性云服务器IP地址。安装LAMP通过下面命令安装Apache:通过下面命令开启Apache服务:syste......
  • 20221325 实验八-Web部署 实验报告
    Web部署(openEuler中基于LAMP部署WordPress)实验过程一、配置openEuler华为云openEuler安装后,没有配置yum源,我们通过重新配置。cd/etc/yum.repos.dviopenEuler_x86_......
  • PCIe网卡驱动实现分析(二)--- MSI-X中断实现原理
    msix中断实现原理根据中断的上报方式区分,PCIE设备有两种方式向处理器提交中断请求:INTx引脚:和其他外设中断请求一样,通过改变中断请求线电平的方式向处理器提交中......
  • 初步了解学习Rust中traits-学习笔记
    在Rust中Traits:定义可共享的行为比较类似其他语言中的接口TraitsAtraitdefinesfunctionalityaparticulartypehasandcansharewithothertypes.Wecanus......
  • 开放-封闭原则
    返回目录原则开放封闭原则:软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。[ASD]可扩展,不可修改对于扩展是开放的(Openforextension)对于更改是封闭的(Closed......