ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:582.64KB ,
资源ID:17247253      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17247253.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DPDK关键技术详解Word文档下载推荐.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DPDK关键技术详解Word文档下载推荐.docx

1、提供应用程序创建和释放用于存储报文信息的缓存块的接口,这些MBUF存储在一内存池中。提供两种类型的MBUF,一种用于存储一般信息,一种用于存储报文数据。6、定时器组件:提供一些异步周期执行的接口(也可以只执行一次),可以指定某个函数在规定的时间异步的执行,就像LIBC中的timer定时器,但是这里的定时器需要应用程序在主循环中周期调用rte_timer_manage来使定时器得到执行,使用起来没有那么方便。定时器组件的时间参考来自EAL层提供的时间接口。除了以上六个核心组件外,DPDK还提供以下功能:1、以太网轮询模式驱动(PMD)架构:把以太网驱动从内核移到应用层,采用同步轮询机制而不是内核

2、态的异步中断机制来提高报文的接收和发送效率。2、报文转发算法支持:Hash 库和LPM库为报文转发算法提供支持。3、网络协议定义和相关宏定义:基于FreeBSD IP协议栈的相关定义如:TCP、UDP、SCTP等协议头定义。4、报文QOS调度库:支持随机早检测、流量整形、严格优先级和加权随机循环优先级调度等相关QOS功能。5、内核网络接口库(KNI):提供一种DPDK应用程序与内核协议栈的通信的方法,类似普通LINUX的TUN/TAP接口,但比TUN/TAP接口效率高。每个物理网口可以虚拟出多个KNI接口。以下分章节对各个组件单元进行详细分析。日志系统篇:1、全局日志变量rte_logsstr

3、uct rte_logs rte_logs = .type = 0, .level = RTE_LOG_DEBUG, .file = NULL,;该变量用于存储日志文件的的FILE指针、日志打印级别、要记录的日志类型。2、日志类型:/* 系统内部日志类型 */#define RTE_LOGTYPE_EAL 0x00000001 /* Log related to eal. */#define RTE_LOGTYPE_MALLOC 0x00000002 /* Log related to malloc. */#define RTE_LOGTYPE_RING 0x00000004 /* Log r

4、elated to ring. */#define RTE_LOGTYPE_MEMPOOL 0x00000008 /* Log related to mempool. */#define RTE_LOGTYPE_TIMER 0x00000010 /* Log related to timers. */#define RTE_LOGTYPE_PMD 0x00000020 /* Log related to poll mode driver. */#define RTE_LOGTYPE_HASH 0x00000040 /* Log related to hash table. */#define

5、RTE_LOGTYPE_LPM 0x00000080 /* Log related to LPM. */#define RTE_LOGTYPE_KNI 0x00000100 /* Log related to KNI. */#define RTE_LOGTYPE_ACL 0x00000200 /* Log related to ACL. */#define RTE_LOGTYPE_POWER 0x00000400 /* Log related to power. */#define RTE_LOGTYPE_METER 0x00000800 /* Log related to QoS meter

6、. */#define RTE_LOGTYPE_SCHED 0x00001000 /* Log related to QoS port scheduler. */* 用户可自定义的日志类型 */#define RTE_LOGTYPE_USER1 0x01000000 /* User-defined log type 1. */#define RTE_LOGTYPE_USER2 0x02000000 /* User-defined log type 2. */#define RTE_LOGTYPE_USER3 0x04000000 /* User-defined log type 3. */#d

7、efine RTE_LOGTYPE_USER4 0x08000000 /* User-defined log type 4. */#define RTE_LOGTYPE_USER5 0x10000000 /* User-defined log type 5. */#define RTE_LOGTYPE_USER6 0x20000000 /* User-defined log type 6. */#define RTE_LOGTYPE_USER7 0x40000000 /* User-defined log type 7. */#define RTE_LOGTYPE_USER8 0x800000

8、00 /* User-defined log type 8. */3、日志级别/*:Cant use 0, as it gives compiler warnings */#define RTE_LOG_EMERG 1U /* System is unusable. */#define RTE_LOG_ALERT 2U /* Action must be taken immediately. */#define RTE_LOG_CRIT 3U /* Critical conditions. */#define RTE_LOG_ERR 4U /* Error conditions. */#def

9、ine RTE_LOG_WARNING 5U /* Warning conditions. */#define RTE_LOG_NOTICE 6U /* Normal but significant condition. */#define RTE_LOG_INFO 7U /* Informational. */#define RTE_LOG_DEBUG 8U /* Debug-level messages. */4、改写系统日志文件/* param f * 文件流指针,可以是NULL,如果是NULL,系统使用默认日志文件流,如串口或syslog.rte_eal_log_init(const

10、char *id, int facility)初始化时,已经把默认日专文件流设置为syslog * return * - 0 on success. * - Negative on error. */int rte_openlog_stream(FILE *f);5、设计日志打印级别void rte_set_log_level(uint32_t level);6、使能某个日志类型,使能之后,可以记录该类型的日志信息。void rte_set_log_type(uint32_t type, int enable); 7、取得当前核中刚刚处理的日志消息类型和级别每个核处理日志消息时,会记录本该消息

11、的类型和级别到一个变量中。int rte_log_cur_msg_loglevel(void);int rte_log_cur_msg_logtype(void);8、使能LOG存储记录void rte_log_set_history(int enable);9、存储或显示历史记录,这个接口,日志是在标准输出中显示的int rte_log_add_in_history(const char *buf, size_t size);void rte_log_dump_history(void);10、打印一条日志,这里会根据类型和级别,判断是否打印,如果打印,则打印到初始化时所设定的文件中。#de

12、fine RTE_LOG(l, t, .) (void)(RTE_LOG_ # l = RTE_LOG_LEVEL) & (RTE_LOG_ # l = rte_logs.level) & (RTE_LOGTYPE_ # t & rte_logs.type) ? rte_log(RTE_LOG_ # l, RTE_LOGTYPE_ # t, # t : _VA_ARGS_) : 0)11、日志打印机制:上面调用先判断类型和级别,看是否需要记录,如果不需要,就什么都不做,如果需要就调用:rte_log(uint32_t level, uint32_t logtype, const char *f

13、ormat, .)- rte_vlog(_attribute_(unused) uint32_t level,_attribute_(unused) uint32_t logtype,const char *format, va_list ap) int ret; FILE *f = rte_logs.file; unsigned lcore_id; /* 记录正在打印的日志的类型和级别 */ lcore_id = rte_lcore_id(); log_cur_msglcore_id.loglevel = level; log_cur_msglcore_id.logtype = logtyp

14、e; ret = vfprintf(f, format, ap);/*把日志输出到初始化时定义的文件流中*/ fflush(f); return ret;初始化时定义的文件流设置如下(发):/* * set the log to default function, called during eal init process, * once memzones are available.intrte_eal_log_init(const char *id, int facility) FILE *log_stream; log_stream = fopencookie(NULL, w+, co

15、nsole_log_func); if (log_stream = NULL) return -1; openlog(id, LOG_NDELAY | LOG_PID, facility);/*这里把默认的LOG文件流定义为fopencookie 所设置的文件流*/ if (rte_eal_common_log_init(log_stream) BUFSIZ) size = BUFSIZ; /* Syslog error levels are from 0 to 7, so subtract 1 to convert */ loglevel = rte_log_cur_msg_loglevel

16、() - 1; memcpy(copybuf, buf, size); copybufsize = 0; /* 最后,还把信息输出到系统日志中 */ syslog(loglevel, %s, copybuf);HUGPAGE的使用:为什么内存要分页?实践过程中,有这样的问题:程序需要使用4G内存空间,而物理内存又小于4G,导致程序不得不降低内存占用。为解决些问题,引入MMU,MMU核心思想是利用虚拟地址代替物理地址,即CPU使用虚拟地址,MMU负责把虚拟地址转成物理地址内存分页是基于MMU的一种内存管理机制,这种机制,从结构上保证了访问内存的高效,使OS能支持非连续内存的分配。为了访问更快,硬

17、件上引入TLB(页表寄存器缓冲),但TLB有限,为了减少MISS,引入大页大页的设置,echo 128 /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepagesmount -t hugetlbfs o pagesize=2M nodev /mnt/hugepages-fs内存初始化:1、映射文件总结DPDK中,有两个核间共享的全局变量,分别是总内存配置信息和页表数组信息,系统中所有核都可以对这两个全局变量进行访问,为了使每个核访问相同变量时的变量地址是一致的,采用映射相同文件的方式来访问相同的变量地址。总内存配置信息映射文件/var/run/

18、.rte_configrte_config.mem_config 指向总内存配置信息,每个核通过映射/var/run/.rte_config文件来使mem_config指向相同的物理内存。用struct rte_mem_config结构来存储总内存配置信息,其主要包括以下信息:内存分段信息:总共可存储256个连续的内存段,保存在struct rte_memseg memsegRTE_MAX_MEMSEG;数组中。这个数组在运行过程中不会变化。空闲内存段信息free_memseg:这个一开始就是内存分段的信息,随着运行过程中内存的使用情况,这个信息会做相应的调整。内存域数组memzone:这个存

19、储了系统中已分配的内存域,内存域从free_memseg中分配得到,并按分配的先后顺序保存在这个数组中,每一个内存域有一个唯一的名字与其对应。总共可存储2560个域。rte_memzone 是DPDK内存管理最终向客户程序提供的基础接口,通过ret_memzone_reverse可以获取基于DPDK HUGEPAGE的属于同一个物理CPU的物理内存连续且虚拟内存也连续的一块地址。rte_ring/rte_malloc/rte_mempool等组件就是依赖于rte_memzone组件实现的。页表数组信息映射文件/var/run/.rte_hugepage_info:DPDK中,使用到的内存所对应

20、的页用一个Struct hugepage表示,系统中会使用很多内存页,把所有内存页的信息放到一个Struct hugepage结构数组进行管理,这里暂时把这个数据叫做页表项数组吧!保存页表项数据的内存也是采用共享内存形式,通过映射文件/var/run/.rte_hugepage_info来保证各核所访问的内存是相同的。页表项信息记录了每一页所对应的物理地址、虚拟地址、该页的大小、该页所属的socket_id、该页所挂载到的文件名称,等等。页表项信息结构如下:struct hugepage void *orig_va; /* virtual addr of first mmap() orig=1

21、时放在这里*/ void *final_va; virtual addr of 2nd mmap() 虚拟开始地址*/ uint64_t physaddr; physical addr 物理开始地址*/ size_t size; the page size 该页的大小*/ int socket_id; NUMA socket ID */ int file_id; the %d in HUGEFILE_FMT 在map_all_hugepages时的顺序*/ /*该页所属的内存段,一个内存段包含的页是相连续的*/ int memseg_id; the memory segment to whic

22、h page belongs */ /*该大页缓存所挂载到的目录下的文件*/ char filepathMAX_HUGEPAGE_PATH; /*rtemap%s* path to backing file on filesystem */其中orig_va在初始化完内存之后全为NULL,不再使用。页挂载路径/mn/huge/rtesmp_%fileid由上述页表项信息结构知道,每一个页都挂载到hugepage文件系统中的一个文件中上,文件路径名格式是:/mn/huge/rtesmp_%fileid各结构关系图2、共享内存子系统的初始化DPDK的共享内存是使用系统中的大页内存来实现的,对共享内

23、存的管理,其实就是管理这些大页内存,所谓共享内存初始化的主要工作,就是把系统中的大页内存的信息(如内存大小,相应的物理地址等)采集并存储在DPDK自已所设计的一系例结构体变量上,通过这些结构体变量,DPDK可以按照自已的方式来管理系统中的内存分配和申请。DPDK通过以下结构来管理共享内存:系统大页文件系统信息结构:用于存储采集到的系统中的各种大页文件系统的页面大小和页面数。系统中可能有不同页面大小的大页文件系统,如页面大小为2M(32位机)或1G(64位机),路径/sys/kernel/mm/hugepages/保存了系统中所有大页面文件系统的信息。DPDK用数组internal_config

24、.hugepage_infoMAX_HUGEPAGE_SIZES来保存所有不同页面大小的HUGETLBFS。struct hugepage_info size_t hugepage_sz; 页面大小 */ const char *hugedir; 目录/MNT/HUGE /dir where hugetlbfs is mounted */ /一个NUMA NODE包含多个socket,一个socket包含多个核,可以把一个socket看成/是一个物理CPU,同一个socket中的内存是共享的,/这里表示不同物理CPU上的页数 uint32_t num_pagesRTE_MAX_NUMA_NOD

25、ES; /* number of hugepages of that size on each socket */ int lock_descriptor; file descriptor for hugepage dir 大页目录的文件锁*/页信息结构:用于保存页面的物理地址、映射到进程中的虚拟地址、页面大小、页面所属物理CPU、页面对应的MMAP文件等信息。DPDK用这个结构体数组来保存DPDK使用到的所有页面的信息。我们在这里把这个结构体数组称为页表,每一个表项表示一个页。DPDK把页表保存到了共享内存映射文件/var/run/.rte_hugepage_info,不同的进程通过访问这个文件,都可以得到这个全局的页表。 virtual addr of first mmap() 只在页面信息建立过程中使用,*/ void *f

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1