传统协议栈和DPDK

合集下载

dpdk工作原理

dpdk工作原理

dpdk工作原理DPDK(Data Plane Development Kit)是一个用于数据包处理的开源工具集。

它的设计目标是提供一个高效灵活的网络数据包处理框架,以加速数据包处理应用程序的性能。

DPDK的工作原理可以概括为以下几个关键步骤:1. 初始化:应用程序通过调用DPDK提供的初始化函数来初始化环境。

这包括创建内存池、设置物理地址转换、配置核间通信等。

2. 配置:应用程序将网络设备绑定到DPDK的驱动程序上,以便DPDK可以直接访问网络设备的物理资源。

此外,还需要配置网络设备和队列的属性,如队列大小、数目、RSS配置等。

3. 启动:应用程序启动DPDK的运行时环境,并绑定每个逻辑核心到指定的物理核心。

这样可以确保数据包处理在指定的核心上执行,避免了多核心之间的上下文切换开销。

4. 接收:DPDK使用轮询模式或中断模式从网络设备接收数据包。

在轮询模式下,每个逻辑核心定期检查网络设备的接收队列,将接收到的数据包复制到应用程序的缓冲区。

在中断模式下,网络设备将接收到的数据包触发中断,逻辑核心在中断处理程序中将数据包复制到缓冲区。

5. 数据包处理:应用程序通过DPDK提供的数据包处理函数对接收到的数据包进行处理。

这包括解析数据包头部、查找路由表、执行策略等操作。

6. 发送:应用程序通过调用DPDK的数据包发送函数将处理后的数据包发送回网络设备。

DPDK会将数据包复制到发送队列,并通知网络设备发送数据包。

7. 结束:在应用程序完成数据包处理后,可以调用DPDK提供的清理函数来关闭网络设备、释放资源等。

这样可以确保环境的恢复和系统的稳定。

DPDK的工作原理基于用户空间的数据包处理模式,通过绕过操作系统内核,直接访问网络设备和物理资源,从而避免了操作系统内核的开销和限制。

这使得DPDK能够实现高效的数据包处理,提升网络应用程序的性能。

传统协议栈和DPDK

传统协议栈和DPDK

一、传统协议栈之数据包从NIC到内核1、从NIC到内存概括地说,网络数据包进入内存(接收数据包)的流程为:网线—-> Rj45网口——> MDI 差分线-—> bcm5461(PHY芯片进行数模转换)——> MII总线-—〉TSEC的DMA Engine 会自动检查下一个可用的Rx bd-—> 把网络数据包DMA 到Rx bd所指向的内存,即skb—>data1、首先,内核在主内存中为收发数据建立一个环形的缓冲队列(通常叫DMA环形缓冲区)。

2、内核将这个缓冲区通过DMA映射,把这个队列交给网卡;3、网卡收到数据,就直接放进这个环形缓冲区了——也就是直接放进主内存了;然后,向系统产生一个中断;4、内核收到这个中断,就取消DMA映射,这样,内核就直接从主内存中读取数据;对应以上4步,来看它的具体实现:1、分配环形DMA缓冲区Linux内核中,用skb来描述一个缓存,所谓分配,就是建立一定数量的skb,然后把它们组织成一个双向链表2、建立DMA映射内核通过调用dma_map_single(struct device *dev,void *buffer,size_tsize,enumdma_data_direction direction)建立映射关系。

struct device *dev,描述一个设备;buffer:把哪个地址映射给设备;也就是某一个skb——要映射全部,当然是做一个双向链表的循环即可;size:缓存大小;direction:映射方向——谁传给谁:一般来说,是“双向”映射,数据在设备和内存之间双向流动;对于PCI设备而言(网卡一般是PCI的),通过另一个包裹函数pci_map_single,这样,就把buffer交给设备了!设备可以直接从里边读/取数据.3、这一步由硬件完成;4、取消映射ma_unmap_single,对PCI而言,大多调用它的包裹函数pci_unmap_single,不取消的话,缓存控制权还在设备手里,要调用它,把主动权掌握在CPU手里——因为我们已经接收到数据了,应该由CPU把数据交给上层网络栈;当然,不取消之前,通常要读一些状态位信息,诸如此类,一般是调用dma_sync_single_for_cpu()让CPU在取消映射前,就可以访问DMA缓冲区中的内容。

dpdk examples 解释

dpdk examples 解释

文章标题:深入解析DPDK示例代码1. DPDK简介DPDK(Data Plane Development Kit)是一个开源项目,旨在加速数据包的处理和转发。

它提供了优化的数据包处理框架和库,使网络应用程序能够以极低的延迟和高吞吐量运行。

DPDK的核心特点包括零拷贝技术、大页内存和硬件加速等。

在网络功能虚拟化(NFV)和软件定义网络(SDN)等领域,DPDK被广泛应用。

2. DPDK例子代码概述DPDK提供了丰富的例子代码,涵盖了从简单的入门示例到复杂的网络应用程序的各个方面。

这些例子代码包括了初始化DPDK环境、数据包收发、网络协议栈、数据包过滤和统计等功能。

通过学习和理解这些例子代码,可以帮助开发人员更好地掌握DPDK的使用方法和性能优化技巧。

3. DPDK例子代码详解在学习DPDK例子代码时,我们可以先从简单的例子开始,逐步深入了解其原理和实现方式。

以下是一些常见的DPDK例子代码,以及它们的功能和重要实现细节:3.1 初始化DPDK环境在DPDK中,初始化DPDK环境是非常重要的一步。

例子代码中会展示如何初始化EAL(Environment Abstraction Layer)环境,包括设置内存通道、初始化设备等。

通过分析这部分代码,可以了解DPDK环境初始化的必要步骤和注意事项。

3.2 数据包收发数据包的收发是网络应用程序的核心功能之一。

DPDK提供了高效的数据包收发接口,能够实现数据包的快速接收和发送。

例子代码中会展示如何初始化网卡、设置接收队列和发送队列,以及进行数据包的收发操作。

通过学习这部分代码,可以深入了解DPDK数据包收发的原理和实现方式。

3.3 网络协议栈DPDK包含了基本的网络协议栈实现,能够支持TCP/IP协议栈、UDP 协议栈等。

例子代码中会展示如何使用DPDK的网络协议栈进行网络通信,并进行一些简单的网络应用开发。

通过分析这部分代码,可以更好地理解DPDK网络协议栈的实现原理。

dpdk加速原理

dpdk加速原理

dpdk加速原理DPDK(Data Plane Development Kit)是一种开源软件开发项目,旨在为网络数据平面的开发提供高性能的软件库和驱动。

DPDK利用了多核处理器的并行计算能力和数据包处理技术,以加速网络数据平面的处理。

其加速原理主要基于以下几点:1. 用户空间驱动:DPDK提供了一组用户空间的驱动程序,绕过了操作系统内核,直接与硬件设备进行交互。

相比于传统的基于内核的驱动,用户空间驱动可以显著减少数据包在内核和用户空间之间的上下文切换和数据拷贝,从而提高数据包处理的效率。

2. 零拷贝技术:DPDK利用了零拷贝技术,避免了数据在内存中的多次复制。

在接收数据包时,DPDK将数据包直接从网卡接收到的内存缓冲区复制到用户空间的内存中,而不需要经过内核的缓冲区。

在发送数据包时,DPDK直接从用户空间的内存中将数据包发送到网卡的发送队列中,也不需要经过内核的缓冲区。

这样可以减少数据拷贝和内存访问的开销,提高数据包处理的速度。

3. 多队列和多核技术:DPDK支持多队列和多核的并行处理。

多队列技术可以将多个网卡接收队列和发送队列分配给多个处理核心,并行地处理数据包。

而多核技术则可以利用多核处理器的并行计算能力,同时处理多个数据包。

这样可以进一步提高数据包处理的吞吐量和响应时间。

4. 预分配内存和零碎回收:DPDK在启动时预先分配了一块连续的内存区域,用于存储数据包的接收队列、发送队列和其他缓冲区。

这样可以避免内存碎片的产生,减少不必要的内存分配和释放操作,提高内存的利用率和数据包处理的效率。

总之,DPDK利用了用户空间驱动、零拷贝技术、多队列和多核技术以及预分配内存和零碎回收等技术手段,实现了高性能的网络数据平面加速。

它在加速网络函数(如包括转发、过滤和处理等)方面具有显著的优势,广泛应用于云计算、虚拟化、SDN(软件定义网络)和NFV(网络功能虚拟化)等领域。

dpdk开发者手册

dpdk开发者手册

dpdk开发者手册:向高性能数据包处理挑战的问题研究学习之路DPDK,全称为数据平面开发工具包,是一个开放源代码项目,旨在为处理高速数据包流提供一个快速,低延迟和可扩展的解决方案。

DPDK专门用于数据包处理,沿用了操作系统网络栈的设计思路,隐藏了硬件特性,实现网络转发。

本篇文章介绍,为读者提供一个深入理解DPDK以及其开发与使用的指南。

1. 什么是DPDK?DPDK是一个用于高性能数据包处理的开发工具包,提供了一个快速,低延迟和可扩展的解决方案。

它由英特尔开发并维护。

DPDK并非是一个网络协议栈的替代品,而是它的一个补充,专用于网络包处理。

通过使用DPDK,数据包的发送和接收可以绕过Linux内核堆栈的处理流程,从而提高网络应用程序的性能。

DPDK库具有高度可定制的能力,支持各种协议,如IPv4,IPv6,TCP,UDP等,并且可以支持多个网卡并行处理。

2.是一本由DPDK社区维护的开发文档,覆盖了DPDK库的所有方面。

手册包含了以下内容:- DPDK架构- 软件编程接口(API)- DPDK的编译和安装- 示例应用程序- DPDK的实现细节DPDK的架构涉及到一些核心概念,如环形缓冲区,堆栈,mempool等,这些内容在手册中都有详细讲解。

软件编程接口(API)是DPDK库的核心功能,它提供了许多与硬件无关的API以及硬件相关的API。

手册中提供了所有API的详细描述和示例代码,包括:- 缓冲区管理API- 设备驱动程序API- 分包API- 调度器API- 网络设备端口API- 队列管理API手册附带有编译和安装的详细说明。

此外,手册还提供了示例应用程序的完整源代码和说明,以便开发人员可以快速开始使用DPDK库。

3. DPDK的实现细节DPDK的实现细节是中涉及的另一个重要领域。

其中包括特定硬件的驱动程序,设备的实现,优化DPDK的性能等。

与Linux内核的网络栈不同,DPDK的设备驱动程序以及其实现是具体到特定硬件型号的。

dpdk简单理解

dpdk简单理解

dpdk简单理解DPDK(Data Plane Development Kit)是一个开源软件开发工具包,用于构建高性能的数据平面应用程序。

它提供了一套优化的API和库,可以直接操作网络设备,绕过传统的操作系统协议栈,从而实现低延迟和高吞吐量的数据包处理。

DPDK的核心设计思想是将数据包处理任务从通用计算机资源中解耦出来,通过专用硬件和优化的软件来提高数据包处理性能。

它主要包含了以下几个组件:1. 网络设备驱动:DPDK提供了一系列的网络设备驱动,支持常见的硬件网卡,并提供了统一的API接口,方便应用程序直接操作网络设备。

这样可以绕过操作系统协议栈的复杂性,减少数据包处理的延迟。

2. 内存管理:DPDK使用自己的内存池管理机制,提供了高效的内存分配和回收方式。

这种内存池的设计可以避免频繁的内存分配和释放操作,减少了内存管理的开销,提高了系统的性能。

3. 数据包处理库:DPDK提供了一套高性能的数据包处理库,包括数据包分类、数据包解析、数据包转发等功能。

这些库经过了优化,可以在多核处理器上实现并行处理,提高了数据包处理的效率。

4. 调度器:DPDK提供了多种调度算法,用于在多核处理器上实现任务的负载均衡。

调度器可以根据任务的特点和系统负载情况,动态地将任务分配给不同的处理核心,充分利用系统资源,提高系统的整体性能。

DPDK的应用场景非常广泛,特别适用于网络功能虚拟化(NFV)和软件定义网络(SDN)等领域。

通过利用DPDK的高性能数据包处理能力,可以实现虚拟网络功能的快速部署和灵活扩展。

此外,DPDK 还可以用于构建高性能的网络流量分析系统、网络安全系统等。

尽管DPDK提供了一系列的优化工具和库,但是使用DPDK开发高性能应用程序并不是一件简单的任务。

开发人员需要具备一定的网络和系统知识,并且熟悉DPDK的使用方法和原理。

此外,由于DPDK 是一个底层的开发工具包,对开发人员的编程能力也有一定的要求。

dpdk 绑核原理

dpdk 绑核原理DPDK(Data Plane Development Kit)是一个用于构建高性能数据平面应用程序的开源工具集。

它提供了一组库和驱动程序,用于加速数据包处理和网络功能虚拟化(NFV)应用的开发。

在实际应用中,DPDK的性能优势主要来自于其绑核原理。

绑核是指将CPU核心与特定的进程或线程绑定在一起。

在多核系统中,通过绑定特定的核心来执行特定的任务,可以有效地利用系统资源,提高系统的性能。

DPDK利用了这一原理,将网络应用的数据平面与CPU核心绑定在一起,从而实现高性能的数据包处理。

DPDK的绑核原理可以分为两个层次:物理层次和逻辑层次。

在物理层次上,DPDK通过将网络接口与特定的CPU核心绑定在一起,实现了数据包的直接收发。

DPDK提供了一组API,允许应用程序将网络接口绑定到特定的核心上。

这样,在数据包到达时,DPDK可以直接将数据包送到绑定的核心上进行处理,而无需经过操作系统的网络协议栈。

这种绑定的方式可以大大减少数据包处理的延迟,提高系统的吞吐量。

在逻辑层次上,DPDK通过将应用程序的线程与特定的CPU核心绑定在一起,实现了并发处理。

DPDK允许应用程序创建多个线程,每个线程都可以绑定到一个特定的核心上。

这样,在多核系统中,每个核心都可以并行处理数据包,从而提高系统的并发性能。

同时,DPDK还提供了一些同步机制,用于线程之间的通信和协调,以确保数据的一致性和正确性。

绑核原理的核心思想是将数据平面与CPU核心直接绑定在一起,避免了数据包处理的不必要开销,提高了系统的性能。

通过合理地选择绑定的核心和线程数目,可以充分发挥系统的潜力,提供更高的吞吐量和更低的延迟。

然而,绑核原理也存在一些限制和挑战。

首先,绑定核心和线程的选择需要根据具体的应用场景和硬件配置进行调整,否则可能无法充分发挥系统的性能。

其次,由于绑定核心和线程会独占系统资源,因此需要注意资源的合理分配,避免影响其他应用程序的运行。

dpdk例子 -回复

dpdk例子-回复什么是DPDK?Data Plane Development Kit(DPDK)是一种开源软件工具集,旨在加速数据包处理速度,提高网络功能的性能和效率。

它由英特尔公司开发,并在全球范围内得到广泛使用和支持。

DPDK提供了一种快速、可扩展的技术解决方案,适用于各种网络应用,包括虚拟化、软件定义网络(SDN)、网络功能虚拟化(NFV)和云计算。

为什么要使用DPDK?传统的数据包处理方法往往受到操作系统的限制,这导致了网络性能的瓶颈。

DPDK通过绕过操作系统内核,直接访问网络接口卡,从而大大提高了数据包处理能力。

它利用现代多核处理器的优势,以及高速缓存和硬件加速器的功能,通过异步处理和并行处理技术,实现更高的吞吐量和更低的延迟。

DPDK的架构和功能DPDK的架构主要由驱动程序、运行时环境(EAL)、内存管理库和各种库组件组成。

1. 驱动程序:DPDK为各种网络接口卡提供了硬件加速驱动程序,这些驱动程序可以直接访问网络接口卡的硬件资源,从而实现高性能的数据包处理。

2. 运行时环境(EAL):EAL是DPDK的核心组件之一,它提供了与操作系统和硬件交互的接口。

EAL负责CPU亲和性、内存映射、锁和同步原语等任务,以确保DPDK能够高效地利用系统资源。

3. 内存管理库:DPDK使用自己的内存管理库,以消除操作系统的内存管理开销。

这个库提供了一种高效的内存分配和回收机制,可以显著提高数据包处理的性能。

4. 库组件:DPDK还提供了一系列的库组件,用于实现各种网络功能,包括数据包收发、协议栈处理、流量控制、数据包过滤、数据包转发和组播支持等。

这些组件可以根据不同的应用需求进行选择和配置,以实现定制化的网络功能。

如何使用DPDK?使用DPDK需要进行以下几个步骤:1. 安装DPDK:要使用DPDK,首先需要下载和安装DPDK软件包。

DPDK的官方网站提供了详细的安装说明和相关资源,可以根据具体的操作系统和硬件平台选择合适的版本。

网络协议栈解析与实现

网络协议栈解析与实现网络协议栈是计算机网络中的一个重要概念,它是指一系列网络协议的集合,用于实现网络通信。

网络协议栈的设计和实现对于网络的性能和稳定性有着重要的影响。

本文将对网络协议栈的概念、结构以及实现原理进行详细的解析和讨论。

一、网络协议栈的概述网络协议栈是计算机网络通信的基础,它由多个协议层次组成,每个层次负责特定的功能和任务。

常用的网络协议栈模型包括OSI七层模型和TCP/IP四层模型。

其中,OSI七层模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层;而TCP/IP四层模型包括网络接口层、网络层、传输层和应用层。

不同的协议层次之间通过接口和协议进行通信和交互,完成数据传输和通信任务。

二、网络协议栈的结构网络协议栈的结构分为底层和应用层两部分。

底层包括物理层、数据链路层和网络层,负责实现数据传输和路由选择等功能。

应用层包括传输层和应用层,负责实现数据分段和最终的应用数据传输。

底层和应用层之间通过接口和协议进行通信和交互。

在底层中,物理层负责将信息从比特流转化为物理信号,并通过物理介质进行传输。

数据链路层负责通过帧封装和解封装将原始数据分割成小的数据块,并添加控制信息,保证数据的可靠性和完整性。

网络层负责实现数据包的传输和路由选择,将数据包从源地址传输到目的地址。

在应用层中,传输层负责数据的分段和重组,保证数据的可靠传输。

应用层负责将数据传输到最终的应用程序中,并处理相应的业务逻辑。

三、网络协议栈的实现原理网络协议栈的实现借助于操作系统中的网络协议栈软件模块。

常见的网络协议栈实现包括传统的套接字接口实现和现代的DPDK(Data Plane Development Kit)实现。

传统的套接字接口实现是基于操作系统内核的网络协议栈,通过套接字API提供网络通信功能。

套接字接口实现相对简单,但性能较低,无法满足高性能网络通信的需求。

而DPDK是一种用户态网络协议栈实现,它将网络协议栈移植到用户态,利用硬件加速技术提高网络通信的性能和吞吐量。

传统协议栈和DPDK

传统协议栈和DPDK一、传统协议栈:传统的协议栈是指在网络通信中,常用的采用操作系统的网络协议栈来实现的通信技术。

它一般由操作系统内核中的网络协议进行处理,包括网络层、传输层、应用层等不同的协议。

传统协议栈的工作方式是通过系统调用和中断机制来实现网络数据包的收发和处理。

1.稳定可靠:传统协议栈已经经过多年的发展和测试,在实际应用中具有较高的稳定性和可靠性。

2.简单易用:传统协议栈的接口和功能相对简单,易于理解和使用。

3.统一标准:传统协议栈基于标准的网络协议制定和实现,遵循统一的通信标准。

4.通用性强:传统协议栈适用于各种网络通信场景,可以满足不同的应用需求。

但传统协议栈也存在一些不足之处:1.性能瓶颈:传统协议栈由操作系统内核负责处理网络数据包,而操作系统内核本身存在着较高的开销和性能瓶颈,如内核态和用户态之间的频繁切换、锁竞争等问题,导致性能相对较低。

2.不可定制化:传统协议栈的功能和接口相对固定,无法根据具体应用的需求进行定制和优化。

3.高延迟:传统协议栈由于中断和系统调用的机制,导致数据包在处理过程中存在较高的延迟。

二、DPDK(Data Plane Development Kit):DPDK是一个开源的数据平面开发工具包,旨在提供高性能的数据平面处理能力。

DPDK通过绕过操作系统内核,直接操作硬件设备,从而实现更高的性能和更低的延迟。

DPDK主要用于网络功能虚拟化(NFV)、网络包处理和数据中心等领域。

DPDK的特点:1.高性能:DPDK采用用户态驱动程序的方式,绕过操作系统内核,和硬件设备直接通信,能够实现更高的性能和更低的延迟。

DPDK的数据包处理能力可以达到百万级别。

2.可定制化:DPDK提供了丰富的工具和接口,可以根据具体需求进行定制和优化,使得用户可以灵活地配置和调整数据平面的处理逻辑。

3.开放源码:DPDK是一个开源项目,拥有活跃的社区支持和更新,用户可以免费获取和使用DPDK,并参与到DPDK的开发和改进中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、传统协议栈之数据包从NIC到内核1、从NIC到内存概括地说,网络数据包进入内存(接收数据包)的流程为:网线--> Rj45网口--> MDI 差分线--> bcm5461(PHY芯片进行数模转换) --> MII总线--> TSEC的DMA Engine 会自动检查下一个可用的Rx bd--> 把网络数据包DMA 到Rx bd 所指向的内存,即skb->data1、首先,内核在主内存中为收发数据建立一个环形的缓冲队列(通常叫DMA环形缓冲区)。

2、内核将这个缓冲区通过DMA映射,把这个队列交给网卡;3、网卡收到数据,就直接放进这个环形缓冲区了——也就是直接放进主内存了;然后,向系统产生一个中断;4、内核收到这个中断,就取消DMA映射,这样,内核就直接从主内存中读取数据;对应以上4步,来看它的具体实现:1、分配环形DMA缓冲区Linux内核中,用skb来描述一个缓存,所谓分配,就是建立一定数量的skb,然后把它们组织成一个双向链表2、建立DMA映射内核通过调用dma_map_single(struct device *dev,void *buffer,size_t size,enum dma_data_direction direction) 建立映射关系。

struct device *dev,描述一个设备;buffer:把哪个地址映射给设备;也就是某一个skb——要映射全部,当然是做一个双向链表的循环即可;size:缓存大小;direction:映射方向——谁传给谁:一般来说,是“双向”映射,数据在设备和内存之间双向流动;对于PCI设备而言(网卡一般是PCI的),通过另一个包裹函数pci_map_single,这样,就把buffer交给设备了!设备可以直接从里边读/取数据。

3、这一步由硬件完成;4、取消映射ma_unmap_single,对PCI而言,大多调用它的包裹函数pci_unmap_single,不取消的话,缓存控制权还在设备手里,要调用它,把主动权掌握在CPU手里——因为我们已经接收到数据了,应该由CPU把数据交给上层网络栈;当然,不取消之前,通常要读一些状态位信息,诸如此类,一般是调用dma_sync_single_for_cpu() 让CPU在取消映射前,就可以访问DMA缓冲区中的内容。

2、从驱动到网络协议栈网络驱动收包大致有3种情况:no NAPI:mac每收到一个以太网包,都会产生一个接收中断给cpu,即完全靠中断方式来收包缺点是当网络流量很大时,cpu大部分时间都耗在了处理mac的中断。

netpoll:在网络和I/O子系统尚不能完整可用时,模拟了来自指定设备的中断,即轮询收包。

缺点是实时性差NAPI:采用中断+ 轮询的方式:mac收到一个包来后会产生接收中断,但是马上关闭。

直到收够了netdev_max_backlog个包(默认300),或者收完mac上所有包后,才再打开接收中断通过sysctl来修改dev_max_backlog或者通过proc修改/proc/sys/net/core/netdev_max_backlog以NAPI为例,NAPI 相关数据结构每个网络设备(MAC层)都有自己的net_device数据结构,这个结构上有napi_struct。

每当收到数据包时,网络设备驱动会把自己的napi_struct挂到CPU私有变量上。

这样在软中断时,net_rx_action会遍历cpu私有变量的poll_list,执行上面所挂的napi_struct结构的poll钩子函数,将数据包从驱动传到网络协议栈。

接收到一个完整的以太网数据包后,TSEC会根据event mask触发一个Rx 外部中断。

cpu保存现场,根据中断向量,开始执行外部中断处理函数do_IRQ()do_IRQ 伪代码{上半部处理硬中断查看中断源寄存器,得知是网络外设产生了外部中断执行网络设备的rx中断handler(设备不同,函数不同,但流程类似,TSEC是gfar_receive)1. mask 掉rx event,再来数据包就不会产生rx中断2. 给napi_struct.state加上NAPI_STATE_SCHED 状态3. 挂网络设备自己的napi_struct结构到cpu私有变量_get_cpu_var(softnet_data).poll_list4. 触发网络接收软中断下半部处理软中断依次执行所有软中断handler,包括timer,tasklet等等执行网络接收的软中断handler net_rx_action1. 遍历cpu私有变量_get_cpu_var(softnet_data).poll_list2. 取出poll_list上面挂的napi_struct 结构,执行钩子函数napi_struct.poll()(设备不同,钩子函数不同,流程类似,TSEC是gfar_poll)3. 若poll钩子函数处理完所有包,则打开rx event mask,再来数据包的话会产生rx中断4. 调用napi_complete(napi_struct *n)把napi_struct 结构从_get_cpu_var(softnet_data).poll_list 上移走同时去掉napi_struct.state 的NAPI_STATE_SCHED 状态}gfar_process_frame()-->skb->protocol = eth_type_trans(skb, dev); //确定网络层包类型,IP、ARP、VLAN等等-->RECEIVE(skb) //调用netif_receive_skb(skb)进入协议栈进入函数netif_receive_skb()后,skb正式开始协议栈之旅。

二、DPDK之数据包从NIC到应用程序DPDK是一套数据收发库。

当一个数据包进入网卡产生中断后,响应这个中断的驱动是DPDK 安装的驱动。

这个驱动会通过UIO机制直接让用户态可以直接操作这个数据包。

在用户态用户可以写一个程序通过DPDK提供的API处理这个数据包,比如直接在用户态写一个二层转发实现,或者在用户态直接实现一个vRouter等。

1、网卡初始化网卡驱动模型一般包含三层,即,PCI总线设备、网卡设备以及网卡设备的私有数据结构,即将设备的共性一层层的抽象,PCI总线设备包含网卡设备,网卡设备又包含其私有数据结构。

在DPDK中,首先会注册设备驱动,然后查找当前系统有哪些PCI设备,并通过PCI_ID 为PCI设备找到对应的驱动,最后调用驱动初始化设备。

一、网卡驱动注册使用attribute的constructor属性,在MAIN函数执行前,就执行rte_eal_driver_register()函数,将pmd_igb_drv驱动挂到全局dev_driver_list链表上。

二、扫描当前系统有哪些PCI设备调用rte_eal_init()--->rte_eal_pci_init()函数,查找当前系统中有哪些网卡,分别是什么类型,并将它们挂到全局链表pci_device_list上。

1、首先初始化全局链表pci_driver_list、pci_device_list。

用于挂载PCI驱动及PCI设备。

2、pci_scan()通过读取/sys/bus/pci/devices/目录下的信息,扫描当前系统的PCI设备,并初始化,并按照PCI地址从大到小的顺序挂在到pci_debice_list上。

三、PCI驱动注册调用rte_eal_init()--->rte_eal_dev_init()函数,遍历dev_driver_list链表,执行网卡驱动对应的init的回调函数,注册PCI驱动。

四、网卡初始化调用rte_eal_init()--->rte_eal_pci_probe()函数,遍历pci_device_list和pci_driver_list链表,根据PCI_ID,将pci_device与pci_driver绑定,并调用pci_driver的init回调函数rte_eth_dev_init(),初始化PCI设备。

2、DPDK组件结构及功能DPDK是INTEL提供的提升数据面报文快速处理速率的应用程序开发包,它主要利用以下几个方面的支持特点来优化报文处理过程,从而加快报文处理速率:1、使用大页缓存支持来提高内存访问效率。

2、利用UIO支持,提供应用空间下驱动程序的支持,也就是说网卡驱动是运行在用户空间的,减下了报文在用户空间和应用空间的多次拷贝。

3、利用LINUX亲和性支持,把控制面线程及各个数据面线程绑定到不同的CPU核,节省了线程在各个CPU核来回调度。

4、提供内存池和无锁环形缓存管理,加快内存访问效率。

整个DPDK系统由许多不同组件组成,各组件为应用程序和其它组件提供调用接口,其结构图如下图所示:环境抽象层:为DPDK其它组件和应用程序提供一个屏蔽具体平台特性的统一接口,EAL 提供的功能主要有:DPDK加载和启动;支持多核或多线程执行类型;CPU核亲和性处理;原子操作和锁操作接口;时钟参考;PCI总线访问接口;跟踪和调试接口;CPU特性采集接口;中断和告警接口等。

2、堆内存管理组件(Malloc lib):堆内存管理组件为应用程序提供从大页内存分配堆内存的接口。

当需要分配大量内存小块时(如用于存储列表中每个表项指针的内存),使用这些接口可以减少TLB缺页。

3、环缓冲区管理组件:环缓冲区管理组件为应用程序和其它组件提供一个无锁的多生产者多消费者FIFO队列API。

4、内存池管理组件:为应用程序和其它组件提供分配内存池的接口,内存池是一个由固定大小的多个内存块组成的内存容器,可用于存储相同对像实体,如报文缓存块等。

内存池由内存池的名称(一个字符串)来唯一标识,它由一个环缓中区和一组核本地缓存队列组成,每个核从自已的缓存队列分配内存块,当本地缓存队列减少到一定程度时,从内存环缓冲区中申请内存块来补充本地队列。

5、网络报文缓存块管理组件:提供应用程序创建和释放用于存储报文信息的缓存块的接口,这些MBUF存储在一内存池中。

提供两种类型的MBUF,一种用于存储一般信息,一种用于存储报文数据。

6、定时器组件:提供一些异步周期执行的接口(也可以只执行一次),可以指定某个函数在规定的时间异步的执行,就像LIBC中的timer定时器,但是这里的定时器需要应用程序在主循环中周期调用rte_timer_manage来使定时器得到执行,使用起来没有那么方便。

定时器组件的时间参考来自EAL层提供的时间接口。

相关文档
最新文档