DMA及cache一致性

分类: LINUX

        cache的作用:

        CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中(hit)”,此时CPU直接从Cache中调用该内容;否则,就称为“missing”,CPU只好去内存中调用所需的子程序或指令了。
        CPU不但可以直接从Cache中读出内容,也可以直接往其中写入内容。
        Cache的存取速率相当快,使得CPU的利用率大大提高,进而使整个系统的性能得以提升。
        Cache的一致性就是直Cache中的数据,与对应的内存中的数据是一致的。
        
        dma的作用:
        DMA是直接操作总线地址的,这里先当作物理地址来看待(系统总线地址和物理地址只是观察内存的角度不同)。如果cache缓存的内存区域不包括DMA分配到的区域,那么就没有一致性的问题。但是如果cache缓存包括了DMA目的地址的话,一致性就会有问题,因为经过DMA操作,cache缓存对应的内存数据已经被修改了,而CPU本身不知道(DMA传输是不通过CPU的),它仍然认为cache中的数据就是内存中的数据,以后访问Cache映射的内存时,它仍然使用旧的Cache数据。这样就发生Cache与内存的数据“不一致性”错误。

        总线地址是从设备角度上看到的内存,物理地址是CPU的角度看到的未经过转换的内存(经过转换的是虚拟地址)

        DMA如果使用cache,那么一定要考虑cache的一致性。解决DMA导致的一致性的方法最简单的就是禁止DMA目标地址范围内的cache功能。但是这样就会牺牲性能;因此在DMA是否使用cache的问题上,可以根据DMA缓冲区期望保留的的时间长短来决策。
        DAM的映射就分为:一致性DMA映射和流式DMA映射。
        一致性DMA映射申请的缓存区能够使用cache,并且保持cache一致性。一致性映射具有很长的生命周期,在这段时间内占用的映射寄存器,即使不使用也不会释放。生命周期为该驱动的生命周期;dma_alloc_coherent
        流式DMA映射实现比较复杂,生命周期比较短,而且禁用cache。一些硬件对流式映射有优化。建立流式DMA映射,需要告诉内核数据的流动方向; dma_alloc_writecombine

        [应用]以intel的ioat为例,其有N个dma引擎,每个引擎有独立的channel。
        在使用中,先申请channel,填充dma的src、dest地址,申请dma_async_tx_descriptor,并tx_submit。
        由于其支持sg接口,能方便使用者处理矢量io。
        dma应用中,只有penging tx被请求后,执行dma_async_issue_pending,dma才开始真正工作。


from:http://blog.chinaunix.net/uid-29631743-id-4357014.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值