Linux协议栈(10)——网络驱动

简介:

  Linux协议栈(10)——网络驱动

网络驱动区别于其他驱动(例如块驱动)的一个方面是:块驱动的运行只是响应来自内核的请求,但是网络驱动从外边异步地接收报文。

Linux内核的网络子系统设计成完全独立于协议的。

            相关内容可以参考:linux网络驱动初始化module_init函数跟踪

1.1.1.1  注册网络设备

函数alloc_netdev分配一个新的net_device实例。然后使用特定于协议的函数用典型值来填充该结构,以太网使用ether_setup。这两个函数可以合起来就是alloc_etherdev

填充完毕后,调用register_netdevie()(定义于文件net/core/dev.c)注册到系统中,注销可以通过unregister_netdevice()。

register_netdev函数将设备注册到内核,并将设备注册到通用设备机制内。会创建一个sysfs项/sys/class/net/<device>中。

driver_register在总线上注册驱动。netdev_register_kobject给网络设备创建sysfs入口。

d8491e725736c454215988113dfeab18c8cc5252

1.1.1.2  加载和卸载

以e1000驱动为例,驱动加载时候先运行e1000_init_module函数,主要实现注册到PCI子系统中。

            通过调用pci_register_driver函数注册e1000_driver(pci_driver为驱动主结构)驱动,将其注册到PCI设备的链表中。

            卸载是e1000_exit_module函数,直接调用pci_unregister_driver,和设备打开和关闭。

根据e1000_netdev_ops结构体中的定义,打开设备使用的函数为e1000_open。当网络接口激活的时候被调用。

            关闭函数为e1000_close也定义在e1000_netdev_ops结构体中,用于禁用网络接口。

1.1.1.3  数据接收和发送

数据传输是net_device接口的关键组件。驱动程序提供一个hard_start_xmit函数,协议层在发送时调用它来向下传递数据包,现在也是定义在net_dev_ops结构体。

可以看到发送函数为e1000_xmit_frame

现在的中断驱动程序都采用的是NAPI方式,需要提供poll函数,本驱动中是e1000_netpoll轮询函数。

   当有新数据包要发送时候,首先上层协议调用e1000_xmit_frame函数,然后在该函数中调用e1000_tx_queue来根据相应的参数找到缓冲块存放,缓冲块中有dma成员,表示该数据包所在的总线地址,控制总线会把内容映射到总线地址,然后由网卡传送出去。

  当有新数据包达到时,首先触动中断处理函数e1000_intr,该中断函数会将数据包放在buffer_info的缓冲块中(),就是讲总线地址指向的内容复制到skb中,然后根据skb中的协议将其传给上层协议的接收函数。

  具体会在后面针对e1000驱动进行介绍。

1.1.1.4  总结:

本系列从总体上对linux网络子系统有了介绍。也标注了源码的出处和部分相关函数的定义,但是并未针对代码进行深入。主要是从两方面考虑,一方面是本系列初衷是对网络子系统有总体的掌控,深入代码后容易走到细枝末节上;另一方面是,一旦深入代码本身,那么会延伸到很远,本人也没有做好这个准备,需要对知识点再做细分。这个是后续需要做的事情。

Linux系统中的网络子系统非常庞大,这里介绍的只是是冰的一角,虽是轮廓但也只能算是描边,给大家参考阅读,欢迎指正。后续会继续深入之。还会增加Linux网络模块的其他机制例如:netlink,netfilter等。

最后祝大家玩得愉快。

1.1.1.4  参考:

《深入Linux内核架构》第十二章

《深入理解linux网络技术内幕》

《精通linux内核网络》

《linux设备驱动》

《TCP/IP详解卷1——原理》

《Linux内核源码剖析TCP IP实现》

 

目录
相关文章
|
17天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
46 11
|
2月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
84 2
|
1天前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
29 15
|
6天前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
68 7
|
16天前
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
42 11
|
2月前
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
69 5
|
2月前
|
域名解析 网络协议 安全
|
3月前
|
运维 监控 网络协议
|
2月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
99 2
|
2月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
70 13