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

kzs*_*kzs 17 linux-device-driver linux-kernel

是什么区别module_init,并subsys_initcall在初始化的驱动程序?

saw*_*ust 23

差异与时间有关,或者更确切地说,与执行顺序有关.也就是说,声明为的过程subsys_initcall保证在声明为的过程之前执行module_init.此排序可确保在设备驱动程序尝试利用前者的功能(例如,设备驱动程序注册为子系统设备)之前初始化子系统和平台驱动程序.

每个实际的宏定义取决于是否为(可加载)模块配置了内核.可以在include/linux/init.h中找到这些宏(和其他init宏)的定义

请注意,subsys_initcall()只能由内置(静态链接)模块使用.
module_init可以由内置或可加载模块使用.

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