late_initcall()与module_init()
2018年05月22日 22:02:05 wang_ivan 阅读数:590
内核初始化的模块(当它们静态链接到内核时)的init例程被包装在一个initcall()宏中,该宏指示应该在启动顺序中运行它们的时间。
请参阅包含文件:include / linux / init.h以获取宏列表及其排序。
这里指定的顺序是:
- early_initcall
- pure_initcall
- core_initcall
- postcore_initcall
- arch_initcall
- subsys_initcall
- fs_initcall
- rootfs_initcall
- device_initcall
- late_initcall
其中大多数有一个“initcall_sync()阶段,用于等待该阶段中所有模块初始化例程的完成。宏用于为每个阶段构建一个函数指针表,这些函数指针按顺序调用 do_initcalls()
。
如果使用“module_init()”来封装初始化函数,则默认情况下,initcall()将该调用置于初始化的“设备”阶段。在这个阶段,这些项目按链接顺序排列。这意味着该表由链接器遇到的函数顺序创建。
您可以通过更改哪个initcall宏包装模块初始化函数来将初始化移至较早的阶段,但要小心,因为各个模块之间存在顺序依赖关系。改变初始化顺序(在一个阶段中)的另一种方法是调整内核中模块的链接顺序。