作者:张华 ?发表于:2016-04-22
版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
( http://blog.csdn.net/quqi99 )
组成模块
- rte_timer,包装提供内核的Time-Stamp Couter(TSC)时间服务。让异步运行函数成为可能
- rte_malloc, 从memzones中分配大页,相较于4K heap pages。页表项更少,TLB命中率更高。
- rte_ring, 固定大小的环形缓存区。lockless multi-producer, multi-consumer, bulk/burst-enqueue/dequeue的FIFO队列管理API. 当中per-lcore变量通过Thread Local Storage(TLS)提供per-thread local storage.
- rte_mempool, 分区pool,pool使用name标记并使用ring分配objects.
- rte_mbuf, 用于提供对mbuf(ctrlmbuf + pktmbuf)的管理。mbuf存储在mempool中
- rte_eal + libc, EAL(Environment Abstration Layer)提供对上述的接口。隐藏App和Lib之间的环境细节。如:Alarm操作、中断处理、CPU特性识别(rte_cpu_get_feature)、Trace和Debug功能、PCI总线訪问、原子锁操作、内存分配、Core亲和性、多进程&多线程、librte_hash(包转发算法), librte_lpm (Longest Prefix Match,包转发算法),librte_net)。EAL通过/sys向用户空间呈现PCI信息(/sys/bug/pci)与address space,EAL用igb_uio模块用户空间提供/dev/uidX设备文件,应用就能够使用mmap /dev/uidX到PCI address space。
用户空间採用了pthread库。DPDK包含1G和10G的PMDs(Poll Mode Drivers), 及没有异步和中断信息机制的virtio控制器。
初始化
内存管理
一个连续的内存块通过rte_memseg来描写叙述,再通过memzone的概念来聚集(可使用rte_eal_get_configuration()来訪问)。使用aligh參数来对齐数据(2的指数倍但不大于64 bytes)。memzone能够保留2MB或1G的大页。
CONFIG_RTE_MALLOC_DEBUG參数能够帮助调试缓存区溢出错误。
librte_malloc用于分配随意大小的内存,在NUMA中,是分配该core所在的NUMA socket还是其他socket上的内存由參数显然决定。常见两个数据结构:
- malloc_heap, 管理per-socket上的free内存(每一个NUMA node上有一个heap结构), numa_socket, mz_count, lock, free_head.
- malloc_elem, memzone中各种管理对象的通用头部描写叙述,heap, prev, next_free, state, padding, size.
KNI接口
DPDK提供了两种方法与linux kernel协议栈交互: TAP和KNI。KNI(Intel DPDK Kernel NIC Interface)同意用户应用訪问Linux控制平面。能够让TUN/TAP设备省去系统调用和数据拷贝(copy_to_user()/copy_from_user())的时间。也能够同意应用使用kernel tcp/ip栈及使用标准的的管理工具如ethtool, ifconfig,tcpdump等(/dev/kni)。參考
[1] http://www.cnblogs.com/chanwai1219/p/3680239.html
[3] Intel? Data Plane Development Kit (Intel? DPDK)