网络模块初始化

网络模块的初始化顺序

系统启动初始化时,一旦进入start_kernel,则说明低级初始化已经完成,接下来是对各种设备和子系统的初始化,网络模块初始化流程的调用关系如下图(图片来自:《Linux内核源码剖析-tcp/ip实现》):

在内核初始化过程中,初始化了很多模块,如图中的中断模块(init_irq)等。最后会启动init内核线程继续执行初始化,完成初始化之后,init内核现成将蜕变成用户进程。有关网络的初始化过程主要由sysctl_init和do_initcalls完成,前者主要完成对sysctl的初始化注册过程,后者的功能相对复杂,不只是对网络模块的初始化,只要运用了initcall技术的模块都会被初始化;

内核模块代码可以静态地连接到内核映像文件中,也可以动态的加载到内核空间中,通常,设备驱动程序和功能扩展模块都是在需要时动态加载的,有些协议族也作为内核模块动态加载,如ipv6、unix协议族等,而作为基本内核模块的ipv4则不能动态加载。

 

优化基于宏的标记

以e100为例,通过宏展开得到以下内容:

module_init(e100_init_module) –>__initcall(e100_init_module)–>device_initcall(e100_init_module)–>__define_initcall(e100_init_module, 6)–>static initcall_t __initcall_e100_init_module6 __used __attribute__((__section__(“.initcall6.init”))) = e100_init_module

 

各个段空间对应的宏

如图(图片来自:《Linux内核源码剖析-tcp/ip实现》):

通过下面的do_init_calls循环调用执行各个段的初始化函数:

 

注:本文中部分内容引用自《Linux内核源码剖析-tcp/ip实现》

本文链接:网络模块初始化

转载声明:转载请注明来源:Linux TCP/IP Stack,谢谢!


发表评论

电子邮件地址不会被公开。 必填项已用*标注