代码学习-Linux内核网卡收包过程(NAPI)

Linux收发包流程代码分析(ixgbe) 阅读详情

 本文通过学习RealTek8169/8168/8101网卡的驱动代码(drivers/net/r8169.c),梳理一下Linux下网卡的收包过程。

在下水平相当有限,有不当之处,还请大家斧正^_^

 

驱动的初始化

如下的rtl8169_init_module函数是此驱动的初始化代码,此函数只干了一件事,就是向内核注册一个pci驱动rtl8169_pci_driver。

static int __init rtl8169_init_module(void)

{

        returnpci_register_driver(&rtl8169_pci_driver);

}

 

rtl8169_pci_driver驱动的定义如下。

static struct pci_driver rtl8169_pci_driver= {

        .name               = MODULENAME,

        .id_table  = rtl8169_pci_tbl,

        .probe              = rtl8169_init_one,

        .remove            = __devexit_p(rtl8169_remove_one),

        .shutdown       = rtl_shutdown,

        .driver.pm        = RTL8169_PM_OPS,

};

 

.id_table成员是一个驱动程序支持的全部设备列表。对于rtl8169_pci_driver,id_tabl就是b rtl8169_pci_tbl了,其内容如下。可见此驱动支持多种不同型号的网卡芯片。

 

static struct pci_device_idrtl8169_pci_tbl[] = {

        {PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8129),0, 0, RTL_CFG_0 },

        {PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8136),0, 0, RTL_CFG_2 },

        {PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8167),0, 0, RTL_CFG_0 },

        {PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168),0, 0, RTL_CFG_1 },

        {PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169),0, 0, RTL_CFG_0 },

        {PCI_DEVICE(PCI_VENDOR_ID_DLINK,       0x4300),0, 0, RTL_CFG_0 },

        {PCI_DEVICE(PCI_VENDOR_ID_AT,               0xc107),0, 0, RTL_CFG_0 },

        {PCI_DEVICE(0x16ec,                         0x0116),0, 0, RTL_CFG_0 },

        {PCI_VENDOR_ID_LINKSYS,  0x1032,   PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },

        {0x0001,        0x8168,         PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },

        {0,},

};

 

需要注意到,驱动中还有如下一行代码。

MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);

这个宏貌似是给rtl8169_pci_tbl变量起了一个别名__mod_pci_device_table。可见__mod_pci_device_table是pci设备驱动中的一个统一的符号名。他包含了此驱动支持的全部设备的列表。

这是干什么的呢?这时解释一下。

如果此驱动被编译到了内核中,或者此驱动已经被加载到内核中。那么这一句话就没什么作用了。因为内核随时可以根据rtl8169_pci_driver中的信息,来判断某一设备是否匹配此驱动。代码见pci_match_device函数。

但是,如果此驱动被编译成了一个模块文件r8169.ko,并且没有被加载到内核中(正常情况下,大量的设备驱动都应该是被编译成模块的,并且都是不加载到内核中的。机器上电时,根据扫描到的设备,动态加载相应的驱动模块。不然的话,如果各种驱动都加载到内核中,那内核就太臃肿了)。此时,如果内核扫描到了一个pci设备,就得加载相应的驱动模块文件。但内核只掌握了此设备的类似Vendorand device ID这样的信息,如何将这种信息对应到具体的驱动模块文件r8

napi:linux网卡驱动收包机制 linux 操作系统一般指 linux 内核。在 linux 上开发应用的时候,可以使用 linux 提供的系统调用。linux 内核管理着机器上的硬件资源:内存,磁盘,网卡等。开发应用的时候不能直接操作这些硬件,而只能通过系统调用来使用这些资源。linux 系统调用可以说是 linux 内核提供给上层的一些接口。这种内核和用户隔离的机制保证了安全性的同时,也简化了应用的开发。linux 内核除了给上层应用提供了接口之外,给底层的硬件驱动也提供了框架和机制。 阅读详情

相关推荐

linux 内核协议栈 NAPI机制与处理流程分析(图解)

结合e1000和iixgb类型的网卡说明NAPI工作原理

6705

简要分析alloc_skb函数

分配内存:为sk_buff结构体和数据缓冲区(存储实际网络数据包分配内存)初始化结构:设置sk_buff的元数据(如指针、长度、协议类型等)预留头部空间:在数据缓冲区中预留空间,以便后续协议层(如IP、TCP添加头部)。alloc_skb是Linux内核网络栈的基石,通过高效的内存分配和结构体初始化,为网络数据包提供存储和管理的基础设施。其实现结合了slab缓存、内存对齐和预留空间优化,确保网络协议栈能够高性能地处理数据包。

weixin_41123217的博客 1343

自组织映射神经网络(SOM)

目录 1 背景:自组织(竞争型)神经网络 2竞争学习的概念与原理 2.1 竞争学习的步骤 2.2 示例 3SOM典型结构 4SOM网的权值调整域 5 SOM Kohonen 学习算法 6 SOM示例 7SOM设计细节 7.1输出层设计 7.2输出层节点排列的设计 7.3 权值初始化问题 7.4学习率的设计 7.5设计拓扑领域 8SOM功能分析 8.1 保序映射 8.2数据压缩 8.3 特征提取 9自组织映射神经网络与K均值算法的区别...

weixin_39910711的博客 1万+

减小伺服电机共振的方法(以松下伺服为例)

嘿 ! 我是【小黄】 , 我们又见面啦 !!! 毕竟技术只有大家交流才会进步嘛 ! 这博客是对自己学习的一点点记录和总结 ,如果您对自动控制感兴趣的话 ,可以关注一下我的动态 , 我们一起学习呀 ! 我们都还年轻 ,我们还有无限可能 。 YES ! 减小伺服电机共振的方法(以松下伺服为例)1. 准备工作:1.1.1 如何推定共振点:1.1.2 测定实操:1.1.3 总结:2. 下期预告: 在我们调试完伺服参数以后机器人运动到某个特定位置会产生振动或异响,我们要做的就是消除这个异响保..

在下小黄的博客 1万+

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

Ansys疲劳仿真:工程结构寿命评估的实战方法论

做了这么多年仿真,有个感受越来越深——静力学算得再漂亮,疲劳寿命预测不对,项目照样过不了评审。不是因为理论有多复杂,而是因为疲劳损伤的物理机制本身就带有统计属性,材料内部的微观缺陷分布、应力集中位置、载荷谱的随机性,每一项都能让结果偏移20%甚至更多。本文从实战出发,梳理Ansys疲劳仿真的核心流程,重点讲清楚载荷类型选择、S-N曲线处理、应力集中修正这几个最容易出问题的环节。疲劳仿真做好了,最大的收获不是跑出一个漂亮的Damage云图,而是对结构的真实薄弱环节建立起量化的认知。

keyanxiaobaigou的博客 529

cartographer实现纯定位

实现纯定位 (1)因为正常的cartographer的建图的map是由cartographer发布的;如下 rostopic info /map Type: nav_msgs/OccupancyGrid Publishers: * /cartographer_occupancy_grid_node 因此需要把map的发布替换成 <node name="map_server" pkg="map_server" type="map_server" args="/home/lx.

Studying…… 5888

2026.2.11:ollama api推理GLM-OCR模型识别图片

本文介绍了使用Ollama API调用GLM-OCR模型进行图片文字识别的过程。首先通过ollama pull glm-ocr:latest命令拉取模型,然后使用Python脚本调用API接口。代码示例展示了如何发送包含图片路径的请求,并处理返回的识别结果,支持文本、公式和表格三种识别模式。运行结果展示了模型对输入图片的识别效果,为开发者提供了便捷的OCR解决方案。

拥抱具身智能,昇腾Ascend C 370

orchestrator常见问题汇总

默认的取集群名称的规则为参数决定 ,默认为取主实例 主机名 ,然后按分隔符"."之前的第一段字符为集群别名,这样在集群主库宕机后,新提升的从库的服务器名称为了新的集群名,宕机的主库成为单独的一个集群。1 默认配置文件中设置了匹配规则 ,只有被匹配的主机名才能进行故障恢复,所以该参数需要设置为 "*"3 另外配置文件中还有许多发现,恢复的忽略规则(Ignore) 这些参数也是需要注意的。由于LVS的后端的RS为IP地址,如果直接显示主机名,LVS的接口方法将无法工作。只传入脚本中用到的参数,不要多传入。

DBA之路的博客 829

库存管理系统项目部署方案(基于jdk8)

不需要安装到服务器,运维本地安装就行,主要是用来编译前端代码的。构建完成后将dist文件夹复制到服务器内。

程序员诚哥 2576

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 二进制文件与16进制(十六进制)文本文件互转工具
下一篇: pci设备学习笔记
无忧老猪
博客等级 码龄18年 200粉丝 112原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值