dpdk源码分析
文章平均质量分 84
ApeLife
这个作者很懒,什么都没留下…
展开
-
dpdk之kni实现
一、为什么要用kni 通常情况下dpdk用于二三层报文转发,接收到来自网卡的报文后,如果是二层报文则查找fdb表; 如果是三层报文,则进行dnat, snat处理后,查找路由表, 将报文转发给下一跳路由。这些二三层转发操作都是直接转发到另一台设备上,不需要经过内核,无需内核协议栈的参与。 然而有些场景下报文是直接发给运行dpdk程序的这台设备本身的。例如ping...原创 2019-10-24 13:24:26 · 7844 阅读 · 10 评论 -
dpdk报文收发流程
本篇文章来分析下dpdk是如何接收报文以及发送报文的。一、报文的接收流程 传统方式接收报文时,当网卡接收到报文后会产生硬件中断,进而报文会通过协议栈,最后到达应用层,这个过程需要内核协议栈的处理。 和传统报文接收不同,当应用层想要接收来自网卡的报文时, 应用层通过while死循环的方式,调用rte_eth_rx_burst接口轮询接收来自网卡的报文,相当于绕...原创 2019-10-09 22:18:09 · 6237 阅读 · 7 评论 -
dpdk应用层对网卡进行配置
dpdk用户态驱动初始化完成后,应用层就可以来对网卡进行设置操作。对于每一个网卡,应用层都需要调用相应接口进行配置。可以对网卡进行哪些设置操作呢? 例如应用层将对网卡进行配置下发,将配置信息下发给网卡;应用层对网卡接收队列进行设置;应用层对网卡发送队列进行设置;应用层启动网卡等操作。以l2fwd为例, 应用层调用rte_eth_dev_configure进行配置下发; 调用rte...原创 2019-10-08 23:13:18 · 2799 阅读 · 1 评论 -
dpdk pmd驱动初始化
在没有引入pmd用户态网卡驱动之前, 网卡在收到报文后,网卡驱动会将报文从网卡缓冲区拷贝到内核, 接着内核在把报文拷贝到应用层,整个过程需要2次的拷贝以及系统调用。当应用层需要发送数据时,应用层将报文拷贝到内核,接着内核拷贝到网卡缓冲区,由网卡负责发送,整个过程也需要2次的拷贝以及系统调用。 不管接收还是发送报文,系统调用以及内存拷贝都是需要消耗性能的。在引入了pmd用户态驱动后...原创 2019-10-01 23:29:52 · 2105 阅读 · 0 评论 -
dpdk uio驱动实现
一、dpdk uio驱动框架 在系统加载igb_uio驱动后,每当有网卡和igb_uio驱动进行绑定时, 就会在/dev目录下创建一个uio设备,例如/dev/uio1。uio设备是一个接口层,用于将pci网卡的内存空间以及网卡的io空间暴露给应用层。通过这种方式,应用层访问uio设备就相当于访问网卡。具体来说,当有网卡和uio驱动绑定时...原创 2019-09-12 13:03:24 · 2986 阅读 · 1 评论 -
dpdk多线程模型
dpdk支持多线程的运行方式, 也支持多进程的运行方式。本篇文章来分析下dpdk的多线程, 多进程模型。一、多线程模型 一个cpu上可以运行多个线程, 由linux内核来调度各个线程的执行。内核在调度线程时,会进行上下文切换,保存线程的堆栈等信息, 以便这个线程下次再被调度执行时,继续从指定的位置开始执行。然而上下文切换是需要耗费cpu资源的的,多核体系的CP...原创 2019-09-07 18:08:48 · 3085 阅读 · 4 评论 -
dpdk pci驱动探测
上一篇文章已经介绍了pci设备的背景知识, 现在我们来分析下pci设备是如何探测到支持的驱动,进而与驱动进行关联;pci与驱动的解除绑定;pci设备与uio设备的关联。一、pci驱动注册 网卡驱动的注册使用了一种奇技淫巧的方法,使用GCC attribute扩展属性的constructor属性,使得网卡驱动的注册在程序main函数之前就执行了。此时在main函...原创 2019-09-04 21:17:40 · 1639 阅读 · 0 评论 -
dpdk pci设备初始化
一、pci设备背景知识 传统的sata,是一种半双工设备, 同一时间只能有一个方向在传输数据,传输速率就比较慢了。pci设备是一种全双工设备, 同一时间可以发送数据到其他pci设备,也可以接收来自其他pci设备的数据。1、pci总线 在系统加载的时候,会将所有的pci设备给挂载到pci总线上,并在/sys/bus/pci/devices目录下创建所有的p...原创 2019-09-02 22:41:29 · 2120 阅读 · 0 评论 -
dpdk中断机制
dpdk自己实现了一个中断机制,例如定时器中断,uio中断。这个中断是应用层中断, 而不是像linux内核实现的硬件中断; 且dpdk实现的中断机制属于控制中断,用来实现一些控制操作,例如uio中断用来设置一些网卡的状态之类。网卡收发包过程,还是使用轮询的方式从网卡接收报文。一、中断事件管理 dpdk实现了uio, 定时器alarm, vfio三种中断,且用链表来...原创 2019-08-28 23:42:35 · 2720 阅读 · 1 评论 -
dpdk大页内存原理
在分析dpdk大页内存的源码之前,有必要对linux内存管理的原理以及大页内存的原理有个了解,缺少这些底层基础知识,分析dpdk大页内存的源码将举步维艰。这篇文章详细介绍下linux内存管理以及大页内存的方方面面,为分析dpdk大页内存源码扫除障碍。一、linux内存管理原理1、mmu内存管理的引入 在没有引入mmu内存管理单元时,对于32位操作系统,每个...原创 2019-08-16 23:56:26 · 5335 阅读 · 2 评论 -
dpdk内存池rte_mempool实现
dpdk可以通过两种方式来管理内存, 一种是调用rte_malloc, 在大页内存上申请空间; 另一种是使用内存池,也是通过在大页内存上申请空间方式。 两种有什么区别呢?虽然两者最终都是在大页内存上获取空间,但内存池这种方式直接在大页内存上获取,绕开了rte_malloc调用。rte_malloc一般用于申请小的内存空间。通常在需要非常大的缓冲区时,在大页内存上一次性申请一个大的缓...原创 2019-08-23 07:44:42 · 8662 阅读 · 0 评论 -
dpdk大页内存实现
上一篇文件介绍了linux内存管理以及大页内存的原理,有了原理的支撑,接下里分析dpdk大页内存源码就轻松了,才不会云里雾里不知道在说啥。所谓的dpdk大页内存的实现,说白了就是dpdk自己实现了一套大页内存的使用库,这个和libhugetlbfs.so是类似的,就是自己实现了大页内存的申请,释放操作, 替代了传统的malloc, free系统调用。先从整体上看下dpdk大页内存有...原创 2019-08-18 17:32:55 · 6998 阅读 · 2 评论 -
dpdk日志系统
本篇文章从四个方面对dpdk日志系统进行剖析,分别是: 1、dpdk日志框架 2、内存池未初始化时的日志系统 3、内存池已完成初始化的日志系统 4、日志系统的使用 下面分别对这四个方面进行分析:一、dpdk日志框架 在分析dpdk源码时,难免存在有疑惑的地方,这个...原创 2019-07-17 00:08:57 · 1906 阅读 · 0 评论 -
dpdk pdump抓包环境搭建
intel的e1000网卡被uio驱动接管后, 在linux下通过ifconfig是看不到网卡信息的,也就无法使用tcpdump来抓包。 dpdk在16.7版本引入了pdump抓包工具,可以使用这个工具来抓包,抓到的包可以在windows下通过wireshark来分析。pdump抓包工具需要依赖libpcap和libpcap-dev两个库。 下面来看下如何安装pdump工具。一...原创 2019-06-30 18:35:33 · 6874 阅读 · 0 评论 -
dpdk l3fwd报错问题处理
vmware虚拟机中运行dpdk l3fwd三层转发例子,会出现EAL: Error - exiting with code: 1 Cause: Cannot configure device: err=-22, port=0错误。这是因为intel的e1000网卡只支持单队列。也就是每个e1000网卡只支持一个队列, 然而在l3fwd例子中,每个网卡需要多个队列才能运行起来。如果...原创 2019-06-29 23:33:03 · 3242 阅读 · 0 评论 -
虚拟机dpdk环境搭建
一、准备环境 磨刀不误砍柴工,要想更好的进行dpdk源码分析,需要搭建一套dpdk环境,观察数据包的转发流程。由于个人电脑条件有限,只能在vmware虚拟机环境下搭建dpdk环境。dpdk源码分析系列的所有文章都是基于这套环境来分析。1、vmware虚拟机上安装ubuntun系统, ubuntu版本为12.04; linux内核版本为3.13.0-32-generic。我的...原创 2019-06-16 16:10:18 · 5978 阅读 · 8 评论