初始化驱动程序时,module_init和subsys_initcall有什么区别?

18

初始化驱动程序时,module_initsubsys_initcall有何区别?


你查看了手册页吗? - rekire
1
没有该命令的手册页面。 - kzs
1
你可以随时通过源代码进行grep搜索。仅仅查看源代码就可以解释很多问题。 - Jörgen Sigvardsson
谢谢指针 :) - kzs
1个回答

29
区别在于时间,或者更准确地说,执行顺序。即被声明为subsys_initcall的过程保证在被声明为module_init的过程之前执行。这种排序确保子系统和平台驱动在设备驱动尝试使用前初始化(例如,设备驱动作为子系统设备注册)。
每个实际宏定义取决于内核是否配置为(可加载的)模块。这些宏(和其他初始化宏)的定义可以在include/linux/init.h中找到。
请注意,subsys_initcall()只能由内置(静态链接)模块使用。module_init可由内置或可加载模块使用。

3
对于可加载的 *.ko 模块,subsys_initcall() 被映射为与 module_init() 相同,即 device_initcall()。参考:http://lxr.free-electrons.com/source/include/linux/init.h#L298 - TheCodeArtist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接