• [转]浅谈scatter-gather DMA


    在正文开始之前需要先搞明白以下几个问题:
    1. 什么是DMA?

    DMA的中文名称叫做 直接内存访问,是一种不需要CPU参与,就能实现数据搬移的技术(从一个地址空间到另一个地址空间)。

    2. DMA有什么用?

    一定程度上解放CPU,对于实现  高效嵌入式系统 与  加速网络数据处理  有极其重要的作用。

    3. DMA的实现简述

    在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束 4个步骤。

    scatter-gather DMA 与 block DMA
    传统的block DMA 一次只能传输物理上连续的一个块的数据, 完成传输后发起中断。而scatter-gather DMA允许一次传输多个物理上不连续的块,完成传输后只发起一次中断。 

    传统的block DMA像这样:

    先进的scatter-gather DMA像这样:

    这样做的好处是直观的,大大减少了中断的次数,提高了数据传输的效率。

    scatter-gather DMA的应用

    dpdk在ip分片的实现中,采用了一种称作零拷贝的技术。而这种实现方式的底层,正是由scatter-gather DMA支撑的。dpdk的分片包采用了链式管理,同一个数据包的数据,分散存储在不连续的块中(mbuf结构)。这就要求DMA一次操作,需要从不连续的多个块中搬移数据。附上e1000驱动发包部分代码:

    uint16_t
    eth_em_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
            uint16_t nb_pkts)
    {
        //e1000驱动部分代码
        ...
        m_seg = tx_pkt;
        do {
            txd = &txr[tx_id];
            txn = &sw_ring[txe->next_id];
     
            if (txe->mbuf != NULL)
                rte_pktmbuf_free_seg(txe->mbuf);
                txe->mbuf = m_seg;
     
            /*
            * Set up Transmit Data Descriptor.
            */
            slen = m_seg->data_len;
            buf_dma_addr = rte_mbuf_data_iova(m_seg);
     
            txd->buffer_addr = rte_cpu_to_le_64(buf_dma_addr);
            txd->lower.data = rte_cpu_to_le_32(cmd_type_len | slen);
            txd->upper.data = rte_cpu_to_le_32(popts_spec);
     
            txe->last_id = tx_last;
            tx_id = txe->next_id;
            txe = txn;
            m_seg = m_seg->next;
        } while (m_seg != NULL);
     
        /*
        * The last packet data descriptor needs End Of Packet (EOP)
        */
        cmd_type_len |= E1000_TXD_CMD_EOP;
        txq->nb_tx_used = (uint16_t)(txq->nb_tx_used + nb_used);
        txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_used);
        ...
    }


    ---------------------
    版权声明:本文为CSDN博主「Alan. W」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_38006908/article/details/87375404

  • 相关阅读:
    8/30 sql脚本
    navicat批量添加uuid去重
    循环向JsonArray添加对象
    java String字符串去除()里的内容
    工厂模式
    Thymeleaf学习
    SSH开发常用常见的src下建的包名
    04jQuery操作03
    04jQuery筛选jquery对象02
    04jQuery筛选jquery对象01
  • 原文地址:https://www.cnblogs.com/tubujia/p/11310208.html
Copyright © 2020-2023  润新知