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

本文共 1876 字,大约阅读时间需要 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中floor函数的作用是什么?
    查看>>
    MySQL中group by 与 order by 一起使用排序问题
    查看>>
    mysql中having的用法
    查看>>
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>