博客
关于我
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 在内核空间与用户空间
    你可能感兴趣的文章
    Webpack 基本环境搭建
    查看>>
    mysql5.7 安装版 表不能输入汉字解决方案
    查看>>
    MySQL5.7.18主从复制搭建(一主一从)
    查看>>
    MySQL5.7.19-win64安装启动
    查看>>
    mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
    查看>>
    MySQL5.7.37windows解压版的安装使用
    查看>>
    mysql5.7免费下载地址
    查看>>
    mysql5.7命令总结
    查看>>
    mysql5.7安装
    查看>>
    mysql5.7性能调优my.ini
    查看>>
    MySQL5.7新增Performance Schema表
    查看>>
    Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
    查看>>
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>