前言
說到網際網路,大家很容易想到的有 CPU、伺服器、作業系統、應用程式(APP)、小程式、網頁(HTML)等。然而,還有一個要素是很容易被忽略的,卻是最重要的,那就是網絡卡。如果沒有網絡卡,那麼所有的主機將會是孤立的,沒法實現相互間通訊,也就不存在網際網路了。兩臺主機之間要實現通訊,互相收發報文,最底層的基礎設施,除了傳輸鏈路(光纖、網線等),就是安裝在主機上的網絡卡了,它將主機上應用軟體產生的資料打包,然後從物理鏈路上傳送出去,同理,它還可以從物理鏈路上接收報文,送往主機上的應用程式。
在這篇文章中,你將會了解到什麼是中斷,什麼是 PCIe,什麼是 uio,什麼是 igb_uio,什麼是 pmd,什麼是 DPDK 等一系列與網絡卡相關的概念及網絡卡工作的原理。
物理網絡卡
這裡以 Intel 網絡卡為例,有 10G、25G、100G 等,表示最大的傳輸速度,單位 Gbit/s。網絡卡可以有一個埠,也可以有多個埠。
網絡卡驅動知多少
假如我們從 Intel 買回來一張網絡卡,是不是直接插到電腦上,就可以用呢?答案是否定的。從一張物理網絡卡到真正能夠實現收發報文,中間可是有一堆工作要做的。
PCIePCIe 是一種高速序列點對點雙通道高頻寬、計算機擴充套件匯流排標準,現在已經發展到第四代了。簡單理解,就是計算機主機板上用來插網絡卡的槽位。當網絡卡插入主機板上的槽位時,一塊網絡卡上的每個埠都對應了一個 PCIe ID,這是網絡卡埠的物理身份標識。這裡提一句,PCI 是 PCIe 的上一個形態。
中斷首先,你要明確一點:網絡卡收發報透過中斷實現。什麼是中斷呢?
所謂中斷,就是外部裝置向處理器發起的請求事件,但這還不夠本質。更本質的理解是處理器對外開放的實時受控介面。中斷絕對不是硬體代替軟體去輪詢,而是硬體的結構決定了,當某個管腳電平變低(或者變高)的時候,CPU 就會被打斷,並從特定地址開始執行。比如,當 CPU 的 RESET 被拉低的時候一定會復位並從某個特定地址重新開始執行,這是由硬體的結構決定的。
uiouio,是一個核心框架(作業系統提供的核心模組),作用就是支援使用者空間的 I/O 技術。而大家所熟知的 DPDK 開源元件就是實現使用者態 I/O 技術,它依賴核心空間的 uio 框架。
pmdpmd(poll mode driver,輪詢模式驅動)是 DPDK 在使用者態實現的網絡卡驅動程式,準確來說,它應該是個介面,它可以把 Intel 各種網絡卡的真正驅動程式載入到使用者態。
pmd 有哪些功能呢?比如對網絡卡硬體進行一些配置,例如設定網絡卡接收緩衝區,傳送緩衝區的大小。所謂對網絡卡進行配置, 也就是對網絡卡暫存器進行配置。每個網絡卡都有自己的配置空間,對應了很多暫存器,每種暫存器各自負責不同的功能。比如接收控制暫存器,用於對網絡卡收發包的一些設定; 中斷暫存器,用於設定允許哪裡產生中斷事件,例如鏈路中斷。
igb_uioigb_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 showlspci // 有很多可選引數lsmodsu modprobe uiosu insmod igb_uiodpdk主目錄/usrtools/ 下的 dpdk-devbind.py、dpdk-setup.sh 等自帶指令碼linux 使用者空間和核心空間通訊透過 sysfs 實現