Linux 內核實現了 OSI 模型第 3 層(網絡層)及以上協議。網卡驅動位於 數據鏈路層(第 2 層)與物理層(第 1 層)的接口,負責:
ndo_start_xmit 將 skb 推送到硬件發送隊列netif_receive_skb 上交協議棧struct net_device_ops {
int (*ndo_open)(struct net_device *dev);
int (*ndo_stop)(struct net_device *dev);
netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb, struct net_device *dev);
int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
// ... 更多操作
};
| 參數類型 | 典型值 | 適用場景 |
|---|---|---|
| I/O 基址 | 0x300, 0x280 | ISA/舊式 PCI,端口 I/O 模式 |
| 中斷號 (IRQ) | 5, 9, 10, 11 | 所有模式必需,避免衝突 |
| DMA 通道 | 1, 3, 5 | 總線主控 DMA 模式,減輕 CPU |
| 共享內存 | 0xD0000-0xDFFFF | 高性能舊式網卡 |
現代 PCI/PCIe 網卡通過 PCI 配置空間 自動分配資源,無需手工設置。
| 維度 | 內建內核 (builtin) | 可加載模塊 (.ko) |
|---|---|---|
| 加載時機 | 啟動階段自動探測 | 運行時手動/自動 modprobe |
| 參數傳遞 | 內核命令行 ether=... | modprobe param=val 或 /etc/modprobe.d/ |
| 內存佔用 | 常駐,不可卸載 | 按需加載,rmmod 釋放 |
| 適用場景 | 核心設備、啟動必需 | 熱插拔、多硬件兼容、調試 |
gcc、make、kernel-headers/kernel-devel# 查看可用中斷
cat /proc/interrupts
# 查看 I/O 端口占用
cat /proc/ioports
# 1. 解壓驅動源碼
tar -xzf e1000e-3.8.4.tar.gz
cd e1000e-3.8.4/src
# 2. 編譯(需匹配當前內核版本的 kernel-devel)
make
# 3. 安裝模塊
sudo make install
# 或手動複製:
# sudo cp e1000e.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e/
# 4. 更新模塊依賴
sudo depmod -a
# 5. 加載驅動
sudo modprobe e1000e
# 複製到正確目錄
sudo cp e1000e.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e/
sudo depmod -a
sudo modprobe e1000e
# 1. 配置內核
make menuconfig
# Device Drivers → Network device support → Ethernet driver support → Intel devices → <*> Intel PRO/1000 PCI-Express Gigabit Ethernet support
# 2. 編譯安裝內核
make -j$(nproc)
sudo make modules_install install
# /etc/modprobe.d/e1000e.conf
options e1000e InterruptThrottleRate=3,3 RSS=1,1
# GRUB_CMDLINE_LINUX 中添加
e1000e.InterruptThrottleRate=3,3 e1000e.RSS=1,1
# 查看/設置協商模式
ethtool eth0
ethtool -s eth0 speed 1000 duplex full autoneg on
# 啟用/關閉硬件卸載
ethtool -K eth0 rx on tx on sg on tso on gso on
# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
ONBOOT=yes
NM_CONTROLLED=no
nmcli con add type ethernet con-name eth0 ifname eth0 ip4 192.168.1.100/24 gw4 192.168.1.1
nmcli con mod eth0 ipv4.dns "114.114.114.114 8.8.8.8"
nmcli con up eth0
# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0
[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=114.114.114.114
| 現象 | 排查步驟 | 常見解決 |
|---|---|---|
| 啟動未檢測到網卡 | lspci | grep -i ethernet 確認硬件存在 → dmesg | grep -i eth 查驅動日志 | 安裝對應驅動模塊;更新內核;BIOS 開啟板載網卡 |
| 驅動加載但無 ethX | ip link 查看命名(可能為 enp3s0、ens33) | 使用新命名配置;或用 udev 規則重命名 |
| 連接不上/掉包 | ethtool eth0 看 Speed/Duplex;dmesg -T 看錯誤 | 關閉自協商強制千兆全雙工;換線/換口;關閉 TSO/GSO |
| 性能低 | sar -n DEV 1 ethtool -S eth0 看隊列溢出 | 開啟 RSS/RPS/RFS;調整隊列長度 ethtool -G;多隊列綁核 |
dkms 自動適配內核升級tcpreplay、iperf3、bpftraceLinux 網卡驅動已高度成熟,絕大多數硬件開箱即用。手工安裝僅在極新硬件、極舊內核或定制優化場景需要。核心技能點:
modprobe/dkms 模塊生命周期管理ethtool 診斷鏈路狀態與調優參數