Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1531759
  • 博文数量: 793
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5498
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(793)

文章存档

2020年(135)

2019年(214)

2018年(216)

2017年(146)

2016年(82)

分类: LINUX

2020-07-27 14:11:30

https://www.cnblogs.com/nju347/p/8436641.html


关于上图的一些说明: 

系统初始化:

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. 如果报文没有被桥接代码处理,再调用协议处理函数来处理;

阅读(3572) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~