第五章 通知链
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()
阅读(1115) | 评论(0) | 转发(0) |