Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660612
  • 博文数量: 186
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2117
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(186)

文章存档

2024年(2)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2015-07-30 19:09:56

第五章 通知链
        linux内核为了及时响应某些到来的事件, 采取通知链的方式来执行指定的函数. 每个事件都对应一个通知节点, 内核中的notifier_block就是通知链的节点的结构定义
        struct notifier_block {
            int (*notifier_call)(struct notifier_block *, unsigned long, void *);
            struct notifier_block* next;
            int priority;
        };
5.1 设备通知链节点的挂入
        devinet_init()函数调用register_netdevice_notifier()将节点结构ip_netdev_notifier挂入内核的设备通知链netdev_chain队列
        inet_init()-->ip_init()-->ip_rt_init()-->devinet_init()-->register_netdevice_notifier()-->raw_notifier_chain_register()
                                                                                                                                      -->inet_dev_event()
        raw_notifier_chain_register()将ip_netdev_notifier通知链挂入到netdev_chain中
        notifier_call挂入的是inet_dev_event()函数. inet_dev_event()具体执行相关动作.

5.2 地址通知链节点的挂入
        inet_init()-->ip_init()-->ip_rt_init()-->ip_fib_init()-->register_inetaddr_notifier()
        register_inetaddr_notifier()注册地址通知链节点fib_inetaddr_notifier
5.3 通知链的调用和执行
        内核中有一个专门调用通知链函数notifier_call_chain(). 以DM9000网卡驱动分析达到此函数的过程. 函数调用过程如下:
        dm9000_probe()-->register_netdev()-->register_netdevice()-->call_netdevice_notifiers()-->raw_notifier_call_chain()->__raw_notifier_call_chain()-->notifier_call_chain()
       另一条调用路径:
        ioctl()-->sys_ioctl()-->do_vfs_ioctl()-->vfs_ioctl()-->sock_ioctl()-->inet_ioctl()-->devinet_ioctl()-->inet_set_ifa()-->__inet_insert_ifa()-->__blocking_notifier_call_chain()-->notifier_call_chain()
阅读(1083) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~