深入理解Linux网络技术内幕——虚拟设备初始化小结

概述

虚拟设备是建立在一个或者多个真实设备上的抽象。虚拟设备和真实设备的对应关系时多对多的,但是并不是所有的组合都能被定义,或者被内核所支持。

下面列举一些比较常见虚拟设备:

Bonding   //绑定,虚拟设备绑定物理设备,使其如同单一设备
802.1Q    //IEEE标准,用于建立VLAN
Bridging  //网桥的虚拟代表
Aliasing interfaces   //别名接口,用以让一个Ethernet真实接口有多个虚拟接口
True equalizer (TEQL) //普通均衡器,是一个队列规则,用于流量控制
Tunnel interfaces     //隧道接口

虚拟设备与内核网络协议栈的交互

初始化:

与真实设备一样,虚拟设备初始化时,被分配了net_device结构(:别名设备是不需要分配net_device的)。通常,虚拟设备的net_device所包含的函数指针都是指向包裹函数,这些包裹函数都包含了相关的真实设备所使用的函数指针。

配置:

虚拟设备一般会有特殊的用户空间配置工具来进行配置,无法使用ifconfig

外部接口:

虚拟设备会在/proc文件系统下创建文件或目录(别名设备仍然是一个特例,它没有再/proc下创建文件或目录),具体创建的内容及复杂程度取决于虚拟设备的设计。

传输:

虚拟设备与真实设备之间不是一对一的对应关系时,用于传输的函数就需要选择对应的真实设备及其他任务。因为Qos是根据每个设备的需要来应用的,因此需要进行流量配置。

接收:

虚拟设备都是软件对象,不需要参与与系统资源的交互,其接收到的流量都是间接获得的。不同的虚拟设备对接收到的流量有不同的处理方式,如802.1q可能只让携带了正确id的包通过,而网桥则让所有的包都通过。

外部通知:

与真实设备一样,虚拟设备也会关注系统其它组件发生的特殊事件通知。虚拟设备是基于真实设备的逻辑之上的,真实设备无法向虚拟设备传送通知,因而虚拟设备的通知需要单独进行。

虚拟设备无法感知硬件触发的通知

虚拟设备的其他特点

虚拟设备优势会使用 register_netdevice和unregister_netdevice来注册/除名,而非他们的包裹函数,并以此获取更多的持有锁的时间。

真实设备只有在下载时才能被除名(销毁),但虚拟设备可以通过命令来进行

大多数真实设备使用dev->init, dev->uninit和dev->destructor.来进行设备的注册和除名。但是大多数虚拟设备会使用相对简单的逻辑来进行。他们使用dev->init和dev->uninit进行了额外的工作,使得 dev->destructor不需要显示调用。

对于真实设备,net_device的初始化被分割为驱动的probe进程和通用setup例程部分。但是虚拟设备没哟probe例程。

关于内核通知表链:由于虚拟设备是建立在真实设备之上的,真实设备的变化会影响到虚拟设备。

时间: 2024-10-10 23:13:11

深入理解Linux网络技术内幕——虚拟设备初始化小结的相关文章

深入理解Linux网络技术内幕——网络设备初始化

概述 内核的初始化过程过程中,与网络相关的工作如下所示: 内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线程init(在Linux3-12中为kernel_init). asmlinkage void __init start_kernel(void) { ... parse_early_param();//间接调用parse_args parse_args(...); //处理内核引导程序(boot loader)

深入理解Linux网络技术内幕——IPv4 报文的传输发送

报文传输,指的是报文离开本机,发往其他系统的过程. 传输可以由L4层协议发起,也可以由报文转发发起. 在深入理解Linux网络技术内幕--IPv4 报文的接收(转发与本地传递)一文中,我们可以看到,报文转发最后会调用dst_output与邻居子系统进行交互,然后传给设备驱动程序. 这里,我们从L4层协议发起的传输,最后也会经历这一过程(调用dst_output).本文讨论的是L4层协议发起的传输,在IPv4协议处理(IP层)中的一些环节. 大蓝图 我们先看下传输环节的大蓝图,以便对传输这一过程有

深入理解Linux网络技术内幕——设备的注册于初始化(一)

副标题:设备注册相关的基本结构的原理框架 设备注册与删除时间 设备在下列两种情况下进行注册: 1)加载NIC驱动时 2)插入热插拔设备时 这里NIC与热插拔设备有些不同.a.对于非热插拔NIC来说,NIC的注册是伴随着其驱动的发生的,而NIC可以内建到内核,也可以作为模块载入,如果内建入内核,则NIC设备和初始化均发生在引导时,如果NIC作为模块加载,则NIC的注册和驱动初始化均发生在模块加载时.b. 对于热插拔NIC设备来说,其驱动已经加载,因此设备的注册发生在插入设备,内核通知关联驱动时.

深入理解Linux网络技术内幕——设备的注册与初始化(二)

设备注册于设备除名 设备注册与设备除名一般有 register_netdev和unregister_netdev完成.这两个是包裹函数,负责上锁,真正起作用的是其调用的register_netdevice和unregister_netdevice.参见:net/core/dev.c. 下图描述了设备注册过程中的一些状态变化 状态的改变会用到UNINITIALIZED和REGISTERED之间的状态REGISTERING.这些进程有netdev_run_todo进行.参照"切割操作:netdev_

深入理解Linux网络技术内幕——内核基础架构和组件初始化

引导期间的内核选项 Linux允许用户把内核配置选项传给引导记录,再有引导记录传给内核,以便对内核进行调整. start_kernel中调用两次parse_args,用于引导期间配置用户输入数据. parse_param是一个函数,用于解析输入的内核配置选项的参数字符串.字符串的格式为:name_variable=value.寻址特定关键字,并调用对应的函数. 注册关键字: 用宏进行定义: __setup(string, fn) string表示关键字,fn表示关联的处理函数.__setup的宏

《深入理解Linux网络技术内幕》阅读笔记 --- 路由

一.Linux内核中路由相关的主要数据结构 struct fib_result:对路由表查找后返回该结构,它的内容并不是简单的包含下一跳信息,而且包含其他特性,例如策略路由所需的更多参数. struct fib_rule:表示由策略路由在路由流量时选择路由表的规则 struct fib_node:一条路由表项.例如,该数据结构用于存储由route add或ip route add命令添加一条路由时生成的信息. struct fn_zone:一个zone表示子网掩码长度相同的一组路由 struct

深入理解Linux网络技术内幕——协议处理函数

网络帧在进入网络层时,需要区分不同的网络协议进行处理,这就需要涉及协议处理函数. 首先我们从驱动接收到一个数据帧,分析数据帧在协议栈中自下而上的传输流程. 设备驱动程序在接收到一个数据帧时,会将其保存在一个sk_buff缓冲区数据结构,并对其进行初始化. struct sk_buff { ...... __be16 protocol:16; ...... } 在这个缓冲区结构体中,有一个protocol字段,用于标识网络层的协议. 我们知道网络帧在设备驱动程序中处理后,设备驱动程序会调用neti

深入理解Linux网络技术内幕——用户空间与内核空间交互

概述: 内核空间与用户空间经常需要进行交互.举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求. 用户空间与内核有多种交互方式,最常用的有以下四种:通过/proc虚拟文件系统,通过/sys虚拟文件系统,通过ioctl系统调用,通过Netlink socket. 其中编写程序时最常使用ioctl,这四种方式中有两种是通过虚拟文件系统. procfs 与 sysctl procfs挂载/proc  sysctl挂载在/proc/sys(与后面介绍的

深入理解Linux网络技术内幕——中断与网络驱动程序

接收到帧时通知驱动程序 在网络环境中,设备(网卡)接收到一个数据帧时,需要通知驱动程序进行处理.有一下几种通知机制: 轮询: 内核不断检查设备是否有话要说.(比较耗资源,但在一些情况下却是最佳方法) 中断: 特定事件发生时,设备驱动程序代表内核指示设备产生硬件中断,内核中断其它活动满足设备的需要.多数网络驱动程序使用中断. 中断期间处理多帧: 中断被通知,且驱动程序执行.然后保持帧的接收(载入),直到输入队列达到指定的数目.或者一直做下去知道队列清空.或者经过指定时间. 定时器驱动的中断事件 驱