EAL抽象底层硬件和内存资源,屏蔽底层差异。DPDK应用一开始就需要进行EAL初始化,初始化主要处理CPU、内存、外设(网卡)、线程等资源。
从EAL初始化说起
如图,EAL首先检查当前CPU是否支持运行DPDK。
为什么会需要检查CPU?
EAL为什么检查CPU
这个要从DPDK本身来看,DPDK的最终目的是为了快速转发报文,要做到这个,需要了解CPU的特性。因为,不同的CPU可能会有指令集的差异,只有充分利用它的特有指令集,才能充分利用CPU,最终达到快速转发报文的目的。
所以,DPDK要关注CPU的不同特性,也就是EAL启动时候最先检查CPU。
Dpdk如何处理CPU的异构
为了详细介绍EAL的CPU检测,必须先看一下DPDK是怎么处理不同CPU的。
Dpdk给了一个手段,针对不同的CPU,配置不同的编译选项。
即,在编译的时候,可以通过编译选项,告诉编译器CPU支持哪些特殊(或者专有的)指令集,编译器可以通过配置,针对特定CPU的代码进行代码的编译优化。
然而,一旦编译好,去部署DPDK代码 ,实际的场景中,会有不同的服务器或者CPU芯片,特定的编译配置下所编译出的代码,不同的CPU上可能不能正常运行(因为他们指令集可能不一样),所以DPDK代码会在启动的时候首先调用EAL对CPU做检查。
这就是EAL为什么要调用rte_cpu_is_supported做CPU检测
CPU编译配置
Dpdk编译的可选项可以查看,以dpdk-stable-18.11.2为例,查看如下两个文件
dpdk-stable-18.11.2\mk\ rte.cpuflags.mk
dpdk-stable-18.11.2\mk\toolchain\gcc\ rte.toolchain-compat.mk
芯片支持哪些指令集,可以登陆linux使用下面命令查看
cat /proc/cpuinfo
查看CPU是否支持响应的编译选项
SSE4为例怎么编译
以SSE4(Streaming SIMD Extensions 4)指令集为例,有的cpu是不支持这个指令集的,可以使用
make config T=x86_64-native-linuxapp-gcc
make install T=x86_64-native-linuxapp-gcc
make config T=x86_64-native-linuxapp-gcc EXTRA_CFLAGS="-msse4.2"
make install T=x86_64-native-linuxapp-gcc EXTRA_CFLAGS="-msse4.2"
也可以修改dpdk-stable-18.11.2\mk\ rte.cpuflags.mk,注释掉以下三行。
ifneq ($(filter $(AUTO_CPUFLAGS),__SSE4_2__),)
CPUFLAGS += SSE4_2
endif
EAL执行时候判断
当执行时,dpdk怎么判断
在函数
rte_cpu_is_supported
判断是否支持
rte_cpu_is_supported里首先读取编译配置“RTE_COMPILE_TIME_CPUFLAGS”,这个是在编译配置里面设置这个变量的,可以在dpdk-stable-18.11.2\mk\ rte.cpuflags.mk里面查看。
然后EAL是在rte_cpu_get_flag_enabled里判断CPU是否支持这些FLAG,如果检查到CPU和编译选项不匹配,DPDK的程序就不能正常运行,需要修改编译选项了。
本文暂时没有评论,来添加一个吧(●'◡'●)