DPDK原始碼組織框架

2021-09-29 05:53:26 字數 4267 閱讀 5240

剛拿到dpdk學習任務的時候一臉懵,這麼多內容根本不知道從哪看起,走了很多彎路,效率很低,故記錄下本文,幫助有需要的人。

本文分四部分介紹dpdk原始碼的組織架構。

由dpdk庫和應用程式提供的 makefiles 位於 $(rte_sdk)/mk 中。

配置模板位於 $(rte_sdk)/config。這些模板描述了為每個目標啟用的選項。 配置檔案許多可以為dpdk庫啟用或禁用的選項,包括除錯選項。使用者應該檢視配置檔案並熟悉這些選項。配置檔案同樣也用於建立標頭檔案,建立的標頭檔案將位於新生成的目錄中。

庫檔案原始碼位於目錄$(rte_sdk)/lib中。按照慣例,庫指的是為應用程式提供api的任何**。通常,它會生成乙個(.a)檔案,這個目錄中可能也儲存一些核心模組。

lib目錄包含如下專案

lib

+-- librte_cmdline # 命令列介面

+-- librte_distributor # 報文分發器

+-- librte_eal # 環境抽象層

+-- librte_ether # pmd通用介面

+-- librte_hash # 雜湊庫

+-- librte_ip_frag # ip分片庫

+-- librte_kni # 核心nic介面

+-- librte_kvargs # 引數解析庫

+-- librte_lpm # 最長字首匹配庫

+-- librte_mbuf # 報文及控制緩衝區操作庫

+-- librte_mempool # 記憶體池管理器

+-- librte_meter # qos metering 庫

+-- librte_net # ip相關的一些頭部

+-- librte_power # 電源管理庫

+-- librte_ring # 軟體無鎖環形緩衝區

+-- librte_sched # qos排程器和丟包器庫

+-- librte_timer # 定時器庫

驅動程式是為裝置(硬體裝置或者虛擬裝置)提供輪詢模式驅動程式實現的特殊庫。 他們包含在drivers子目錄中,按照型別分類,各自編譯成乙個庫,其格式為 librte_pmd_x.a ,其中 x 是驅動程式的名稱。

驅動程式目錄下有個 net 子目錄,包括如下專案:

drivers/net

+-- af_packet # 基於linux af_packet的pmd

+-- bonding # 繫結pmd驅動

+-- cxgbe # chelsio terminator 10gbe/40gbe pmd

+-- e1000 # 1gbe pmd (igb and em)

+-- enic # cisco vic ethernet nic poll-mode driver

+-- fm10k # host inte***ce pmd driver for fm10000 series

+-- i40e # 40gbe poll mode driver

+-- ixgbe # 10gbe poll mode driver

+-- mlx4 # mellanox connectx-3 poll mode driver

+-- null # null poll mode driver for testing

+-- pcap # pcap poll mode driver

+-- ring # ring poll mode driver

+-- szedata2 # szedata2 poll mode driver

+-- virtio # virtio poll mode driver

+-- vmxnet3 # vmxnet3 poll mode driver

+-- xenvirt # xen virtio poll mode driver

部分 driver/net 目錄包含乙個base子目錄,這個目錄通常包含使用者不能直接修改的**。 任何修訂或增強都應該x_osdep.c或x_osdep.**件完成。請參閱base目錄中本地的自述檔案以獲取更多的資訊。

應用程式目錄包含用於測試***dk(如自動測試)或輪詢模式驅動程式(test-pmd)的例項應用程式:

+-- chkincs # test program to check include dependencies

+-- cmdline_test # test the commandline library

+-- test # autotests to validate dpdk features

+-- test-acl # test the acl library

+-- test-pipeline # test the ip pipeline framework

+-- test-pmd # test and benchmark poll mode drivers

example目錄包含示例應用程式,顯示了如何使用庫:

examples

+-- cmdline # example of using the cmdline library

+-- exception_path # sending packets to and from linux tap device

+-- helloworld # basic hello world example

+-- ip_reassembly # example showing ip reassembly

+-- ip_fragmentation # example showing ipv4 fragmentation

+-- ipv4_multicast # example showing ipv4 multicast

+-- kni # kernel nic inte***ce (kni) example

+-- l2fwd # l2 forwarding with and without sr-iov

+-- l3fwd # l3 forwarding example

+-- l3fwd-power # l3 forwarding example with power management

+-- l3fwd-vf # l3 forwarding example with sr-iov

+-- link_status_interrupt # link status change interrupt example

+-- load_balancer # load balancing across multiple cores/sockets

+-- qos_meter # qos metering example

+-- qos_sched # qos scheduler and dropper example

+-- timer # example of using librte_timer library

+-- vmdq_dcb # example of vmdq and dcb receiving

+-- vmdq # example of vmdq receiving

+-- vhost # example of userspace vhost and switch

參考資料:dpdk官網說明文件 

服務框架原始碼

include stdio.h include windows.h service statusm servicestatus service status handlem servicestatushandle boolbrunning true void winapiservicemain dw...

spring原始碼框架

2.bean容器 讀取到bean的定義後,例項化bean,把bean資訊存放到容器 通過如下 進行例項化 class type field.gettype object o type.getconstructor newinstance 3.例項化以後不會直接放進容器,可以對例項化的bean進行增強...

Node框架Express原始碼

主檔案 function url.parse req.url,true let requestmethod req.method.tolowercase let i 0 function next err let layer 取出來的路徑 可能是正則型別 if err else else else ...