用户空间访问内核空间网络设备

1、设备注册与除名:

NIC可用之前,其相关联的net_device数据结构必须先初始化,添加到内核网络设备数据库、配置并开启。不要把注册/除名以及开启/关闭混淆是十分重要的,这是两种不同的概念。

如果把加载设备驱动程序模块的动作排除的话,注册和除名是独立于用户之外的,是由内核驱动的。仅仅注册的设备还不能运转。开启和关闭设备都需要用户参与。一旦设备已由内核注册,用户就可通过用户命令看到该设备,配置并予以开启。

设备注册之时,加载NIC设备驱动程序。
如果NIC设备驱动程序内建在内核中,则在引导期间初始化。否则,如果以模块加载,就会在运行期间初始化。每当发生初始化时,该驱动程序所控制的所有NIC都会被注册。

对于以模块加载的驱动程序:
当用户插入/拔出可热插拔的NIC设备时,内核会通知其驱动程序,驱动程序收到通知时,进行如下处理:插入设备时,注册该设备;拔出设备时,将该设备除名,并且卸载相应的NIC设备驱动程序。
当管理员卸载NIC设备驱动程序时,所有相关联的NIC设备都必须被除名。

2、设备状态变化通知
内核组件和用户空间应用程序可能都想知道何时发生网络设备注册、除名、关闭或者开启事件。事件通知可以通过两种通道进行传送:
方式1:netdev_chain,内核组件可以注册此通知链。此链定义在net/core/dev.c中,而对此类事件感兴趣的内核组件可以通过register_netdevice_notifier和unregister_netdevice_notifier分别对该链注册或除名。
方式2:Netlink的RTMGRP_LINK多播群组,用户空间程序可以注册netlink的RTMGRP_LINK多播群组,当设备的状态或配置发生变更时,就会用rtmsg_ifinfo把通知信息传送给Link多播群组RTMGRP_LINK。

3、开启和关闭网络设备
设备一旦注册就可用,但是,除非用户明确的开启,否则还是无法传输和接收数据流。
开始设备函数为dev_open(),如果有定义的话,可以调用dev->open,但是并非所有设备驱动程序都初始化此函数。开启成功后,完成以下处理:
  1)、设置dev->state中的__LINK_STATE_START标识,把设备标识为开启和运行中。
  2)、设置dev->flags中的IFF_UP标识,把设备标识为开启。
  3)、调用dev_activate以初始化由流量控制使用的出口队列规则,然后启动看门狗定时器。
  4)、如果流量控制没有用户配置,就指定默认的FIFO。
  5)、传送NETDEV_UP通知信息给netdev_chain通知链,以通知感兴趣的内核组件,该设备现已开启。

设备关闭成功后,完成以下处理:
  1)、传送NETDEV_GOING_DOWN通知信息给netdev_chain通知链,以通知感兴趣的内核组件该设备即将被关闭。
  2)、调用dev_deactivate以关闭出口队列规则,使得该设备再也无法用于传输,然后因为不再需要,停止看门狗定时器。
  3)、清除dev->state中的__LINK_STATE_START标识,把设备标识为关闭。
  4)、如果一个轮询动作被调度,以读取设备上的入口封包,就要等待该动作完成。
  5)、因为__LINK_STATE_START标识已被清除,该设备上已不能再为其他接收的轮询动作进行调度了,但是在该标志清除前可能有一个轮询动作未决。
  6)、如果有定义,调用dev->stop。
  7)、清除dev->flags中的IFF_UP标识,把设备标识为关闭
  8)、传送NETDEV_DOWN通知链

4、链接状态变化侦测可能导致链接状态变更的一些情况:
  1)、电缆线插入NIC,或者从NIC中拔出。
  2)、电缆线另一端的设备电源关掉或关闭了。这类设备有HUB,桥接器,路由器以及PC NIC等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值