DPDK: 編譯及“Hello World”

1. 環境準備

配置環境如下:

VMware 12.5.9。

Ubuntu 18.04,64位 (32位系統類似,根據實際情況調整相關編譯參數),虛擬3 個網卡,2*2核cpu,2G內存。

DPDK 19.11.1(LTS),這裏可以下載到你比較中意的其他版本http://static.dpdk.org/rel/

GCC 7.5。

 

2. 修改網卡型號

在VMware虛擬環境跑DPDK需要將虛擬網卡修改爲DPDK支持的型號,19.11支持的網卡及其驅動如下,具體請參考官網 doc.dpdk.org/guides-19.11/nics/overview.html

Feature a f p a c k e t a r k a t l a n t i c a v f a v f . . . . . v e c a v p a x g b e b n x 2 x b n x 2 x v f b n x t b o n d i n g c x g b e c x g b e v f d p a a d p a a 2 e 1 0 0 0 e n a e n e t c e n i c f a i l s a f e f m 1 0 k f m 1 0 k v f i 4 0 e i 4 0 e . . . . v e c i 4 0 e v f i 4 0 e v f . . v e c i f c v f i g b i g b v f i x g b e i x g b e . . . v e c i x g b e v f i x g b e v f . v e c k n i l i q u i d i o m l x 4 m l x 5 m v n e t a m v p p 2 n e t v s c n f p n f p v f n u l l o c t e o n t x p c a p q e d e q e d e v f r i n g s f c _ e f x s o f t n i c s z e d a t a 2 t a p t h u n d e r x v d e v _ n e t v s c v h o s t v i r t i o v i r t i o . . v e c v m x n e t 3
Speed capabilities   Y Y Y Y   Y P P Y   Y Y P P P P       P P Y Y       P   Y Y       Y P Y Y Y P Y Y   Y   Y Y   Y   P P Y     P P P
Link status     Y Y Y Y Y Y Y Y   Y Y Y Y Y   Y Y Y Y Y Y Y Y Y   Y Y Y Y Y Y   Y Y Y Y Y Y Y Y   Y   Y Y   Y   Y Y Y   Y Y Y Y
Link status event     Y         Y Y Y         Y Y     Y Y Y Y Y Y       Y   Y Y       Y Y Y       Y Y             Y     Y Y     Y Y Y
Removal event                                                                       Y Y                                          
Queue status event                                                                                                             Y      
Rx interrupt       Y Y         Y           Y     Y Y Y Y Y Y Y Y   Y Y Y Y Y Y     Y Y       Y Y                   Y       Y Y  
Lock-free Tx queue                                                                                       Y                            
Fast mbuf free                                                                                                 Y                  
Free Tx mbuf on demand                               Y                                               Y                             Y      
Queue start/stop   Y Y Y Y         Y   Y Y   Y   Y   Y Y Y Y Y Y Y Y       Y Y         Y Y     Y Y Y   P         Y   Y   Y     Y Y Y
Runtime Rx queue setup                                       Y     Y                                                   Y                  
Runtime Tx queue setup                                       Y     Y                                                   Y                  
MTU update     Y Y Y         Y   Y Y Y Y Y Y   Y Y               Y   Y Y Y Y   Y Y Y Y Y Y Y Y       Y Y   Y     Y Y     Y   Y
Jumbo frame   Y Y Y Y Y Y     Y   Y Y Y Y Y Y   Y Y Y Y Y Y Y Y   Y   Y Y Y Y   Y Y Y Y Y   Y Y   Y Y Y Y   Y       Y         Y
Scattered Rx   Y   Y Y Y           Y Y Y   Y Y   Y   Y Y Y Y Y Y   Y Y Y Y Y Y   Y Y Y     Y           Y Y   Y   Y   Y     Y    
LRO                   Y                                       Y Y Y Y                         Y Y                     Y
TSO       Y Y         Y   Y Y       Y   Y   Y Y Y Y Y Y   Y Y Y Y Y Y     Y Y       Y Y       Y Y   Y                 Y
Promiscuous mode     Y Y Y Y Y Y Y Y   Y Y Y Y Y     Y Y Y   Y Y Y Y   Y Y Y Y       Y Y Y Y Y Y Y Y   Y   Y Y   Y   Y Y Y     Y Y Y
Allmulticast mode     Y Y Y   Y     Y   Y Y Y Y Y     Y Y Y   Y Y Y Y   Y Y Y Y Y Y   Y Y Y   Y Y           Y Y   Y   Y Y Y     Y Y Y
Unicast MAC filter     Y Y Y Y   Y Y Y       Y Y Y     Y Y Y   Y Y Y Y   Y Y Y Y Y Y     Y Y Y Y         P   Y Y         Y       Y Y Y
Multicast MAC filter       Y Y     Y Y Y                   Y Y   Y Y Y Y                   Y Y   Y             Y Y   Y     Y       Y Y  
RSS hash     Y Y Y   Y     Y   Y Y Y Y   Y   Y   Y Y Y Y Y Y   Y   Y Y Y Y   Y Y Y   Y   Y Y       Y Y   Y       Y         Y
RSS key update     Y Y Y         Y   Y         Y   Y   Y Y Y Y Y Y   Y   Y Y Y Y   Y   Y       Y Y       Y Y   Y       Y          
RSS reta update     Y Y Y         Y             Y   Y   Y Y Y Y Y Y   Y   Y Y Y Y   Y   Y       Y Y       Y Y   Y       Y          
Inner RSS                                     Y                                   Y                                          
VMDq                   Y                     Y   Y Y       Y   Y Y                                                      
SR-IOV                 Y Y             Y   Y       Y Y       Y   Y Y         Y Y                   Y   Y       Y          
DCB                                             Y Y       Y   Y Y                                                      
VLAN filter     Y Y Y         Y         Y Y       Y Y   Y Y Y Y   Y Y Y Y Y Y   Y Y Y   Y             Y Y                 Y Y Y
Ethertype filter                   Y                         Y Y       Y   Y Y                                                      
N-tuple filter                   Y                                   Y   Y Y                             Y                        
SYN filter                                                       Y   Y Y                                                      
Tunnel filter                                             Y Y           Y Y                             Y                        
Flexible filter                                                       Y                                                            
Hash filter                                             Y Y Y Y                                                                
Flow director                   Y                 Y       Y Y           Y Y           Y                 Y                        
Flow control     Y             Y   Y   Y Y Y       Y     Y Y       Y   Y Y         Y Y   Y   Y Y       Y Y   Y     Y            
Flow API                   Y   Y             Y Y     Y         Y   Y           Y Y                 Y     Y     Y            
Rate limitation                                                           Y Y                                                      
Traffic mirroring                                             Y Y           Y Y                                                      
Inline crypto                                                           Y Y Y Y                                                  
CRC offload     Y Y Y   Y     Y   Y Y     Y Y   Y   Y Y Y   Y     Y Y Y   Y     Y Y Y Y Y         Y   Y Y           Y          
VLAN offload     Y Y P Y       Y   Y Y   Y Y Y   Y   Y Y Y   Y     Y Y Y   Y     P   Y       Y Y       Y Y   P       P         Y
QinQ offload                               Y             Y   Y     Y Y Y   Y                                                    
L3 checksum offload     Y Y P   Y     Y   Y Y Y Y Y Y   Y   Y Y Y   Y     Y Y Y   Y     Y Y Y Y Y   Y Y       Y Y   Y     Y Y          
L4 checksum offload     Y Y P   Y     Y   Y Y Y Y Y Y   Y   Y Y Y   Y     Y Y Y   Y     Y Y Y Y Y   Y Y       Y Y   Y     Y Y         Y
Timestamp offload                                                                         Y                                          
MACsec offload                                                           Y                                                        
Inner L3 checksum                   Y             Y   Y       Y   Y         Y   Y     Y Y Y                 Y     Y                  
Inner L4 checksum                   Y             Y   Y       Y   Y         Y   Y     Y Y Y                 Y     Y                  
Packet type parsing     Y Y Y         Y   Y Y Y Y     Y Y Y Y Y Y   Y     Y Y Y   Y       Y Y Y Y         Y   Y Y   Y     Y Y         Y
Timesync                   Y                         Y Y       Y   Y Y                                                      
Rx descriptor status     Y Y Y         Y           Y         Y   Y Y Y Y   Y Y Y Y Y Y       Y                       Y                  
Tx descriptor status     Y Y Y         Y           Y         Y   Y Y Y Y   Y Y Y Y Y Y       Y                       Y                  
Basic stats   Y Y Y Y Y Y Y Y Y   Y Y Y Y Y Y   Y Y Y Y Y Y Y Y   Y Y Y Y Y Y   Y Y Y Y Y Y Y Y   Y Y Y Y   Y   Y Y Y   Y Y Y Y
Extended stats     Y         Y Y Y       Y Y   Y       Y Y Y Y Y Y   Y Y Y Y Y Y   Y   Y   Y Y           Y Y   Y   Y       Y Y   Y
Stats per queue   Y Y     Y           Y Y             Y Y Y               Y Y         Y Y     Y Y Y       Y Y       Y   Y     Y Y Y
FW version     Y             Y       Y Y               Y         Y   Y                                     Y                  
EEPROM dump     Y             Y   Y                               Y   Y Y                                                      
Module EEPROM dump                                             Y Y       Y   Y Y                                                      
Registers dump     Y                 Y                               Y Y Y Y Y Y                                       Y          
LED                   Y                                                                                                
Multiprocess aware       Y Y             Y Y           Y   Y Y Y Y Y Y       Y Y Y Y   Y   Y     Y         Y Y Y   Y       Y     Y    
BSD nic_uio       Y Y             Y       Y     Y   Y Y Y Y Y Y   Y Y Y Y Y Y                               Y             Y Y  
Linux UIO   Y Y Y Y Y Y Y Y Y   Y Y     Y Y   Y   Y Y Y Y Y Y   Y Y Y Y Y Y   Y           Y Y       Y Y   Y             Y Y Y
Linux VFIO       Y Y         Y   Y Y   Y Y Y Y Y   Y Y Y Y Y Y   Y Y Y Y Y Y   Y           Y Y   Y   Y Y   Y       Y     Y Y Y
Other kdrv                                                                       Y Y     Y                     Y Y            
ARMv7                                       Y                                       Y         Y             Y   Y   Y Y  
ARMv8     Y             Y       Y Y     Y   Y     Y Y   Y       Y Y Y Y       Y Y Y Y       Y Y Y Y         Y Y Y   Y Y  
Power8                                       Y     Y Y                       Y Y               Y             Y   Y        
x86-32     Y Y Y   Y     Y   Y Y     Y Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y     Y Y     Y         Y Y Y     Y   Y   Y Y Y Y Y
x86-64   Y Y Y Y Y Y Y Y Y   Y Y     Y Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y   Y Y Y     Y Y Y     Y Y Y   Y Y Y Y   Y Y Y Y Y
Usage doc   Y           Y Y     Y Y Y Y     Y Y Y                           Y Y Y Y Y Y Y Y Y   Y Y Y Y     Y Y Y Y Y   Y   Y
Design doc                                                                                                                    
Perf doc                                                                                                                    

 編輯虛擬機配置文件xx.vmx文件,修改網卡的virtualDev值,如e1000則表示虛擬intel千兆以太網卡

ethernet1.virtualDev = "e1000"
ethernet2.virtualDev = "e1000"

另外微軟的hyper-v虛擬化環境也可以跑DPDK,但hyper-v無法虛擬出DPDK支持的網卡。在hyper-v環境跑DPDK需要使用netvsc網卡驅動,nstvsc是DPDK提供的hyper-v專用網卡驅動。網卡與netvsc驅動的綁定不能使用dpdk-devbind.py工具,而是另一個工具driverctl,或者手動綁定也可以,官方的幫助文檔給出了詳細的步驟說明。

 

3. 編譯DPDK源碼

1)首先得安裝依賴

sudo apt  install libnuma-dev

2)設置環境變量

export RTE_SDK=/home/walnut/Project/dpdk-stable-19.11.1

3)配置

make defconfig(使用默認配置,配置文件及編譯輸出 至build目錄)

可以手動指定編譯目標模板和目標目錄,如“make config T=x86_64-native-linux-gcc O=build-x64”,O=build-x64指定編譯輸出目標目錄,不指定O參數則默認輸出至build目錄。

使用make showconfigs可查看支持的目標模板。

4)愉快地編譯吧

make  EXTRA_CFLAGS="-O0 -g"

 

4. 加載內核驅動

modprobe uio
insmod $RTE_SDK/build/kmod/igb_uio.ko

 

5. 綁定網卡驅動

1)首先使用python腳本dpdk-devbind.py查看網卡狀態

./usertools/dpdk-devbind.py --status

可以查看到物理地址,當前驅動等信息,如下所示。

如果被綁定的網卡爲Active狀態,需要先禁用,ifconfig xxxx down,然後再綁定。

Network devices using DPDK-compatible driver
============================================
<none>

Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=igb_uio *Active*

Other Network devices
=====================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' unused=e1000,igb_uio
0000:02:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' unused=e1000,igb_uio

2)綁定網卡2和3的驅動爲igb_uio

./usertools/dpdk-devbind.py -b igb_uio 02:06.0 02:07.0

3) 綁定完事後,不要着急,先看看綁定狀態,確保已經成功

./usertools/dpdk-devbind.py --status

如果drv=igb_uio,即表示網卡當前驅動爲igb_uio,恭喜你,的確綁定成功,可以往下走了。

Network devices using DPDK-compatible driver
============================================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000
0000:02:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000

Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=igb_uio *Active*

 

6. 設置大頁內存

echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge

 

7. 編譯示例程序

編譯helloworld

cd examples/helloworld
make

運行helloworld

./build/helloworld 

結果如下

EAL: Detected 4 lcore(s)
EAL: Probing VFIO support...
EAL: NUMA support not available consider that all memory is in socket_id 0
EAL: PCI device 0000:02:01.0 on NUMA socket 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:06.0 on NUMA socket 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:07.0 on NUMA socket 0
EAL:   probe driver: 8086:100f net_e1000_em
hello from core 1
hello from core 2
hello from core 3
hello from core 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章