博客
关于我
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 在内核空间与用户空间
    你可能感兴趣的文章
    mysqldump实现数据备份及灾难恢复
    查看>>
    mysqldump数据库备份无法进行操作只能查询 --single-transaction
    查看>>
    mysqldump的一些用法
    查看>>
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>