Happy_Enger 2021-11-10 15:38 采纳率: 0%
浏览 41

PCI设备DMA访问,缓存不一致情况

  1. 主机X86,插上PCI卡,主机侧驱动和板侧驱动是自己写的;
  2. 卡侧DMA将数据从主机侧一块物理地址搬移到卡侧一块物理地址,物理地址都是使用dma_alloc_coherent() 接口分配的连续的一致性地址;
  3. 同样的程序,在两台不同的主机上进行跑,一台是正常的通信,一台是有问题的,数据表现为有的是正确的,有的是没写进去,好像跟CPU缓存有关系,但是内核接口的 关cache 操作已经能调的都调了。
  4. 不知道这是主板问题还是其他问题,求解答。
  • 写回答

2条回答 默认 最新

  • 老皮芽子 2021-11-10 17:28
    关注

    这是一个 Cache 一致性问题
    CPU 为了加速访问 DDR ,一般都是启用 Cache,通常 Cache 与 DDR 的数据是一致的,但是在一些 DMA 操作 DDR 时,DDR 数据变了 Cache 没变。也有 Cache 变化后 DDR 没有跟着变化,就使 Cache 与 DDR 不一致。
    消极的办法是禁止用 Cache 。
    也可以通过函数将 "Cache 内容刷新至DDR" 或 "将DDR内容拉进 Cache".使 Cache 与 DDR 保持一致
    xil_DCacheInvalidateRange //Cache 内容刷新至DDR
    xil_DCaheFlushRange //将DDR内容拉进 Cache
    这俩函数是 xilinx fpga cpu 中的,别的cpu也会有类似的函数。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月10日

悬赏问题

  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用