0
点赞
收藏
分享

微信扫一扫

Arm linux dma mapping操作


概述

由于处理器存在cache,cache和内存中数据可能不一致,所以驱动在使用dma在内存和device之间搬移数据前后需要cpu对cache和内存中数据进行同步。有些dma寻址能力有限,比如只能寻址内存低128m,但数据在内存的1G地址处,这时需要进行数据转移。

基本概念

cpu读取数据时先查询l1 cache,如果没有再向l2 cache
查询,如果没有在向内存查询,然后把数据从ddr 内存搬移到l2 cache和l1
cache。Cpu写数据,改变了l1 cache中内容,这时l1 cache可能把数据写会到ddr
内存,也可能过段时间再写。两个l1 cache和l2
cache之间数据同步,arm中按照moesi协议同步,这里不进行介绍。

基本概念:

PoU:在单核中在某一存储层级上,指令cache,数据cache和TLB在某一点上能够看到一致内容或相同copy,称为Pou;或者在an Inner Shareable shareability domain中,指令cache,数据cache和TLB在某一点上能够看到一致内容或相同copy,称为Pou;

PoC:系统中所有agents(系统中master,或者observer,例如,cpu,dma)看到的memory
一致点, 称为PoC.

例如,图中CPU core0和CPU core1为一组cluster0,CPU core2和CPU
core3为一组cluster1,

L2 cache为PoU,DDR memory为PoC。

Clean:把cache中指定地址内容写会到PoU或PoC。

Invalidate:
使cache中指定地址内容无效,如果cache中修改没有写回内存,那么这次修改会丢失。

Clean and invalidate:clean指令后执行invalidate指令。

回写(write back)

      修改了cache中内容后,并不把更新立即写到内存,把修改的cache line标记为dirty。但执行clean操作时,把cache修改内容写的内存,或者,替换cache line时,把cache修改内容写的内存。

直写(write through)

    修改了cache中内容后,立即写到内存。

Arm linux dma mapping操作_缓存

流式 DMA 和一致性 DMA

在一致性 DMA 映射中,它采用的是系统预留的一段 DMA 内存用于 DMA 操作,这一段内核在系统启动阶段就已经预留完毕,比如 arm64 平台会在 dts 文件中写明系统预留的 DMA 内存段位于何处,并且会被标志为用于 dma 一致性内存申请,如果你有关注 DMA 的一致性映射操作 API 就会发现,一致性 DMA 不会去使用别的地方申请的内存,它都是通过dma_alloc_coherent自我申请内存,然后驱动自己填充数据最后被提交给 DMA 控制器。

流式 DMA 中,它可以是随意的内存交给 DMA 进行处理,不需要从系统预留的 DMA 位置进行内存申请,任何普通的 kmalloc 申请的内存都能交给 DMA 控制器进行操作。

二者是如何做到缓存一致性的:

一致性 DMA ,在 DMA 内存申请的过程中,首先进行一个 ioremap_nocache 的映射,然后调用函数 dma_cache_wback_inv 保证缓存已经刷新到位之后,后面使用这一段内存时不存在一二级缓存;

流式 DMA ,不能直接禁止缓存,因为流式 DMA 可以使用系统中的任意地址范围的地址,CPU 总不能将系统所有的地址空间都禁止缓存,这不科学,那么为了实现缓存一致性,流式 DMA 需要不断的对缓存进行失效操作,告诉 CPU 这一段缓存是不可信的,必须从内存中重新获取。一致性 DMA 就是直接将缓存禁止,而流式 DMA 则是将缓存失效刷新。

Cache操作 写数据到device

        cpu执行clean指令,把cache中写到内存 cpu配置dma,dma搬移内存中数据到device

从device读数据 dma搬移device数据到内存

        cpu执行 invalidate指令,使cache中内容无效;cpu处理数据,由于之前设置了cache无效,所以会从内存读取数据到cache

swio技术

swio技术,当dma寻址能力小于cpu分配的物理地址时,swio技术会从低端地址,比如0-64m中分配一块物理地址,建立低端物理地址和cpu分配的物理地址映射,并且后续dma使用低端dma地址进行数据搬移,如果是dma从物理内存搬移数据到设备
(DMA TO DEVICE),那么cpu先把数据从cpu分配物理地址复制到低端物理地址,后续dma从低端物理地址搬移到设备。如果是dma从设备搬移数据到物理内存(DMAFROM DEVICE),那么dma从设备搬移到低端物理地址,然后通知cpu,cpu从低端物理地址复制数据到原高端物理地址,
但如果dma寻址能力够,就不需要这一步。

举报

相关推荐

0 条评论