1.转发模型:
1.1 运行至完成:run to complate (RTC)
参考笔记:DPDK介绍-CSDN博客
选择哪些核可以被DPDK使用,最后把处理对应收发队列的线程绑定到对应的核上,每个报文的生命周期都只能在其中一个线程中。目前抗D检测设备用的就是着模型。
调用DPDK的的API接口实现网络功能,需要二次开发,会有处理流程上的依赖问题,扩展性较好。
1.2 管道模型:pipeline
参考笔记:DPDK介绍-CSDN博客
pipeline的主要思想是不同的工作交给不同的模块,而每一个模块都是一个处理引擎,每一个处理引擎都只能单独处理特定的事务,每一个处理引擎都有输入和输出,通过这些输入和输出将不同的引擎连接起来,完成复杂的网络功能
利用脚本方式可以快速配置需要的网络单元,迅速构建需要配置的网络单元,迅速构建网络产品所需要的功能,但在多核之间会有缓存一致性的问题,并且扩展不好。
2.大页内存
巨型帧结构.....
struck rte_mempool(内存池) ->struck rte_mbuf->网络数据帧内容
->struck rte_mbuf
->struck rte_mbuf
.....
Mbuf对象:
数据包内存操作对象:Mbuf结构,有限的Mbuf对象存储在内存池中,内存池用环形缓存区来保护空闲对象。当一个网络帧被网卡接收时,dpdk的网卡驱动将其存储在一个高效的环形缓存区中,同时在Mbuf的环形缓存区中创建一个Mbuf的对象
内存池双环形缓存区结构:
当然,两个行为都不涉及向系统申请内存,这些内存已经在内存池被创建好时就申请好了,Mbuf对象被创建后,网卡驱动根据分析出来的帧信息将其初始化,并将其和实际帧对象逻辑相连。对网络的分析处理都集中在Mbuf,仅在必要的时候访问实际网络帧,为增加对Mbuf的访问效率,内存池还拥有内存通道/rank对其辅助方法,内存池还允许用户设置核心缓存区大小来调节环形内存块读写的效率。
Mbuf ------------》Packet :Mbuf对象和实际的packet是逻辑关联
3.内存结构
hugtlb
TLB:translation lookaside buffer 地址转换后援缓冲器,也简称为“快表”
页表一般都很大(默认大小是4kb),并且存放在内存中,所以处理器引入MMU后,读取指令,数据需要访问两次内存:首先通过查询页表得到物理地址,然后访问物理地址读取指令,数据。为了减少因为MMU导致的性能下降,引入TLB,简单的说TLB就是页表的cache,其中存储了当前最可能被访问的页表项,其内容是部分页表项的一个副本。只有在TLB无法完成地址翻译任务时,才会到内存中查询页表,这样就减少了页表查询导致的处理器性能下降。
详细参考:TLB的作用及工作过程 - 知乎
TLB命中:当CPU收到应用程序发来的虚拟地址后,首先到TLB中查找相应的页表数据,如果TLB正好存放着所需要的页表项,则称为TLB命中(TLB hit),如果TLB miss 接下来就必须访问物理内存中 存放的多级页表,同时更新TLB页表。
每个进程都有属于各自的多级页表,而tlb表只有一个,位于cpu的高速缓存中。那cpu怎么知道tlb中存放的是哪个进程对应的虚拟地址转换信息呢?这里会引入一个cr3页表寄存器,存放的是某个进程的一级页表的地址。当cpu对某个进程提供的虚拟地址进行转换时,会将进程的一级页表加载到cr3页表寄存器,tlb中存放这个进程对应的地址转换信息,这样这个进程就与tlb关联起来了