Linux网卡驱动(3)-网卡驱动深层分析【转】

转自:https://blog.csdn.net/qq_22847457/article/details/92561307

之前我们介绍了网卡是怎么把一个数据包发送到网络上的,但是这只是Linux网络系统中的一个非常小的部分。对于内核怎么把用户数据传递给网卡,以及内核怎么把网卡收到的数据传递给用户是一个庞大的知识。
学过计算机网络的都知道,当用户需要发送数据的时候,需要根据路由表找到数据包下一站该发送到哪个路由器,这个路由器叫做这个网卡的邻居。如果邻居的MAC地址不知道,还需要通过ARP协议获取的路由去的MAC地址,这个过程交给邻居子系统来完成。
分析过程还是依据第一节课中的5层模型来分析:
1、系统调用接口
2、协议无关层
3、网络协议栈
4、设备无关层
5、硬件驱动
发送数据过程
当用户调用write系统调用时,内核是用哪个函数来响应的呢?在第一节课中我们知道soket有一个操作函数集,socket_file_ops:

/*
* Socket files have a set of 'special' operations as well as the generic file ones. These don't appear
* in the operation structures but are done directly via the socketcall() multiplexor.
*/

static const struct file_operations socket_file_ops = {
.owner = THIS_MODULE,
.llseek = no_llseek,
.aio_read = sock_aio_read,
.aio_write = sock_aio_write,
.poll = sock_poll,
.unlocked_ioctl = sock_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = compat_sock_ioctl,
#endif
.mmap = sock_mmap,
.open = sock_no_open, /* special open code to disallow open via /proc */
.release = sock_close,
.fasync = sock_fasync,
.sendpage = sock_sendpage,
.splice_write = generic_splice_sendpage,
.splice_read = sock_splice_read,
};
​​​​系统调用接口和协议无关层
1.发送入口sock_aio_write
2.调用do_sock_write
3.调用__sock_sendmsg
网络协议栈
4.调用udp_sendmsg
5.调用ip_route_output_flow(选择路由)
6.调用udp_push_pending_frames
7.调用ip_push_pending_frames(IP协议入口)
8.调用ip_local_out
9.调用dst_output
10.调用ip_finish_output
11.调用ip_finish_output2(建立邻居信息,路由中紧挨着发送方的网关,如果没有邻居信息,那么由Linux中的邻居子系统来建立邻居信息)
12.调用arp_generic_ops下面的neigh_resolve_output
13.调用queue_xmit
设备无关接口
14.调用dev_queue_xmit
15.调用dev_hard_start_xmit
设备驱动
16.调用ndo_start_xmit

 

 


接收数据过程
设备驱动
1.产生接收中断:从硬件读取数据放到skb中;调用netif_rx,并产生一次软中断
设备无关接口
2.调用net_rx_action处理软中断
3.调用netif_recevie_skb
4.调用deliver_skb
网络协议栈
5.调用ip_rcv
6.调用udp_rcv
系统调用层和协议无关层
7.调用sock->ops->recvmsg

 

 


 
————————————————
版权声明:本文为CSDN博主「小虾米_2018」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22847457/article/details/92561307

posted @   Sky&Zhang  阅读(946)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2018-12-26 android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论【转】
2017-12-26 Linux进程调度原理【转】
2017-12-26 Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)【转】
2017-12-26 Tslib触摸屏官网【转】
2017-12-26 Tslib的移植【转】
点击右上角即可分享
微信分享提示