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

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

DMA 在内核空间与用户空间

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

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

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

        1.2 流 DMA 映射

      2. 内核空间流 DMA 操作步骤:
        • 提供物理连续内存缓冲区(tx_buf 和 rx_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_DEVICE 或 DMA_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 在内核空间与用户空间
    你可能感兴趣的文章
    Python:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>
    Python:生成具有趋势的随机时间序列数据(例如周期性、指数衰减等)
    查看>>
    Python:用渐进式数字重命名列表中的重复项而不对列表进行排序
    查看>>
    Python:矩形参数无效
    查看>>
    Python:语法进阶
    查看>>
    Python:调用复制函数时调用 Python 对象时超出了最大递归深度
    查看>>
    Python:这两个 import 语句有什么区别?
    查看>>
    Python:通过串口从 Velleman k8090 读取数据
    查看>>
    python:遍历具有列表值的字典
    查看>>