前言
說到互聯網,大家很容易想到的有 CPU、服務器、操作系統、應用程序(App)、小程序、網頁(html)等。然而,還有一個要素是很容易被忽略的,卻是最重要的,那就是網卡。如果沒有網卡,那么所有的主機將會是孤立的,沒法實現相互間通信,也就不存在互聯網了。兩臺主機之間要實現通信,互相收發報文,最底層的基礎設施,除了傳輸鏈路(光纖、網線等),就是安裝在主機上的網卡了,它將主機上應用軟件產生的數據打包,然后從物理鏈路上發送出去,同理,它還可以從物理鏈路上接收報文,送往主機上的應用程序。
在這篇文章中,你將會了解到什么是中斷,什么是 PCIe,什么是 uio,什么是 igb_uio,什么是 pmd,什么是 DPDK 等一系列與網卡相關的概念及網卡工作的原理。

物理網卡
這里以 Intel 網卡為例,有 10G、25G、100G 等,表示最大的傳輸速度,單位 Gbit/s。網卡可以有一個端口,也可以有多個端口。
網卡驅動知多少
假如我們從 Intel 買回來一張網卡,是不是直接插到電腦上,就可以用呢?答案是否定的。從一張物理網卡到真正能夠實現收發報文,中間可是有一堆工作要做的。
- PCIe
PCIe 是一種高速串行點對點雙通道高帶寬、計算機擴展總線標準,現在已經發展到第四代了。簡單理解,就是計算機主板上用來插網卡的槽位。當網卡插入主板上的槽位時,一塊網卡上的每個端口都對應了一個 PCIe ID,這是網卡端口的物理身份標識。這里提一句,PCI 是 PCIe 的上一個形態。
- 中斷
首先,你要明確一點:網卡收發報通過中斷實現。什么是中斷呢?
所謂中斷,就是外部設備向處理器發起的請求事件,但這還不夠本質。更本質的理解是處理器對外開放的實時受控接口。中斷絕對不是硬件代替軟件去輪詢,而是硬件的結構決定了,當某個管腳電平變低(或者變高)的時候,CPU 就會被打斷,并從特定地址開始執行。比如,當 CPU 的 RESET 被拉低的時候一定會復位并從某個特定地址重新開始執行,這是由硬件的結構決定的。
- uio
uio,是一個內核框架(操作系統提供的內核模塊),作用就是支持用戶空間的 I/O 技術。而大家所熟知的 DPDK 開源組件就是實現用戶態 I/O 技術,它依賴內核空間的 uio 框架。

- pmd
pmd(poll mode driver,輪詢模式驅動)是 DPDK 在用戶態實現的網卡驅動程序,準確來說,它應該是個接口,它可以把 Intel 各種網卡的真正驅動程序加載到用戶態。
pmd 有哪些功能呢?比如對網卡硬件進行一些配置,例如設置網卡接收緩沖區,發送緩沖區的大小。所謂對網卡進行配置, 也就是對網卡寄存器進行配置。每個網卡都有自己的配置空間,對應了很多寄存器,每種寄存器各自負責不同的功能。比如接收控制寄存器,用于對網卡收發包的一些設置; 中斷寄存器,用于設置允許哪里產生中斷事件,例如鏈路中斷。
- igb_uio
igb_uio(也就是 DPDK 提供的 igb_uio.ko),是 DPDK 用于與 uio 交互的內核模塊,通過 igb_uio 來 bind 指定的 PCI 網卡設備給到用戶態的 pmd 使用。igb_uio 借助 uio 技術來截獲中斷,并重設中斷回調行為,從而繞過內核協議棧后續的處理流程。并且 igb_uio 會在內核初始化的過程中將網卡硬件寄存器映射到用戶態。
- i40e、ixgbe 等
i40e 驅動對應 Intel x700 系列網卡,這是由 Intel 提供的,是網卡真正的驅動,需要加載 i40e.ko 到內核,linux 操作系統才能識別這張物理網卡。而 ixgbe 是 Intel 82599 系列網卡驅動。
- 虛擬網卡
這個概念是伴隨著 vm(虛擬機)的產生而出現的,就是虛擬機上的網卡。我們可以將它和 host(物理機)上的物理網卡進行綁定。
總結
我們拿到 Intel 的一張網卡時,一般加載其對應的網卡驅動就可以使用了,比如 i40e、ixgbe 等。但如果我們要用 DPDK 實現用戶態網卡收發包,就需要下載 Intel 等開源代碼 - DPDK,內核需要加載 igb_uio,用戶態 pmd 驅動框架需要加載 librte_i40e.so 等。
Linux 系統中 DPDK 編程常用命令
ifconfig
/sys/config/net-scripts/ 下的文件可以用來配置 eth 口的 ip 地址等
ip link show
lspci // 有很多可選參數
lsmod
su modprobe uio
su insmod igb_uio
dpdk主目錄/usrtools/ 下的 dpdk-devbind.py、dpdk-setup.sh 等自帶腳本
linux 用戶空間和內核空間通信通過 sysfs 實現