博客
关于我
Kernel space DMA and User space DMA
阅读量:573 次
发布时间:2019-03-11

本文共 1880 字,大约阅读时间需要 6 分钟。

DMA 在内核空间与用户空间

一、内核空间 DMA 的使用步骤

1.1 内核空间 DMA 映射(Coherent DMA Mapping)

  • 创建内核空间 DMA 映射
    • 使用 kmalloc 或类似函数分配物理连续内存(如 tx_bufrx_buf)。
    • 通过 DMA 映射 API 将内核空间缓冲区映射到外部设备。
    1. 操作步骤:
      • 将 DMA address 写入硬件的 DMA register。
      • 对于数据发送,复制数据到 DMA 缓冲区。
      • 启用 DMA 发送(完成后发送数据)。
      • 对于数据接收,复制 DMA 缓冲区中的数据。
      1. 中断处理:
        • 如果是接收中断,禁用接收 DMA 中断,并复制数据。
        • 如果是发送中断,撤销 DMA 映射,准备发送新数据。

        1.2 流 DMA 映射

      2. 内核空间流 DMA 操作步骤:
        • 提供物理连续内存缓冲区(tx_bufrx_buf)。
        • 将 data 传输到传输缓冲区(tx_buf)和接收缓冲区(rx_buf)。
        • 使用 DMA 映射 API 创建 DMA 映射。
        • 启用硬件设备的传输和接收功能。
        1. 中断处理:
          • 如果是传输完成中断,撤销 DMA 映射,释放缓冲区。
          • 如果是接收中断,处理接收数据并恢复设备状态。

          二、用户空间 DMA 的支持

          为了支持用户空间 DMA,需要在内核空间完成以下操作:

          2.1 用户空间 DMA 的必要条件

        2. 如何找到物理连续内存以进行 DMA 操作。
        3. 如何创建流 DMA 映射。
        4. 如何管理和删除 DMA 映射。
        5. 如何获取接收数据。
        6. 如何将数据放入发送缓冲区。

        7. 2.2 uio-dma.c 的功能分析

          uio-dma.c 是由 Max Krasnyansky 编写,用于支持用户空间 DMA 操作。

        8. 功能模块:
          • uio_dma_alloc:分配 DMA 区域。
          • uio_dma_free:释放 DMA 区域。
          • uio_dma_map:将 DMA 区域映射到设备。
          • uio_dma_unmap:从设备中取消映射 DMA 区域。
          1. **核心 API":
            • uio_dma_alloc(fd, size, cache, dma_mask, memnode)
            • uio_dma_map(fd, area, devid, dir)
            • uio_dma_unmap(fd, mapping)

          2. 三、uio DMA 用户空间 API

            3.1 allocating new DMA area

            struct uio_dma_area *uio_dma_alloc(int fd, unsigned int size,
            unsigned int cache,
            uint64_t dma_mask,
            unsigned int memnode);
          3. 参数说明:

            • fd:UIO DMA 文件描述符。
            • size:区域大小。
            • cache:缓存模式。
            • dma_mask:DMA 地址掩码。
            • memnode:内存节点。
          4. 调用步骤:

            • 通过 ioctl 调用 UIO_DMA_ALLOC 方法获取区域。
            • 映射区域地址到用户空间,以便用户空间程序访问。

            3.2 freeing DMA area

            int uio_dma_free(int fd, struct uio_dma_area *a);
          5. 调用步骤:
            • 通过 ioctl 调用 UIO_DMA_FREE 方法。
            • 内核空间会释放分配的 DMA 区域,重置相关资源。

            3.3 mapping DMA area to device

            int uio_dma_map(int fd, struct uio_dma_area *area, uint32_t devid, unsigned int dir);
          6. 参数说明:

            • devid:UIO DMA 设备 ID。
            • dir:方向(DMA_TO_DEVICEDMA_FROM_DEVICE)。
          7. 调用步骤:

            • 创建映射请求。
            • 将 DMA 区域对应的物理地址映射到设备。
            • 返回新的映射信息。

            3.4 unmap DMA area from device

            int uio_dma_unmap(int fd, struct uio_dma_mapping *m);
          8. 调用步骤: -撤销设备对 DMA 区域的映射。
            • 释放设备资源。

            参考文献

          9. 技术博客:DMA 在内核空间与用户空间
    你可能感兴趣的文章
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>