精华内容
下载资源
问答
  • cache一致性问题

    千次阅读 2012-11-12 09:09:16
    cache一致性问题 转自http://blog.csdn.net/dianhuiren/article/details/6896129 这周碰到的一个问题,在解决的过程中得到不少高手的热心帮助,把一些总结贴出来,欢迎大家指点。写一个屏驱动的时候...

    cache一致性问题

    转自http://blog.csdn.net/dianhuiren/article/details/6896129


    这周碰到的一个问题,在解决的过程中得到不少高手的热心帮助,把一些总结贴出来,欢迎大家指点。写一个屏驱动的时候,需要把一块内核中用kmalloc分配的内存映射到应用层中使用。这是一个很simple的需求,很轻松的就可以通过mmap搞定:

    驱动部分代码:
    1698         if((mmap_addr = kmalloc(PAGE_SIZE, GFP_KERNEL)) == NULL){
    1699                 ret = -ENOMEM;
    1700                 goto out;
    1701         }
    1702         SetPageReserved(virt_to_page((mmap_addr)));

    ....

    899         long length = vma->vm_end - vma->vm_start;
    900 
    901         if (length > PAGE_SIZE)
    902                 return -EIO;
    903 
    904         if ((ret = remap_pfn_range(vma,vma->vm_start,virt_to_phys((void *)mmap_addr) >> PAGE_SHIFT,length,vma->vm_page_prot)) < 0) {
    905                 return ret;

    ....


    应用层通过
    401         if( ( addr = mmap(NULL, 4096, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0 )) == (void *)-1)
    402         {
    403                 perror("mmap error\n");
    404                 return -1;
    405         }
    获得地址, 然后往内写入

    这是一种通过普通内存设为保留,当成io内存映射并map出去的一种方式。经过测试,发现大部分时候数据是对的,但偶尔数据会出错。随后尝试不采用remap_pfn_range建立页表,而是通过缺页时返回分配页的动态方式来处理,结果仍然一样。

    我们猜测是由于cache的原因导致的,于是在mmap的时候使其nocache,仍然无法解决。在实在没有办法的情况下,我们尝试采用在内核读取共享内存时执行flush_all_cache,果然,解决了问题,证明了确实是cache导致的。

    那么为什么一开始我们种种尝试未能成功呢?因为我们弄反了方向。我们以为是应用层在读cache,内核读内存,实际上,由于采用remap_pfn_range,或者我们在mmap的时候指定了nocache的方式,应用层读取这片vma的时候是根据其指定的nocache属性去读内存,而内核访问kmalloc的时候却是读内存。如何让内核也读内存呢,很简单,通过ioremap_nocache把kmalloc得到的地址再做一次映射,然后给内核用就可以了。

    这就是传说中的Cache Coherence ---缓存一致性。由于cache和内存在某些时候的不一致而导致的不同地址空间分别读写导致的问题。并不是所有体系结构都存在这种问题,比如x86.我曾经在x86上用过mmap并且使用良好,因为x86的体系结构确保了缓存一致性:其总线监听技术使当某片被cache的内存被其他请求操作时,会被立刻回写,确保cache与内存的一致性。但这种监听技术会带来性能上的损耗,所以arm是由软件来确保这个一致性的:一些时候,比如进程切换,必须通过flush整个cache获得正确的内存访问。

    在这里例子里,我们是通过内核和应用都nocache的方式来进行内存共享的。那么双方能不能通过cache的方式来访问呢?我们必须知道,有两种cache:物理cache和逻辑cache,对于armv6以下的arm芯片,采用的是逻辑cache的方式,即cache在mmu之前,而armv6及以上的cpu,cache在mmu之后,cpu送出的要访问的地址先通过mmu进行虚拟/物理的转换,再送到cache。这意味着什么呢?意味着对于我们的cpu(v5),当应用层用其地址空间的地址把共享区从内存加到cache后,内核同样访问这片区域的时候,也可以按照其kmalloc分配的地址将同一片内存中的数据加载到cache的另一行中,这就意味着一个内存块会有2个cache拷贝,也就是传说中的别名。简单地说,如果你用arm11,由于使用物理cache,所以不会有问题,而arm9的话,就很麻烦了。

    那为什么有时候访问正确,有时候访问错误呢?这就和cache的替换策略有关了。不像x86由于总线监视的原因,可以在相关内存被touch的时候回写,arm的cache只有当是dirty,并且被cache轮转策略选中需要换出的时候,才会被回写。所以有时候,某些加载共享内存的cache块没有被替换,而相应的内存块又被内核加载到cache形成别名,错误就自然产生了。

    这就是cache导致的问题。如果双方采用一样的cache策略,自然cache就是透明的,但是如果是不一样的方式,那么可能就会有问题。具体会有哪些问题,如前所述,就和cpu,体系结构有着密切的关系了。

    展开全文
  • DMA和Cache一致性问题

    2018-07-20 17:18:27
    DMA和Cache一致性问题: CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,比内存小的多但速度快。 因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。
  • 内存与cache一致性问题

    千次阅读 2019-06-02 18:40:13
    使用Xilinx SDK对Zynq的PCIE,SRIO等高速接口进行调试的过程中,经常会涉及到DMA对DDR数据的读写,此时就会引入会引入cache一致性问题。Zynq的PS在运行过程中,通过DDR控制器对DDR存储器进行访问,为了加快访问速度...

    使用Xilinx SDK对Zynq的PCIE,SRIO等高速接口进行调试的过程中,经常会涉及到DMA对DDR数据的读写,此时就会引入会引入cache一致性问题。Zynq的PS在运行过程中,通过DDR控制器对DDR存储器进行访问,为了加快访问速度,常常将一些数据缓存在cache中,而且不是针对一个数据数据缓存,而是一批(Xilinx称为一行,即line,一行长度为32),这样的好处是下次访问速度会加快,但是坏处也很明显,cache数据发生变化,不能马上反映到DDR中,反之亦然。当通过DMA修改DDR数据时,CPU可能还不知道发生了什么,拿到的数据还是cache中没有修改的数据,导致读写数据的错误。

    解决的办法有以下两种

    1. 调试过程中,直接禁用cache,即使用Xil_DCacheDisable();CPU将直接访问DDR内存,读写都是直接的,这会降低CPU性能,但简化了数据传输操作,属于极端方法。
    2. 使用CacheFlushCache Invalidate操作,CacheFlush把Cache里的数据清空,将Cache内容推到DDR中;而Cache Invalidate表示当场宣布Cache内容无效,需要从DDR中重新加载数据,即把数据从DDR中拉到Cache中。
    Xil_DcacheFlushRange((u32)sendram,sizeof(buffer));
    //将内容刷新至DDR
    Xil_DcacheInvalidRange((u32)recvram,sizeof(buffer));
    //将DDR内容拉近Cache中
    #include "xil_cache.h"
    //上述函数头文件
    
    展开全文
  • 多处理机Cache一致性问题及解决办法

    万次阅读 2016-07-17 15:25:30
    1. 造成Cache一致性问题的原因出现不一致的原因有三个:共享可写的数据、进程迁移和I/O传输。2. 解决办法解决多处理机Cache一致性问题提出了两种解决办法:侦听一致性协议和基于目录的一致性协议。由于多数SMP(对称...

    1. 造成Cache一致性问题的原因

    • 出现不一致的原因有三个:共享可写的数据、进程迁移和I/O传输。

    2. 解决办法

    解决多处理机Cache一致性问题提出了两种解决办法:侦听一致性协议和基于目录的一致性协议。由于多数SMP(对称多处理机)结构是采用总线互连的,侦听一致性协议是基于侦听总线事务来保持Cache一致性的协议,所以多数产品采用侦听协议。

    • 基于总线互连的SMP是通过高速共享总线将若干个商用的微处理器(包括高速缓存)与共享存储器连接起来,因此,可以利用总线来实现高速缓存一致性。
    • 总线上的每个设备都能侦听到总线上出现的事务,当一个处理器向存储系统发出一个读/写请求时,它的本地高速缓存控制器将检查自己的状态,并采取相应的动作。
    • 所有的高速缓冲器都侦听总线上出现的事务,一旦发现与自己有关的事务,就执行相应的动作来保证高速缓存的一致性。

    侦听一致性协议是利用总线的一下两个特点来实现一致性的

    • 一是总线上的所有事务对所有的高速缓存控制器都是可见的。
    • 二是总线上所有事务以相同的次序内所有的高速缓存控制器可见。
    展开全文
  • 多处理机的Cache一致性问题及其解决方案多处理机的Cache一致性问题及其解决方案1 多处理机体系结构2 Cache一致性问题3 监听一致性协议3.1 写作废方式3.1.1 具体流程3.1.2 状态转换图3.2 写更新方式4 目录一致性协议 ...

    多处理机的Cache一致性问题及其解决方案

    1 多处理机体系结构

    一种很朴素的提高计算机解决问题的性能的方法是,把多个小的计算机连接起来、并行执行相对独立的任务、必要时互相做到通信,就可以制造出一台功能强大、性能较高的计算机,这也是多处理机技术的基本思想。

    在这,我们将讨论的多处理机局限于

    • 处理机的协调与使用由单一的处理器系统来控制。
    • 多处理机通过共享地址空间来共享存储器。
    • 各个处理机有自己的 Cache

    在逻辑上,多处理机共享地址空间。而在物理上,可以采取两种方式布置主存储器,可以采取集中式和分布式。如下图:

    对于图一的集中式结构,通常称其为集中式共享存储器体系结构,这种体系结构还有的一个特点是,所有的处理器访问存储器的延迟都是一致的,有时也被称为UMA结构(Uniform Memory Access)。

    对于图二的集中式结构,通常称其为分布式共享存储器体系结构,这种体系结构采用了分布式处理器,各处理器间通过互联网络进行数据的传送,有时也被称为NUMA结构(Non-Uniform Memory Access)。

    而无论是哪一种结构,都可能会出现数据共享的问题,即两个不同处理机的 Cache 存放了缓存了同一个主存单元的块,即共享数据,这种情况就可能会导致 Cache 一致性问题的出现。


    2 Cache一致性问题

    通过下图,我们能理解什么是 Cache 一致性问题。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l55pCTTO-1611658082232)(D:\computer_arch\multi_processor\一致性问题.png)]

    具体的过程描述如下:

    • 初始时,CPU A Cache 以及CPU B Cache 中无缓存内容,而主存中的X单元处存储的内容为1。
    • 在1时间时,CPU A 读取 X 单元,由于CPU A Cache 中无缓存内容,因此将主存中的数据读入CPU A Cache 中。
    • 在2时间时,CPU B 读取 X 单元,由于CPU B Cache 中无缓存内容,因此将主存中的数据读入CPU B Cache 中。
    • 在3时间时,CPU AX 单元写入0,假设写策略为写直达法,由于主存是共享的,CPU A 将更新其 Cache 的内容为0,且将主存的 X 单元的内容更新为0。
    • 但是 CPU B Cache 中缓存的 X 单元的值仍为旧值,这就导致不一致的情况出现了。

    为实现 Cache 的一致性,针对两种体系结构,可以采用两种不同的方法保证 Cache 的一致性。


    3 监听一致性协议

    针对第一种体系结构,即集中式共享存储器体系结构,来说明这种协议,并且假设Cache 的写命中策略是写回法

    所谓监听,就是每个 CPU 都有一个Cache控制器,随时对通过总线中的数据进行判断,判断自己这是否有总线上请求的数据块。

    我们讨论两种保持一致性的方式:写作废方式、写更新方式。

    3.1 写作废方式

    这种方式的基本思想是,当某个 CPU 出现写请求时,将其它的副本直接作废。其详细过程如下,

    为了更好地讨论协议,我们将每个CPUCache 的每个块都归结为下述的三种状态:

    • 未缓冲(U):所有的 Cache 中都无此块。
    • 专有态(E):即该块仅仅在该Cache 中有副本,且该块的内容与主存中的不一致。
    • 共享态(S):即该块在一个或多个 Cache 中有副本,且内容与主存中一致。

    3.1.1 具体流程

    • 假设 CPU 1 有一个读请求,
      • 若命中,则 Cache 1 直接将值返回给 CPU 1
      • 若未命中,就把读失效信号、以及相应地址放到总线上,其他的的 CPU 一直监听着总线,CPU 1 进行读取主存的操作,
        • 若该地址不能在其他 CPUCache 中被匹配,则结果就是 CPU 1 能正常从主存中读取出数据,且将该块设置为共享态
        • 若该地址在 CPU 2 中被匹配上,且该块在 CPU 2Cache 中的状态是共享态,那么CPU 2 将不会采取任何操作。
        • 若该地址在 CPU 2 中被匹配上,且该块在 CPU 2Cache 中的状态是专有态,那么CPU 2 将向 CPU 1 提供该块,并停止 CPU 1 访问主存的操作。同时,该块将被写回至主存,CPU 1 Cache 以及 CPU 2 Cache 中该块的状态修改为 共享态
    • 假设 CPU 1 有一个写请求,
      • 若写命中,
        • 若该块在CPU 1 Cache 中的状态是共享态,那么 CPU 1 将该块状态改为专有态,且向总线发送写作废信号,使得别的 CPU 将其Cache 中相应的共享块(若存在)设置为无效
        • 若该块在CPU 1 Cache 中的状态是专有态,那么 CPU 1 进行正常的写数据的操作,即将新数据写入该块。
      • 若写缺失,
        • 那么 CPU 1 将该块状态改为专有态,并且正常写入数据,且向总线发送写作废信号,使得别的 CPU 将其Cache 中相应的块(若存在)设置为无效

    3.1.2 状态转换图

    其状态转换图如下,

    3.2 写更新方式

    这种方式的思想是,当某个 CPU 出现写请求时,将其它的副本一并更新。

    具体说来,就是当一个 CPU 写某数据时,若该块是共享块,通过广播使其他所有 Cache 中有对应副本的块都一并更新。

    这种方式很需要总线和存储器的带宽,因为要经常性地广播修改的数据,这使得这种方法被采用地越来越少。


    4 目录一致性协议

    目录是一种数据结构,记录了 Cache 块的一些状态:

    • Cache 块的访问状态,未缓冲共享态专有态
    • Cache 块的位向量,用于记录该 Cache 块的共享情况,即位向量的每一位代表一个处理器(CPU),若其为 1 ,则表明在该位置的 CPU 有该 Cache 块的副本。

    同样地,目录一致性协议也有两种实现方式,即写作废方法、写更新方法,在这里,我们同样假设 Cache 的写策略是写回法

    此时,Cache 每个块的状态转换模式和监听一致性协议是一样的

    基于目录的一致性协议要避免不必要的性能损失,比如避免广播,而是根据位向量,找到对应的 CPU 向其发送信息。

    总结一下目录一致性协议的基本点:

    • 每个 CPU 节点增加了目录存储器,用于存放目录
    • 存储器的的每一块在目录中都有对应的一项。
    • 每一个目录项的组成成分是:访问状态、位向量。
    • 状态描述该目录项对应的存储块的访问状态:未缓冲共享态专有态
    • 位向量的每一位对应于一个 CPUCache,用于指出该 CPUCache 有无该块的缓存。
    • 当处理器对某一块进行写操作时,需要根据位向量,**”通知“**对应的 CPU 进行作废或更新操作。

    基于目录的一致性协议配合分布式共享存储器体系结构,能很好地支持系统的可扩展性,然而,这种多处理机的实现模式,需要带宽较大的网络来实现,普通的以太网是远远达不到带宽要求的。

    展开全文
  • 例说STM32F7高速缓存——Cache一致性问题(一)

    万次阅读 多人点赞 2017-11-01 17:01:02
    例说STM32F7高速缓存——Cache一致性问题(一) 例说STM32F7高速缓存——Cache一致性问题(二) 例说STM32F7高速缓存——Cache一致性问题(三) 为了说清楚这个问题,我特意翻出了压箱底的那本杜春雷老师的《ARM...
  • 例说STM32F7高速缓存——Cache一致性问题(三)

    万次阅读 多人点赞 2017-11-03 20:55:37
    3. Cache 一致性问题3.1 什么是 cache 一致性问题 所谓的 Cache 一致性问题, 主要指的是由于 D-cache 存在时,表现在有多个 Host(典型的如 MCU 的 Core, DMA 等)访问同一块内存时, 由于数据会缓存在 D-cache ...
  • ARM外设寄存器Cache一致性问题

    千次阅读 2014-11-02 21:31:52
    ARM外设寄存器Cache一致性问题 2012-05-22 09:44:14 分类: 嵌入式  /* bank4 DM9000 ,关闭cache和写缓冲,否则出现cache不一致问题 */  MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_...
  • 在多处理器系统中普遍使用高速缓存(Cache)来提高系统的性能,高速缓存的使用虽然提高了数据的存取速度,但也引出了高速缓存一致性问题。主要讨论了高速缓存出现不一致性的各种情况,并综述了目前针对高速缓存不一致问题...
  • DMA导致的CACHE一致性问题解决方案

    千次阅读 2018-08-21 18:10:07
    先简单说一下DMA的CACHE一致性是个啥问题。 复制:   CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中(hit)”,此时CPU直接从Cache中调用该内容;否则,就 称为“ 不命中”,CPU...
  • 介绍了DMA和cache的关系和内在原理,内核中流式DMA结构的介绍和使用
  • 在基于高性能ARM 处理器的SoC结构中,Cache性问题是系统稳定运行的潜在威胁,消除该障碍是 系统设计师必须解决的问题。介绍了ARM926EJ-S处理器内Cache的工作原理以及基于该处理器的典型SoC结 构,重点论述了产生...
  • DMA和cache一致性问题

    千次阅读 2018-09-11 10:07:49
    CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存 读写速度不匹配的矛盾,因为CPU运算速度要比内存读写...
  • 本文着重分析TI高性能C64x+ DSP系列中各级CACHE之间数据一致性问题以及如何进行一致性维护。 1. 概述 CACHE作为Core和低速存储器之间的桥梁,基于代码和数据的时间和空间相关性,以块为单位由硬件控制器
  • 因此cpu和dma合作时,就会存在cpu cache和内存的一致性问题,原因是dma对内存操作无法被cache感知。 当然如果给dma的内存是no cache的,cpu不会使用cache,也就不存在相关问题。 如果给dma的是带cache内存,那么cpu...
  • cache一致性问题的一个现象

    千次阅读 2015-04-21 14:34:51
    上图是在调试ARM与DSP通信时产生的catch 与 内存不一致的现象。
  • 例说STM32F7高速缓存——Cache一致性问题(二)

    万次阅读 多人点赞 2017-11-03 17:31:01
    2. STM32F7 新特性——高速缓存2.1 STM32F7 的存储系统 STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,...
  • 如果要让只读的信息从 Virginia 端发起,Memcached 的 Cache 数据一致性就是个问题。 1 用户发起更新操作,更名 "Jason" 到 "Monkey" ; 2 主数据库写入 "Monkey",删除主、从两端 Memcached 中的名字值; 3 在 ...
  • 嵌入式系统中Cache一致性问题分析

    千次阅读 2010-09-07 11:02:00
    的速度和性能提高很快而主存速度较低且价格高,第二就是程序执行的局部特点。因此,才将速度比较快而容量有限的SRAM构成Cache,目的在于尽可能 发挥CPU的高速度。很显然,要尽可能发挥CPU的高速度就必须用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,484
精华内容 72,593
关键字:

cache一致性问题