1、网卡驱动概述:Intel网卡产品线介绍、驱动在OSI模型中的位置、Linux网络协议栈概览

各位同学,咱们今天正式开讲。说实话,每次讲网卡驱动,我都觉得这是Linux内核里最「接地气」的一块。为什么?因为你写的代码,直接跟硬件打交道——数据从网线进来,经过你的驱动,一路送到应用层。这个过程,想想就带劲。

我最早接触Intel网卡驱动,是在一个数据中心项目里。当时服务器跑着几十个虚拟机,网络吞吐死活上不去。我查了三天,最后发现是驱动里一个中断合并参数没调对。嗯,从那以后我就明白——搞懂网卡驱动,不是光会写代码就行的。

1.1 Intel网卡产品线:你该选哪款?

Intel的网卡产品线,说白了就是三个梯队:

  • 入门级:I210、I350系列。桌面级、低端服务器用。单端口、双端口都有。我建议新手拿这个练手,寄存器简单,文档也全。
  • 主流级:X710、XXV710系列。25G、40G的天下。数据中心里最常见的型号。我在项目中遇到最多的问题,就是X710的流分类配置——搞不好就丢包。
  • 旗舰级:E810、E830系列。100G、200G起步。支持RDMA、ADQ这些高级特性。说实话,这玩意儿调试起来挺折磨人的,但性能是真的猛。

核心要点:选网卡,别光看速率。你得看你的业务场景。虚拟机多?选支持SR-IOV的。延迟敏感?选支持ADQ的。别问我怎么知道的——我踩过坑。

1.2 驱动在OSI模型中的位置:别小看这一层

OSI七层模型,大家应该都背过。但驱动到底在哪?

我直接说结论:驱动横跨物理层和数据链路层

  • 物理层:驱动要管PHY芯片的初始化、链路状态检测。说白了,就是看网线插没插,速率协商成多少。
  • 数据链路层:MAC层的活儿,驱动也得干。比如MAC地址过滤、帧校验、中断处理。这些都在驱动里。

你想想看,数据从网线进来,第一个碰到的是PHY,然后是MAC,然后才是驱动。驱动把数据从硬件FIFO搬到内存,再交给协议栈。这个过程,驱动就是那个「搬运工」。

个人经验:我调试过一个问题,网卡能收包但发不出去。查了半天,发现是PHY的自动协商没配好。驱动里就一行代码的事,但你不懂物理层,根本想不到。

1.3 Linux网络协议栈概览:数据是怎么「飞」上去的?

Linux网络协议栈,说白了就是一个分层处理的流水线。我习惯把它分成三块:

  1. 驱动层:负责收发包。中断来了,驱动把skb(socket buffer)准备好,扔给协议栈。
  2. 协议层:IP、TCP、UDP这些。做路由、分片、重组、校验和。
  3. 套接字层:给应用层用的接口。socket、bind、send、recv这些。

数据流大概是这样的:

应用层 (socket)
    ↓↑
传输层 (TCP/UDP)
    ↓↑
网络层 (IP)
    ↓↑
数据链路层 (驱动)
    ↓↑
物理层 (网卡硬件)

这里有个关键点:驱动和协议栈之间,是通过NAPI机制交互的。我刚开始做驱动时,一直没搞懂NAPI为什么比传统中断好。后来在压力测试中才发现——中断太多,CPU都被打满了,还收什么包?NAPI就是「中断+轮询」的混合模式,扛高并发就靠它。

注意:别以为协议栈是「黑盒」。驱动写不好,协议栈再牛也白搭。我曾经见过一个驱动,每次中断都申请内存,结果内存碎片化严重,系统直接OOM。嗯,这种坑,踩过一次就记住了。

1.4 小结:这一章你该带走什么?

这一章,说白了就是给你画个地图。Intel网卡有哪些型号,驱动在协议栈里扮演什么角色,数据怎么流动。后面每一章,都会围绕这些展开。

我个人习惯,学驱动开发,先别急着写代码。先把硬件手册翻一遍,把协议栈的代码走读一遍。磨刀不误砍柴工,真的。

下一章,咱们直接上手——搭建开发环境,编译第一个内核模块。到时候你们就知道,写驱动其实没那么玄乎。