我也不评论什么了,引用AngelFalls的《Linux的TCP/IP协议栈阅读笔记》 中的一段话: 显然就是根据每个block的优先级把这个block排列在一个block的链表里 面,在notifier_chain_register函数里面我们可以发现这个链表是 netdev_chain。实际上这个链表的作用就是在每个interface打开,关闭 状态改变或者外界调用相应的ioctl的时候通知这个链表上面的所有相关 的设备,而每一个协议都调用register_netdevice_notifier注册了一个 netdev_notifier的结构体,这样就可以在interface改变的时候得到通知 了(通过调用每个notifier_call函数)。 register_netdevice_notifier注册了一个是notifier_block的结构体, 可能当时是AngelFalls笔误吧 struct notifier_block * netdev_chain | | | struct notifier_block | packet_notifier | +------------+ +->| | |packet_notif| struct notifier_block |ier() | ip_netdev_notifier |------------| +----------+ | |--->|inetdev_ev| | | |ent() | struct notifier_block |------------| | | fib_rules_notifier | | |----------| +------------+ | 0 | | |----->|fib_rules_e | | | | | |vent() | struct +------------+ |----------| | | notifier_block | 0 | |----------- | fib_netdev_netifier | | | | +-------------+ +----------+ | |--->|fib_netdev_e | | | |vent() | |---------- | | | | | |------------ | | 0 | | | | | | | +------------+ | NULL | | | | ---------- | | | | | | 0 | | | +-------------+