深入理解Linux网络技术内幕——设备的注册与初始化(二)
设备注册于设备除名
切割操作:netdev_run_todo
Netlink信号量的保护。这也是为什么register_netdev执行时需要请求锁,并且在返回时要释放锁的原因。一旦register_netdevice完成了它自己的工作,它会通过net_set_todo将net_device结构体添加到net_todo_list中。net_todo_list包含一系列有注册(或除名)操作需要被完成的设备列表。这份列表有register_netdev在释放锁时间接予以处理。
void rtnl_unlock(void)
{
/* This fellow will unlock it for us. */
netdev_run_todo();
}
EXPORT_SYMBOL(rtnl_unlock);
设备注册状态通知
//格式:
#define NETDEV_UP 0x0001 /* For now you can't veto a device up/down */
#define NETDEV_DOWN 0x0002
...... //含义:
NETDEV_UP //该报告表明设备被启用,由dev_open产生报告
NETDEV_DOWN //设备已关闭,由dev_close生成报告
NETDEV_REBOOT //因硬件设备,设备已重启
NETDEV_CHANGE //设备的状态或者配置发生改变
NETDEV_REGISTER //设备已经注册
NETDEV_UNREGISTER //设备已经除名
NETDEV_CHANGEMTU //
NETDE //
NETDEV_PRE_UP //
NETDEV_PRE_TYPE_CHANGE //
NETDEV_POST_TYPE_CHANGE //
NETDEV_POST_INIT //
NETDEV_UNREGISTER_FINAL //
NETDEV_RELEASE //
NETDEV_NOTIFY_PEERS //
NETDEV_JOIN //
NETDEV_CHANGEUPPER
V_CHANGEADDR //设备硬件地址(或关联的广播地址)发生改变
NETDEV_GOING_DOWN //
NETDEV_CHANGENAME //设备名称发生改变
NETDEV_FEAT_CHANGE //
NETDEV_BONDING_FAILOVER
//
NETDEV_RESEND_IGMP //
设备注册:
int register_netdev(struct net_device *dev)
{
int err; rtnl_lock();
err = register_netdevice(dev);
rtnl_unlock();
return err;
}
- 初始化net_device的部分字段
- 如果内核支持Divert功能,则用alloc_divert_blk分配该功能所需的数据空间块,并连接至dev->divert
- 如果设备驱动已经对dev->init进行初始化,则执行此函数。
- 由dev_new_index分配给设备一个识别码。
- 把net_device插入到全局表dev_base,以及两张哈希表dev_name_head,dev_index_head。
- 检查功能标识是否有无效的组合。
- 设置dev->state中的__LINK_STATE_PRESENT标识,使得设备能为内核所用。
- 用dev_init_scheduler初始化设备队列规则,以便流量控制用于实现Qos。
- 通过netdev_chain通知表链通知所有对本设备注册感兴趣的子系统。
设备除名:
- 用dev_close关闭设备
- 释放所有分配的资源(IRQ、I/O端口...)
- 从全局表dev_base和两张哈希表中删除设备
- 当该设备的所有引用都释放后,释放net_device结构的空间、该驱动程序的私有数据结构、以及相链接的内存区域块。
- 删除添加到/proc 和/sys的所有文件
dev->stop //用以关闭设备,通常包括关闭netif_stop_queue出口,释放硬件资源等
dev->uninit //主要负责引用计数,少用到
dev->destructor //少数虚拟设备使用,通常初始化为: free_netdev 或其包裹函数
- 如果设备没关闭,使用dev_close关闭
- 从全局表dev_base和两张哈希表中删除设备
- 所有与该设备关联的队列规则实例,由dev_shutdown销毁
- 发送NETDEV_UNREGISTER消息到netdev_chain通知链。
- 除名消息也必须通知用户空间。
- 任何链接至net_device的数据块被释放
- register_netdevice中dev_init的所有操作都要有dev_uninit复原。
引用计数
网络设备的启用和关闭
//net/core/dev.c
int dev_open(struct net_device *dev)
static int __dev_open(struct net_device *dev)
- 如果 dev->open初始化了,就调用dev->open。
- 设置dev_state中的__LINK_STATE_START标识,以表明设备开启或在运行中
- 设置dev_flags中的IFF_UP,标识设备为开启。
- 调用dev_activate初始化流量控制所需使用到的出口队列规则,然后启用看门狗定时器。
- 向netdev_chain发送NETDEV_UP通知
- 向netdev_chain发送 NETDEV_GOING_DOWN通知
- 调用dev_deactivat关闭队列规则
- 清除dev->state的_ _LINK_STATE_START标志,以表明设备禁用了
- 如果正在执行读取入口队列数据包的轮询操作,则等待该操作完成。因为dev->state关系,入口队列不会再有入队操作,所以读取当前已经在队列中的即可
- 如果dev->stop有定义,执行它。
- 清除dev->flags的IFF_UP操作。
- 向netdev_chain发送NEtdEV_DOWN通知。
更新队列规则状态:
从用户空间配置设备相关信息
- ipconfig和mii-tool 来自net-tool套件
- ethtool 来自ethtool套件
- ip link:来自IP ROUTER2 套件
深入理解Linux网络技术内幕——设备的注册与初始化(二)的更多相关文章
- 深入理解linux网络技术内幕读书笔记(五)--网络设备初始化
Table of Contents 1 简介 2 系统初始化概论 2.1 引导期间选项 2.2 中断和定时器 2.3 初始化函数 3 设备注册和初始化 3.1 硬件初始化 3.2 软件初始化 3.3 ...
- 深入理解linux网络技术内幕读书笔记(七)--组件初始化的内核基础架构
Table of Contents 1 引导期间的内核选项 2 注册关键字 3 模块初始化代码 引导期间的内核选项 linux运行用户把内核配置选项传给引导记录,然后引导记录再把选项传给内核. 在引导 ...
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- 深入理解Linux网络技术内幕——网络设备初始化
概述 内核的初始化过程过程中,与网络相关的工作如下所示: 内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线 ...
- 深入理解linux网络技术内幕读书笔记(八)--设备注册与初始化
Table of Contents 1 设备注册之时 2 设备除名之时 3 分配net_device结构 4 NIC注册和除名架构 4.1 注册 4.2 除名 5 设备初始化 6 设备类型初始化: x ...
- 深入理解Linux网络技术内幕——PCI层和网络接口卡
概述 内核的PCI子系统(即PCI层)提供了不同设备一些通用的功能,以便简化各种设备驱动程序. PCI层重要结构体如下: pci_device_id 设备标识,根据PCI标志定 ...
- 《深入理解Linux网络技术内幕》阅读笔记 --- 路由基本概念
一.路由的基本概念 1.一条路由就是一组参数,这些参数存储了往一个给定目的地转发流量所需的信息,而一条路由所需的最少的参数集合为:(1)目的网络,(2)出口设备,(3)下一跳网关 2.路由中的相关术语 ...
- 深入理解linux网络技术内幕读书笔记(十)--帧的接收
Table of Contents 1 概述 1.1 帧接收的中断处理 2 设备的开启与关闭 3 队列 4 通知内核帧已接收:NAPI和netif_rx 4.1 NAPI简介 4.1.1 NAPI优点 ...
- 深入理解linux网络技术内幕读书笔记(九)--中断与网络驱动程序
Table of Contents 1 接收到帧时通知驱动程序 1.1 轮询 1.2 中断 2 中断处理程序 3 抢占功能 4 下半部函数 4.1 内核2.4版本以后的下半部函数: 引入软IRQ 5 ...
随机推荐
- YOLOv1-darknet 内容解析
目录 YOLOv1-darknet 内容解析 1. 核心思想 2. 特点 3. 缺点 4. 算法流程 5. 详细内容 6. 主要参考 YOLOv1-darknet 内容解析 1. 核心思想 目标检测分 ...
- 【Android实验】第一个Android程序与Activity生命周期
目录 第一个Android程序和Activity生命周期 实验目的 实验要求 实验过程 1. 程序正常启动与关闭 2. 外来电话接入的情况 3. 外来短信接入的情况 4. 程序运行中切换到其他程序(比 ...
- 01_Kafka概述
1.Kafka背景 * LinkedIn开发,2011年成为Apache的一个开源项目* 2012年,成为Apache的一个顶级项目* 基于java和Scala编写, 基于发布-订阅模型的消息系统(离 ...
- AtCoder square869120 Contest #3 F sushi
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Linux——bash应用技巧简单学习笔记
本人是看的lamp兄弟连的视频,学习的知识做一下简单,如有错误尽情拍砖. 命令补齐 命令补齐允许用户输入文件名起始的若干个字 母后,按<Tab>键补齐文件名. 命令历史 命令历史允许用户浏 ...
- 适用于目前环境的bug记录
问测试,bugtracker.JIRA,你们用起来啊? 难道bugtracker/JIRA只有测试用吗? 截屏忽略,只有测试人员自己提bug,开发不管不顾,解决了也不关闭bug,bug提得太多,还嫌测 ...
- testNG 学习笔记 Day2 配置testNG自带的监听器
IntelliJ IDEA配置testNG自带的监听器的时候,操作如下菜单栏中 run ----> 下拉菜单中的 Edit Configurations ----> 新矿口中TeatNG下 ...
- maven 下载不到jar包时候,更改阿里源
maven 源 下载太慢,更改国内的阿里源会快一些 <repositories> <repository> <id>alimaven</id> &l ...
- .net Parallel并行使用
因项目响应过慢,代码优化空间不大,在暂时无法调整系统架构的情况下,只有使用.NET中的TPL解决一些模块耗时过多的问题.但在使用过程中也碰到了一些问题,现在把它写下来,用于备忘. 1. Paralle ...
- c++ primer plus 第二章 课后题答案
#include<iostream> using namespace std; int main() { cout << "My name is Jiantong C ...