深入理解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例程。
    关于内核通知表链:由于虚拟设备是建立在真实设备之上的,真实设备的变化会影响到虚拟设备。
















    

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。