下图简单描述了网卡驱动与Linux内核之间的联系:

关于上图的一些说明

系统初始化:

1. 协议模块调用 dev_add_pack() 来注册协议处理函数到链表 &ptype_base;

2. __init br_init() 用于初始化桥接相关的操作;

3. __init net_dev_init() 初始化了两个软中断;

网卡驱动初始化:

1. 网卡驱动在其 probe() 函数里面初始化 net_device 结构体,用来描述网卡,以及提供操作网卡的接口;

配置网卡:

1. 当我们通过ifconfig来配置网卡时,会调用到net_device->open(),该函数最主要的是注册了一个中断(当网卡接收到数据或数据发送完成会触发中断);

数据的发送与接收:

1. 当我们需要发送数据时,最终调用的是网卡驱动提供的函数:net_device->hard_start_xmit();

2. 当我们接收到数据时,会触发中断,中断处理函数调用会调用内核函数来接收数据,最终由驱动程序调用内核函数netif_receive_skb(),把报文送入协议栈(接下来的代码硬件无关,与具体报文处理协议相关,比如:ARP协议,IPv4协议,IPv6协议等)。

3. 网卡的中断处理函数在调用内核函数接收数据时又分为非NAPI/NAPI两种方式;

4. NAPI方式涉及到中断的下半部处理的概念以及软中断。

5. 报文通过netif_receive_skb()送入协议栈之后,首先判断需不需要进行桥接处理;

6. 如果报文没有被桥接代码处理,再调用协议处理函数来处理;

最新文章

  1. C/C++实践笔记 003
  2. 【bzoj3674】 可持久化并查集加强版
  3. 并发编程 05—— Callable和Future
  4. linux ps命令介绍
  5. IOS 从系统图库中获取 图片 并设置为头像
  6. Fedora14下首次搭建Samba服务器遇到的一些问题
  7. UIKit和Core Graphics绘图(一)——字符串,线条,矩形,渐变
  8. Hibernate与iBATIS的比较
  9. poj1144 Network【tarjan求割点】
  10. ECshop lib_base.php on line 1241 错误解决方法
  11. Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)
  12. (.NET高级课程笔记)反射总结
  13. java0425 wen IO
  14. 记账本,C,Github,Dao
  15. 现代C++之理解decltype
  16. 从零开始一起学习SLAM | 为什么要用齐次坐标?
  17. idea创建web聚合工程(2)
  18. 显示定位方法,提取中间text 封装成函数的方法
  19. leetcode1021
  20. Spark2.1.0模型设计与基本架构(上)

热门文章

  1. Spring boot 整合hive-jdbc导致无法启动的问题
  2. 日志文件系统syslog,syslog-ng
  3. Django 框架 基本知识
  4. 安装 pymongo
  5. async await的用法
  6. System.Web.UI.Page的页面基类
  7. 2sum,3sum,4sum,ksum
  8. 函数 return
  9. shell编程:case语句
  10. 解决session只能被一个浏览器访问的问题