作者:
GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:
2.6.33
提示
:本文是介绍linux 网络协议栈初始化
!
如果想全面了解linux kernel 组件,不仅需要了解程序都做了些什么,还要了解程序是什么时候被调用的,以及被调用的顺序。有些组件如果可以模块化,当然就可以在加载模块时调用初始化程序就可以了。
但有些组件必须在系统启动时,和kernel一起初始化。
初始化的过程如下
kernel启动时,会执行start_kernel方法,在start_kernel里会初始化很多组件和子系统。
也就是上图的other_init代替了这些初始化过程。start_kernel在执行到最后就会启动init kernel thread。
它会完成剩下的初始化程序。其中在do_initcalls里将会按照顺序执行初始化程序。
执行的顺序如下
#define early_initcall(fn) __define_initcall("early", fn, early) #define pure_initcall(fn) __define_initcall("0", fn, 0) #define core_initcall(fn) __define_initcall("1", fn, 1) #define core_initcall_sync(fn) __define_initcall("1s", fn, 1s) #define postcore_initcall(fn) __define_initcall("2", fn, 2) #define postcore_initcall_sync(fn) __define_initcall("2s", fn, 2s) #define arch_initcall(fn) __define_initcall("3", fn, 3) #define arch_initcall_sync(fn) __define_initcall("3s", fn, 3s) #define subsys_initcall(fn) __define_initcall("4", fn, 4) #define subsys_initcall_sync(fn) __define_initcall("4s", fn, 4s) #define fs_initcall(fn) __define_initcall("5", fn, 5) #define fs_initcall_sync(fn) __define_initcall("5s", fn, 5s) #define rootfs_initcall(fn) __define_initcall("rootfs",fn, rootfs) #define device_initcall(fn) __define_initcall("6", fn, 6) #define device_initcall_sync(fn) __define_initcall("6s", fn, 6s) #define late_initcall(fn) __define_initcall("7", fn, 7) #define late_initcall_sync(fn) __define_initcall("7s", fn, 7s) |
网络组件都初始化了些什么,初始化的顺序又是什么呢?
看看网络部分的初始化注册了些什么。
pure_initcall(net_ns_init); //net/core/net_namespace.c core_initcall(sock_init); //net/socket.c core_initcall(net_inuse_init); //net/core/sock.c core_initcall(netpoll_init); //net/core/netpoll.c core_initcall(netlink_proto_init) //net/netlink/af_netlink.c subsys_initcall(net_dev_init) //net/core/dev.c subsys_initcall(fib_rules_init) //net/core/fib_rules.c subsys_initcall(neigh_init) //net/core/neighbour.c subsys_initcall(proto_init) //net/core/sock.c subsys_initcall(cipso_v4_init) //net/ipv4/cipso_ipv4.c subsys_initcall(ieee80211_init) //net/mac80211/main.c fs_initcall(sysctl_core_init) //net/core/sysctl_net_core.c fs_initcall(inet_init) //net/ipv4/af_inet.c late_initcall_sync(initialize_hashrnd) //net/core/dev.c late_initcall(init_net_drop_monitor) //net/core/drop_monitor.c late_initcall(ip_auto_config) //net/ipv4/ipconfig.c late_initcall(tcp_congestion_default) |